PostgreSQLポート番号完全ガイド:設定から変更、トラブル解決まで徹底解説

データベース・SQL

「PostgreSQLに接続できない…ポート番号が原因かも?」 「複数のPostgreSQLを同じサーバーで動かしたい」 「セキュリティのためにデフォルトポートを変更したい」

PostgreSQLを使い始めると、必ず出会うのが「ポート番号」の問題です。

ポート番号は、データベースへの「入口の番号」のようなもの。マンションの部屋番号と同じで、正しい番号を知らないと、目的地にたどり着けません。特に、ファイアウォールやネットワーク設定が絡むと、ちょっとした設定ミスで接続できなくなることも。

この記事では、PostgreSQLのポート番号について、基本から応用まですべてを解説します。デフォルトの5432番から始めて、変更方法、複数インスタンスの管理、セキュリティ対策まで、実践的な知識を身につけましょう!

スポンサーリンク
  1. PostgreSQLのデフォルトポート番号
    1. なぜ5432番なの?
    2. 他のデータベースのポート番号
  2. 現在のポート番号を確認する方法
    1. 方法1:設定ファイルで確認
    2. 方法2:SQLコマンドで確認
    3. 方法3:psqlコマンドで確認
    4. 方法4:システムコマンドで確認
  3. ポート番号の変更方法
    1. postgresql.confでの設定変更
    2. 接続文字列の更新
  4. 複数のPostgreSQLインスタンスを管理
    1. 異なるポートで複数起動
    2. 複数バージョンの共存
    3. pg_ctlでの管理
  5. ファイアウォールとポート開放
    1. UFW(Ubuntu)での設定
    2. firewalld(CentOS/RHEL)での設定
    3. iptablesでの設定
    4. Windowsファイアウォール
  6. pg_hba.confとの連携
    1. ポート番号とアクセス制御
    2. listen_addressesの設定
  7. Dockerでのポート設定
    1. docker-composeでの設定
    2. Dockerコマンドでの起動
  8. セキュリティベストプラクティス
    1. デフォルトポートを使わない
    2. SSHトンネリングの活用
    3. SSL/TLS接続の設定
  9. トラブルシューティング
    1. 「ポートがすでに使用されています」エラー
    2. 接続できない場合のチェックリスト
    3. ポート転送の設定
  10. 監視とログ
    1. ポート接続の監視
    2. 接続ログの設定
  11. よくある質問と回答
    1. Q: ポート番号は何番でも使える?
    2. Q: 同じポートで複数のデータベースは作れる?
    3. Q: ポート変更後、既存アプリが動かない
    4. Q: Dockerコンテナ内のポート変更方法は?
    5. Q: ポートスキャンを防ぐには?
  12. まとめ:ポート番号を理解して安全な運用を

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での設定変更

手順:

  1. 設定ファイルを編集
# 設定ファイルを開く
sudo nano /etc/postgresql/14/main/postgresql.conf

# portの行を探して変更
# 変更前
port = 5432

# 変更後(例:5433に変更)
port = 5433
  1. PostgreSQLを再起動
# systemdを使用(Ubuntu/Debian)
sudo systemctl restart postgresql

# または
sudo service postgresql restart

# macOS(Homebrew)
brew services restart postgresql
  1. 変更を確認
# 新しいポートで接続
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番
  • 変更は簡単だが、影響範囲に注意
  • 複数インスタンスは異なるポートで
  • セキュリティのため標準ポートは避ける
  • ファイアウォール設定を忘れずに

運用のベストプラクティス:

  1. 本番環境ではデフォルトポートを避ける
  2. ファイアウォールで適切に制限
  3. 可能ならSSHトンネルやVPN経由
  4. 接続ログを監視
  5. ドキュメント化を忘れずに

ポート番号の設定は簡単ですが、ネットワーク全体の設計に影響します。この記事を参考に、セキュアで管理しやすい環境を構築してください。

PostgreSQLのポート設定をマスターすれば、複雑な環境でも自信を持って対応できるようになります。さあ、あなたの環境に最適な設定を見つけましょう!

コメント

タイトルとURLをコピーしました