Linux
無法從 9.4 客戶端連接到 postgresql 9.6 伺服器
眼鏡
伺服器
- 環境:FreeBSD(FreeNAS 監獄)
- PostgreSQL 版本:9.4
- 監聽地址:’*'
- 監聽埠:8096
- pg_hba.conf 條目:host all all 0.0.0.0/0 md5
客戶
- 環境:Linux Ubuntu 16.0.4 LTS
- PostgreSQL 版本:9.6
問題
我正在嘗試將我公司的數據庫託管在員工可以遠端訪問的伺服器上。員工環境在 Linux 風格和 Windows 之間會有所不同。我的測試環境是 Linux 客戶端。到目前為止,我一直無法成功地將客戶端連接到伺服器。
我試過的
我創建了一個 postgresql 密碼文件“.pgpass”,並以 .pgpass 格式輸入了相關資訊
host:port:database:username:password
。當我psql -h host -p port -U username database
從客戶端執行時,我收到超時錯誤。但是,當我在伺服器上執行相同的命令時,它會提示我輸入密碼並且我已連接到我的數據庫。問題
我在這裡做錯了什麼?我錯過了一個步驟,還是不同版本的 postgresql 有問題?問題是否在於 Linux 和 BSD 環境之間的差異?
- 編輯 -
確切的錯誤資訊
psql: could not connect to server: Connection timed out Is the server running on host "host.domain.com" (###.###.###.###) and accepting TCP/IP connections on port [port]?
pg_hba.conf
# TYPE DATABASE USER 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 # IPv6 local connections: host all all ::1/128 trust # IPv4 remote connections: host all all 0.0.0.0/0 md5
問題最終成為伺服器端路由器路由表的問題。GUI 顯示了應有的一切,埠被報告為打開,並指向 postgresql 伺服器。
解決方案
我通過 telnet 連接到伺服器端路由器並手動設置路由表並強制重啟。
連接到路由器後,我發出以下命令:
iptables -t nat -I PREROUTING -p tcp --dport <PORT> -j DNAT --to <SERVER_IP>:<SERVER_PORT> iptables -I FORWARD -p tcp -d <SERVER_IP> --dport <SERVER_PORT> -j ACCEPT reboot
我承認通常
reboot
會撤消前兩個命令的效果。但是,這在我的情況下有效。在執行iptables
命令之前,我嘗試了許多reboot
序列均無濟於事。我不確定為什麼映射iptables
在reboot
. 隨意發表評論。最後,問題不在於 postgresql 或我的設置,而是伺服器端路由表的問題。
我希望這個答案能幫助那些在類似問題上苦苦掙扎的人。即使路由器設置看起來很好,也不意味著它很好。
我希望您有防火牆阻止埠 5432 上的傳入連接。