2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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 [email protected]

-L 参数中的第一个数字 63333 是隧道的本地端口号;它可以是任何未使用的端口。(IANA 将 49152 到 65535 之间的端口保留供私人使用。)此数字后面的名称或 IP 地址是您连接到的远程绑定地址,例如 localhost,这是默认值。第二个数字 5432 是隧道的远程端,例如,您的数据库服务器正在使用的端口号。为了使用此隧道连接到数据库服务器,您需要连接到本地机器上的 63333 端口

psql -h localhost -p 63333 postgres

对数据库服务器来说,它会认为您是 foo.com 上的用户 joe 连接到 localhost 绑定地址,并且它将使用为该用户到该绑定地址的连接配置的任何身份验证过程。请注意,服务器不会认为连接是 SSL 加密的,因为实际上它在 SSH 服务器和 PostgreSQL 服务器之间并没有加密。这不会带来任何额外的安全风险,因为它们在同一台机器上。

为了使隧道设置成功,您必须被允许以 [email protected] 身份通过 ssh 连接,就像您试图使用 ssh 创建终端会话一样。

您还可以将端口转发设置为

ssh -L 63333:foo.com:5432 [email protected]

但是,数据库服务器会将连接视为来自其 foo.com 绑定地址,而默认设置 listen_addresses = 'localhost' 未打开该绑定地址。这通常不是您想要的。

如果您需要通过某个登录主机““跳跃””到数据库服务器,则一种可能的设置可能如下所示

ssh -L 63333:db.foo.com:5432 [email protected]

请注意,这种方式从 shell.foo.comdb.foo.com 的连接不会被 SSH 隧道加密。当网络受到各种限制时,SSH 提供了许多配置可能性。有关详细信息,请参阅 SSH 文档。

提示

还有一些其他应用程序可以使用类似于刚刚描述的程序提供安全隧道。

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表格 报告文档问题。