可以使用 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.com
到 db.foo.com
的连接不会被 SSH 隧道加密。当网络在各种方式下受到限制时,SSH 提供了相当多的配置可能性。有关详细信息,请参阅 SSH 文档。
还有其他一些应用程序可以提供类似于上述过程的安全隧道。
如果您在文档中发现任何不正确之处、与您对特定功能的体验不符之处,或需要进一步澄清之处,请使用 此表单 报告文档问题。