Skip to content

19.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

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

若要使隧道设置成功,您必须被允许作为[[email protected]](/cdn-cgi/l/email-protection)通过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 文档。

提示

还有其他几个应用程序可以使用与刚才描述的概念类似的过程提供安全隧道。