2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

18.11. 使用 SSH 隧道保護 TCP/IP 連線 #

可以使用 SSH 來加密客戶端和 PostgreSQL 伺服器之間的網路連線。正確配置後,即使對於不支援 SSL 的客戶端,也能提供足夠安全可靠的網路連線。

首先,請確保 SSH 伺服器與 PostgreSQL 伺服器執行在同一臺機器上,並且您可以透過 ssh 以某個使用者身份登入。然後,您就可以建立到遠端伺服器的安全隧道。安全隧道會在本地埠上監聽,並將所有流量轉發到遠端機器上的某個埠。傳送到遠端埠的流量可以到達其 localhost 地址,或者如果需要,可以到達其他繫結地址;它不會顯示為來自您的本地機器。此命令將建立一個從客戶端機器到遠端機器 foo.com 的安全隧道。

ssh -L 63333:localhost:5432 joe@foo.com

-L 引數中,第一個數字 63333 是隧道的本地埠號;它可以是任何未使用的埠。(IANA 將埠 49152 至 65535 保留供私有使用。)其後的名稱或 IP 地址是您要連線到的遠端繫結地址,即 localhost,這是預設值。第二個數字 5432 是隧道的遠端端,例如您的資料庫伺服器使用的埠號。要使用此隧道連線到資料庫伺服器,您需要連線到本地機器上的 63333 埠。

psql -h localhost -p 63333 postgres

對於資料庫伺服器來說,它會認為您是 foo.com 上的使用者 joe,連線到 localhost 繫結地址,並且它將使用為該使用者到該繫結地址連線配置的任何身份驗證過程。請注意,伺服器不會認為連線是 SSL 加密的,因為實際上在 SSH 伺服器和 PostgreSQL 伺服器之間並沒有加密。由於它們在同一臺機器上,這不應該構成額外的安全風險。

為了使隧道設定成功,您必須允許以 joe@foo.com 的身份透過 ssh 連線,就像您嘗試使用 ssh 建立終端會話一樣。

您也可以設定埠轉發,如下所示:

ssh -L 63333:foo.com:5432 joe@foo.com

但是,這樣資料庫伺服器會將連線視為透過其 foo.com 繫結地址傳入,而該地址並未透過預設設定 listen_addresses = 'localhost' 開啟。這通常不是您想要的。

如果您必須透過某個登入主機“跳躍”到資料庫伺服器,一種可能的設定如下所示:

ssh -L 63333:db.foo.com:5432 joe@shell.foo.com

請注意,透過這種方式,從 shell.foo.comdb.foo.com 的連線不會被 SSH 隧道加密。當網路在各種方式下受到限制時,SSH 提供了相當多的配置可能性。有關詳細資訊,請參閱 SSH 文件。

提示

還有其他一些應用程式可以提供類似於上述過程的安全隧道。

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處,或需要進一步澄清之處,請使用 此表單 報告文件問題。