PostgreSQL 13 min read

PostgreSQLに外部から接続できない ― listen_addressesとpg_hba.conf、反映されない書き間違い

※この記事にはアフィリエイト広告(プロモーション)が含まれます。

PostgreSQL は、インストールした直後は同じサーバーの中からしか接続できません。別のサーバーから psql -h で接続するには、待ち受けるアドレス(listen_addresses)と、接続を許す相手(pg_hba.conf)の2か所を変えます。

この記事のログは PostgreSQL 18.6(Ubuntu 26.04 の標準パッケージ)で採りました。サーバーの IP は 192.168.0.11、ユーザー app、データベース appdb です。

まず見る(結論)

エラーメッセージで、どこで止まっているかが分かります。

エラー 原因 直す場所
Connection refused そのアドレスで待ち受けていない listen_addresses(再起動が要る)
no pg_hba.conf entry for host ... 接続元に一致する行が無い pg_hba.conf(reload でよい)
pg_hba.conf rejects connection for host ... 先に reject の行に一致した pg_hba.conf の行の順番
password authentication failed for user ... 行には一致した。パスワードが違う パスワード

タイムアウトして何も返らない場合は、PostgreSQL まで届いていません。ファイアウォールやネットワークを見ます。

設定ファイルの場所

場所は OS と入れ方で変わるので、接続できるユーザーで PostgreSQL に聞きます。

sudo -u postgres psql -Atc "SHOW config_file" -c "SHOW hba_file"
/etc/postgresql/18/main/postgresql.conf
/etc/postgresql/18/main/pg_hba.conf

Ubuntu・Debian は /etc/postgresql/<版>/main/ です。Rocky Linux などで dnf から入れた場合はデータディレクトリ(/var/lib/pgsql/data など)の中にあります。

Connection refused:listen_addresses

既定のままサーバーの IP に接続した結果です。

$ psql -h 192.168.0.11 -U app -d appdb
psql: error: connection to server at "192.168.0.11", port 5432 failed: Connection refused
	Is the server running on that host and accepting TCP/IP connections?

listen_addresses の既定値は localhost で、127.0.0.1 にしか接続できません。ss -ltn でも 127.0.0.1:5432 だけが出ます。

postgresql.conf の listen_addresses を変えます。Ubuntu の postgresql.conf には include_dir = 'conf.d' があるので、conf.d/ に別ファイルで置くと元のファイルを触らずに済みます。

# /etc/postgresql/18/main/conf.d/90-listen.conf
listen_addresses = '*'

listen_addresses は再起動しないと変わりません。pg_reload_conf() の後に確かめると、値は localhost のままで pending_restart が t になっていました。

SELECT name, setting, pending_restart FROM pg_settings WHERE name = 'listen_addresses';
listen_addresses|localhost|t

$ sudo systemctl restart postgresql
$ ss -ltn | grep 5432
LISTEN 0      200          0.0.0.0:5432       0.0.0.0:*
LISTEN 0      200             [::]:5432          [::]:*

'*' はすべてのアドレスで待ち受けます。サーバーに複数の IP があって1つに絞りたいときは 'localhost,192.168.0.11' のようにカンマで並べます。

no pg_hba.conf entry:pg_hba.conf

再起動の後に接続すると、エラーが変わります。

$ psql -h 192.168.0.11 -U app -d appdb
psql: error: connection to server at "192.168.0.11", port 5432 failed: FATAL:  no pg_hba.conf entry for host "192.168.0.11", user "app", database "appdb", SSL encryption
connection to server at "192.168.0.11", port 5432 failed: FATAL:  no pg_hba.conf entry for host "192.168.0.11", user "app", database "appdb", no encryption

2行出るのは、psql が SSL で試して断られた後、SSL なしでもう一度試すためです(Ubuntu のパッケージは既定で ssl = on)。どちらも同じ原因です。メッセージの host は接続元の IP で、pg_hba.conf にはこのアドレスを書きます。

