※この記事にはアフィリエイト広告(プロモーション)が含まれます。
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に外部から接続できない」で扱っています。