Iptables

CentOS 6 和 PostgreSQL - 無法連接到埠

  • June 28, 2017

解決方案:事實證明 iptables 的順序很重要。第一條INPUT規則是REJECT all ...排除ACCEPT規則。所以我不得不iptables -I INPUT 5 ...在第五位使用添加規則,在REJECT規則之前。一個重要的細節:記得在service iptables save之前執行service iptables restart——如果你忘記了保存,它就不會記住新的命令,你必須再做一次。

我在 CentOS 6 虛擬機上安裝了 PostgreSQL。我可以很好地從 VM 主機 SSH 到機器。但是,我無法連接到我的 PostgreSQL 安裝。

一些有用的輸出:

[root@localhost data]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:postgres 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         


[root@localhost data]# ps -u postgres
 PID TTY          TIME CMD
1866 ?        00:00:00 postmaster
1868 ?        00:00:00 postmaster
1870 ?        00:00:00 postmaster
1871 ?        00:00:00 postmaster
1872 ?        00:00:00 postmaster
1873 ?        00:00:00 postmaster
1874 ?        00:00:00 postmaster


[root@localhost data]# netstat -nlp | grep 5432
tcp        0      0 0.0.0.0:5432                0.0.0.0:*                   LISTEN      1866/postmaster     
tcp        0      0 :::5432                     :::*                        LISTEN      1866/postmaster     
unix  2      [ ACC ]     STREAM     LISTENING     13136  1866/postmaster     /tmp/.s.PGSQL.5432


[root@localhost data]# cat pg_hba.conf | grep "host all"
host all all 0.0.0.0/0 trust


[root@localhost data]# cat postgresql.conf | grep listen_
listen_addresses = '*'      # what IP address(es) to listen on;


[root@localhost data]# cat postgresql.conf | grep port
port = 5432             # (change requires restart)
                   # supported by the operating system:
                   #   %r = remote host and port

所以,這就是我所看到的:

  • iptables 設置為接受到埠的傳入連接
  • postgres 正在執行
  • 它正在偵聽 tcp 埠
  • 數據庫設置為接受連接
  • postgres 設置為偵聽所有介面
  • 埠設置正確

但是,如果我執行命令psql -h localhost -U pg_user(其中 pg_user 是我在 postgresql 中創建的使用者),我會收到以下消息:

psql: FATAL:  no pg_hba.conf entry for host "::1", user "pg_user", database "postgres", SSL off

如果在我的 VM 主機上執行psql -h x.x.x.x -U pg_user(其中 xxxx 是虛擬機的 IP 地址),我會得到以下資訊:

psql: could not connect to server: Connection refused
   Is the server running on host "x.x.x.x" and accepting
   TCP/IP connections on port 5432?

此外,我試試這個:

$ nc -zw 3 x.x.x.x 5432
$ nc -zw 3 x.x.x.x 22
Connection to x.x.x.x port 22 [tcp/ssh] succeeded!

所以它在收聽 22 而不是 5432。

我應該從這裡去哪裡?

更新 1

該命令psql -h localhost -U pg_user給出了錯誤。問題是雙重的 - 用psql -h 127.0.0.1 -U pg_user -d postgres工作代替它。首先,我必須指定 postgres 數據庫(預設為與 pg_user 同名的數據庫)。其次,localhost 失敗,您必須指定實際的環回 IP 地址。

其次,這裡是 pg_hba.conf 中的所有條目:

# TYPE    DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local     all             all                                     peer

# IPv4 local connections:
# host    all             all             127.0.0.1/32            ident

# IPv6 local connections:
# host    all             all             ::1/128                 ident

# Allow replication connections from localhost, by a user with the
# replication privilege.
# local   replication     postgres                                peer
# host    replication     postgres        127.0.0.1/32            ident
# host    replication     postgres        ::1/128                 ident

host      all             all             0.0.0.0/0               trust

您有一條規則在您的 postgres 規則之前拒絕所有內容。嘗試:

iptables -I INPUT 1 -p tcp --dport 5432 -j ACCEPT

……看看能不能解決?

看起來你已經在第 3/4 層正確設置了,因為 tcp/5432 在這個盒子上對世界開放。

tcp 0 0 0.0.0.0:5432 0.0.0.0:* 聽

最有可能的是,這將是一個 postgres 權限問題,或者一個可能的 pg 錯誤配置:

psql:致命:主機“::1”、使用者“wiki”、數據庫“pg_user”沒有 pg_hba.conf 條目,SSL 關閉

引用自:https://serverfault.com/questions/556545