Linux

無法從 9.4 客戶端連接到 postgresql 9.6 伺服器

  • December 31, 2016

眼鏡

伺服器

  • 環境: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序列均無濟於事。我不確定為什麼映射iptablesreboot. 隨意發表評論。

最後,問題不在於 postgresql 或我的設置,而是伺服器端路由表的問題。

我希望這個答案能幫助那些在類似問題上苦苦掙扎的人。即使路由器設置看起來很好,也不意味著它很好。

我希望您有防火牆阻止埠 5432 上的傳入連接。

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