PostgreSQLエラー「psql: could not connect to server: ホストへの経路がありません」の原因と解決方法(iptablesの設定)
あるサーバから、別のサーバのPostgreSQLデータベースにpsql接続を試みた時に、接続に失敗する場合がある。
《例》サーバA(neko/192.168.2.3)からサーバB(nobuneko/192.168.2.4)のPostgreSQLデータベースにpsql接続を試みた場合
1)psql -U postgres -h 192.168.2.4で接続できないことを確認
[root@neko ~]# psql -U postgres -h 192.168.2.4
psql: could not connect to server: ホストへの経路がありません
Is the server running on host "192.168.2.4" and accepting
TCP/IP connections on port 5432?
2)/var/lib/pgsql/data/postgresql.confのlisten_addressesに*(アスタリスク)が設定されていることを確認
[root@nobuneko ~]# cd /var/lib/pgsql/data
[root@nobuneko data]# cat postgresql.conf | grep listen
listen_addresses = '*' # what IP address(es) to listen on;
※listen_addressesに*(アスタリスク)が設定されているので、IPアドレスによる接続制限がないことを確認。
3)/var/lib/pgsql/data/pg_hba.confでの設定内容を確認。
[root@nobuneko data]# vi pg_hba.conf
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 192.168.2.0/24 trust
# IPv6 local connections:
host all all ::1/128 ident
※接続元サーバが所属するネットワーク(「192.168.2.0/24」)の接続元が許可されていることを確認。
4)SELinuxが無効(Disabled)になっていることを確認
[root@nobuneko ~]# getenforce
Disabled
念のため、SELinuxの設定ファイルも確認。
[root@nobuneko ~]# cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
通常であれば、上記1)〜4)の設定のどこかに問題があり、それらの設定を変更することで問題は解決するのだが、上記だけでは解決しない場合は、iptablesの設定も確認する。
5)iptablesの設定を確認
[root@nobuneko ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@nobuneko ~]# vi /etc/sysconfig/iptables
※SSH接続で使用するTCP 22番ポートは許可されているが、psql接続で使用するTCP 5432番ポートは許可されていないことを確認。
psql接続で使用するTCP 5432番ポートを許可する設定
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
を追記する。
[root@nobuneko ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
※iptablesを再起動し、設定を反映させる。
[root@nobuneko ~]# /etc/rc.d/init.d/iptables restart
iptables: ファイアウォールルールを消去中: [ OK ]
iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
iptables: モジュールを取り外し中: [ OK ]
iptables: ファイアウォールルールを適用中: [ OK ]
psql接続ができない原因がiptablesの設定だった場合は、psqlが使用するポート番号を許可し、iptablesを再起動すれば解決する。
《注》今回例に挙げたPostgreSQL 8.4.7は、CentOS 6.0で、yumでPostgreSQLをパッケージインストールしたもの。