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をパッケージインストールしたもの。

前へ

PostgreSQLエラー「/var/lib/pgsql/data is missing」の原因と解決方法

次へ

PostgreSQLエラー「createdb: データベースの生成に失敗しました: ERROR: 符号化方式 EUC_JP がロケール ja_JP.UTF-8 に合いません」の原因と解決方法