既定の pg_hba.conf には、127.0.0.1/32 と ::1/128 からの接続を許す行しかありません。接続元のネットワークを許す行を足します。

# TYPE  DATABASE  USER  ADDRESS           METHOD
host    appdb     app   192.168.0.0/24    scram-sha-256

pg_hba.conf は再起動しなくても、reload で反映されます。

sudo -u postgres psql -c "SELECT pg_reload_conf()"

これで接続できました。この行は appdb にしか一致しません。同じユーザーで postgres データベースに接続すると、また no pg_hba.conf entry for host ... database "postgres" になります。

pg_hba.conf は上から順に見て、最初に一致した行で決まる

許可の行の上に reject の行を入れると、許可の行まで届きません。

host    all       all   192.168.0.11/32   reject
host    appdb     app   192.168.0.0/24    scram-sha-256
FATAL:  pg_hba.conf rejects connection for host "192.168.0.11", user "app", database "appdb", SSL encryption

行を足しても効かないときは、それより上に同じ接続元に一致する行が無いかを見ます。

書き間違いがあると、pg_hba.conf 全体が読み込まれない

認証方式を scram-sha256(ハイフンが1つ足りない)と書いた行を足して reload しました。pg_reload_conf() は t を返し、psql 側にエラーは出ません。

ところがサーバーログにはこう出ていました。

LOG:  received SIGHUP, reloading configuration files
LOG:  invalid authentication method "scram-sha256"
CONTEXT:  line 135 of configuration file "/etc/postgresql/18/main/pg_hba.conf"
LOG:  /etc/postgresql/18/main/pg_hba.conf was not reloaded

読めない行が1行でもあると、そのファイルの変更は1行も反映されず、前の内容のまま動き続けます。pg_reload_conf() の戻り値は「reload の合図を送れたか」で、中身が正しいかは示しません。

reload の前に pg_hba_file_rules ビューを見ると、ファイルの今の中身を解釈した結果が出ます。error 列に何か入っている行があれば、reload しても反映されません。

SELECT line_number, type, database, user_name, address, auth_method, error
  FROM pg_hba_file_rules ORDER BY rule_number NULLS LAST;
 line_number | type  | database | user_name |   address   |  auth_method  |                    error
-------------+-------+----------+-----------+-------------+---------------+----------------------------------------------
 ...
         134 | host  | {appdb}  | {app}     | 192.168.0.0 | scram-sha-256 |
         135 |       |          |           |             |               | invalid authentication method "scram-sha256"

Ubuntu のサーバーログは /var/log/postgresql/postgresql-18-main.log です。pg_hba.conf を変えたら、reload の後、このログの末尾に was not reloaded が出ていないかを確かめます。

接続できた後に確かめる

接続元のアドレスと SSL の有無は、接続した側で確認できます。

SELECT inet_client_addr(), ssl FROM pg_stat_ssl WHERE pid = pg_backend_pid();
 inet_client_addr | ssl
------------------+-----
 192.168.0.11     | t

このログは、サーバー自身から自分の IP(192.168.0.11)宛てに接続して採りました。127.0.0.1 ではなく外向きの IP に向けた接続なので、listen_addresses と pg_hba.conf の判定は別のホストから接続したときと同じです。ファイアウォールの設定は含んでいません。MySQL の場合は「MySQLに外部から接続できない」で扱っています。

PostgreSQL をもっと深く知るための本

PostgreSQL実践入門 ──アーキテクチャ、運用監視、性能改善

技術評論社・2026年2月

アーキテクチャから運用監視・性能改善までを扱う。付録に PostgreSQL 18 の新機能と設定項目の差分がある。

Amazonで見る

[改訂3版]内部構造から学ぶPostgreSQL ―設計・運用計画の鉄則

技術評論社・2022年11月・PostgreSQL 14 ベース

内部構造の理解から、設計と運用計画の立て方を学ぶ。

Amazonで見る

Amazonのアソシエイトとして、FIRE SE は適格販売により収入を得ています。