「PostgreSQLに接続できない…ポート番号が原因かも?」 「複数のPostgreSQLを同じサーバーで動かしたい」 「セキュリティのためにデフォルトポートを変更したい」
PostgreSQLを使い始めると、必ず出会うのが「ポート番号」の問題です。
ポート番号は、データベースへの「入口の番号」のようなもの。マンションの部屋番号と同じで、正しい番号を知らないと、目的地にたどり着けません。特に、ファイアウォールやネットワーク設定が絡むと、ちょっとした設定ミスで接続できなくなることも。
この記事では、PostgreSQLのポート番号について、基本から応用まですべてを解説します。デフォルトの5432番から始めて、変更方法、複数インスタンスの管理、セキュリティ対策まで、実践的な知識を身につけましょう!
PostgreSQLのデフォルトポート番号

なぜ5432番なの?
PostgreSQLのデフォルトポート番号は5432です。
豆知識: 5432は「PGDATA」の文字を電話のキーパッドで入力した時の数字…というのは都市伝説で、実際は開発者が適当に決めた番号だそうです。でも、今では世界中で標準として使われています。
他のデータベースのポート番号
主要データベースのデフォルトポート:
- PostgreSQL:5432
- MySQL:3306
- Oracle:1521
- SQL Server:1433
- MongoDB:27017
- Redis:6379
覚えておくと、トラブルシューティングで役立ちます。
現在のポート番号を確認する方法
方法1:設定ファイルで確認
# postgresql.confの場所を確認
sudo -u postgres psql -c "SHOW config_file;"
# 設定ファイルでポート番号を確認
grep "^port" /etc/postgresql/14/main/postgresql.conf
# または
sudo cat /etc/postgresql/14/main/postgresql.conf | grep "^port"
結果例:
port = 5432 # (change requires restart)
方法2:SQLコマンドで確認
-- PostgreSQLに接続後
SHOW port;
-- より詳細な情報
SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name = 'port';
方法3:psqlコマンドで確認
# 接続情報を表示
psql -U postgres -c "\conninfo"
# 結果例
# You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
方法4:システムコマンドで確認
# 実行中のPostgreSQLプロセスを確認(Linux)
sudo netstat -plnt | grep postgres
# または
sudo ss -plnt | grep 5432
# macOSの場合
sudo lsof -i :5432
ポート番号の変更方法
postgresql.confでの設定変更
手順:
- 設定ファイルを編集
# 設定ファイルを開く
sudo nano /etc/postgresql/14/main/postgresql.conf
# portの行を探して変更
# 変更前
port = 5432
# 変更後(例:5433に変更)
port = 5433
- PostgreSQLを再起動
# systemdを使用(Ubuntu/Debian)
sudo systemctl restart postgresql
# または
sudo service postgresql restart
# macOS(Homebrew)
brew services restart postgresql
- 変更を確認
# 新しいポートで接続
psql -p 5433 -U postgres
接続文字列の更新
ポート変更後は、接続文字列も更新が必要です。
# コマンドラインでの接続
psql -h localhost -p 5433 -U postgres -d mydb
# 接続URL形式
postgresql://username:password@localhost:5433/database
# Python(psycopg2)の例
conn = psycopg2.connect(
host="localhost",
port=5433,
database="mydb",
user="postgres",
password="password"
)
# Node.js(pg)の例
const client = new Client({
host: 'localhost',
port: 5433,
database: 'mydb',
user: 'postgres',
password: 'password'
})
複数のPostgreSQLインスタンスを管理
異なるポートで複数起動
同じサーバーで複数のPostgreSQLを動かす場合:
# インスタンス1(本番用)
port = 5432
data_directory = '/var/lib/postgresql/14/main'
# インスタンス2(開発用)
port = 5433
data_directory = '/var/lib/postgresql/14/dev'
# インスタンス3(テスト用)
port = 5434
data_directory = '/var/lib/postgresql/14/test'
複数バージョンの共存
# PostgreSQL 13
/usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -p 5432
# PostgreSQL 14
/usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -p 5433
# PostgreSQL 15
/usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -p 5434
pg_ctlでの管理
# 特定のポートでPostgreSQLを起動
pg_ctl -D /path/to/data -o "-p 5433" start
# 状態確認
pg_ctl -D /path/to/data status
# 停止
pg_ctl -D /path/to/data stop
ファイアウォールとポート開放
UFW(Ubuntu)での設定
# ポート5432を開放
sudo ufw allow 5432/tcp
# 特定のIPアドレスからのみ許可
sudo ufw allow from 192.168.1.0/24 to any port 5432
# ルールの確認
sudo ufw status verbose
# ポートを閉じる
sudo ufw delete allow 5432/tcp
firewalld(CentOS/RHEL)での設定
# ポート開放
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
# サービスとして追加
sudo firewall-cmd --permanent --add-service=postgresql
sudo firewall-cmd --reload
# 確認
sudo firewall-cmd --list-all
iptablesでの設定
# ポート5432を開放
sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
# 特定のIPからのみ許可
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 5432 -j ACCEPT
# 設定を保存(Ubuntu/Debian)
sudo iptables-save > /etc/iptables/rules.v4
Windowsファイアウォール
# PowerShellで実行(管理者権限)
# 受信ルールを追加
New-NetFirewallRule -DisplayName "PostgreSQL" `
-Direction Inbound -Protocol TCP -LocalPort 5432 `
-Action Allow
# 確認
Get-NetFirewallRule -DisplayName "PostgreSQL"
pg_hba.confとの連携
ポート番号とアクセス制御
pg_hba.confファイルで、接続元を制限できます。
# pg_hba.confの編集
sudo nano /etc/postgresql/14/main/pg_hba.conf
# 設定例
# TYPE DATABASE USER ADDRESS METHOD
# ローカル接続(ポート番号関係なし)
local all all peer
# IPv4ローカル接続(すべてのポート)
host all all 127.0.0.1/32 md5
# 特定ネットワークからの接続を許可
host all all 192.168.1.0/24 md5
# インターネットからの接続(危険!)
host all all 0.0.0.0/0 md5
listen_addressesの設定
# postgresql.conf
# デフォルト(ローカルのみ)
listen_addresses = 'localhost'
# すべてのインターフェースで待ち受け
listen_addresses = '*'
# 特定のIPアドレスで待ち受け
listen_addresses = '192.168.1.100,127.0.0.1'
Dockerでのポート設定

