CentOS 6 和 PostgreSQL - 無法連接到埠
解決方案:事實證明 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 關閉