docker-composeでの設定
version: '3.8'
services:
postgres:
image: postgres:14
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: mydb
ports:
# ホスト:コンテナ
- "5433:5432" # ホストの5433番をコンテナの5432番にマッピング
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Dockerコマンドでの起動
# ポートマッピングを指定して起動
docker run -d \
--name postgres \
-p 5433:5432 \
-e POSTGRES_PASSWORD=mysecretpassword \
postgres:14
# 複数のコンテナを異なるポートで起動
docker run -d --name pg-prod -p 5432:5432 postgres:14
docker run -d --name pg-dev -p 5433:5432 postgres:14
docker run -d --name pg-test -p 5434:5432 postgres:14
セキュリティベストプラクティス
デフォルトポートを使わない
# セキュリティのため、標準的でないポートを使用
port = 15432 # 例
# よく使われる代替ポート
# 5433, 5434, 15432, 25432, 35432
SSHトンネリングの活用
# SSHトンネルを作成
ssh -L 5432:localhost:5432 user@remote-server
# 別のターミナルで接続
psql -h localhost -p 5432 -U postgres
# バックグラウンドで実行
ssh -fN -L 5432:localhost:5432 user@remote-server
SSL/TLS接続の設定
# postgresql.conf
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
# クライアント側で接続
psql "host=server.example.com port=5432 dbname=mydb user=postgres sslmode=require"
トラブルシューティング
「ポートがすでに使用されています」エラー
# 使用中のポートを確認
sudo lsof -i :5432
# プロセスを特定
ps aux | grep postgres
# 必要に応じてプロセスを終了
sudo kill -9 [PID]
# または、別のポートを使用
port = 5433
接続できない場合のチェックリスト
# 1. PostgreSQLが起動しているか確認
sudo systemctl status postgresql
# 2. ポートが開いているか確認
sudo netstat -plnt | grep 5432
# 3. ファイアウォールを確認
sudo ufw status
sudo iptables -L
# 4. pg_hba.confを確認
cat /etc/postgresql/14/main/pg_hba.conf
# 5. postgresql.confのlisten_addressesを確認
grep listen_addresses /etc/postgresql/14/main/postgresql.conf
# 6. ログを確認
sudo tail -f /var/log/postgresql/postgresql-14-main.log
ポート転送の設定
# ローカルポート転送(開発環境)
ssh -L 5432:db-server:5432 jump-server
# リモートポート転送(本番環境へのアクセス)
ssh -R 5432:localhost:5432 remote-server
# 動的ポート転送(SOCKS プロキシ)
ssh -D 9090 remote-server
監視とログ
ポート接続の監視
-- 現在の接続を確認
SELECT pid, usename, application_name, client_addr, client_port, state
FROM pg_stat_activity
WHERE state = 'active';
-- 接続統計
SELECT datname, numbackends
FROM pg_stat_database
WHERE datname NOT IN ('template0', 'template1');
接続ログの設定
# postgresql.conf
log_connections = on
log_disconnections = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
よくある質問と回答
Q: ポート番号は何番でも使える?
A: 技術的には1-65535が使えますが、1-1023は管理者権限が必要で、49152-65535はエフェメラルポート(一時的な通信用)なので、1024-49151の範囲から選ぶのが安全です。
Q: 同じポートで複数のデータベースは作れる?
A: はい、1つのPostgreSQLインスタンス(1つのポート)で複数のデータベースを管理できます。異なるポートが必要なのは、別々のPostgreSQLインスタンスを起動する場合だけです。
Q: ポート変更後、既存アプリが動かない
A: アプリケーションの接続設定(接続文字列、設定ファイル、環境変数など)をすべて新しいポート番号に更新する必要があります。
Q: Dockerコンテナ内のポート変更方法は?
A: コンテナ内のPostgreSQLは5432のままで、docker runの-pオプションでホスト側のポートをマッピングするのが一般的です。
Q: ポートスキャンを防ぐには?
A: デフォルトポートを変更し、fail2banなどのツールを使用し、pg_hba.confで接続元を制限し、可能ならVPNやSSHトンネル経由でのみアクセスを許可します。
まとめ:ポート番号を理解して安全な運用を
PostgreSQLのポート番号は、データベース接続の基本中の基本です。
重要ポイント:
- デフォルトは5432番
- 変更は簡単だが、影響範囲に注意
- 複数インスタンスは異なるポートで
- セキュリティのため標準ポートは避ける
- ファイアウォール設定を忘れずに
運用のベストプラクティス:
- 本番環境ではデフォルトポートを避ける
- ファイアウォールで適切に制限
- 可能ならSSHトンネルやVPN経由
- 接続ログを監視
- ドキュメント化を忘れずに
ポート番号の設定は簡単ですが、ネットワーク全体の設計に影響します。この記事を参考に、セキュアで管理しやすい環境を構築してください。
PostgreSQLのポート設定をマスターすれば、複雑な環境でも自信を持って対応できるようになります。さあ、あなたの環境に最適な設定を見つけましょう!
コメント