18.10. 使用 SSH 隧道的安全 TCP/IP 连接

可以使用 SSH 加密 Client 端和 PostgreSQL 服务器之间的网络连接。正确完成后,即使没有 SSL 的 Client 端也可以提供足够安全的网络连接。

首先,请确保 SSH 服务器与 PostgreSQL 服务器在同一台计算机上正常运行,并且您可以以某些用户的身份使用ssh登录。然后,您可以从 Client 端计算机使用以下命令构建安全隧道:

ssh -L 63333:localhost:5432 [email protected]

-L参数中的第一个数字 63333 是隧道末端的端口号。它可以是任何未使用的端口。 (IANA 保留端口 49152 至 65535 供私人使用.)第二个数字 5432 是隧道的远程端:服务器正在使用的端口号。端口号之间的名称或 IP 地址是您要连接到的数据库服务器的主机,从登录的主机可以看到,在此示例中为foo.com。为了使用此隧道连接到数据库服务器,请连接到本地计算机上的端口 63333:

psql -h localhost -p 63333 postgres

对于数据库服务器,它将看起来好像您是主机foo.com上的实际用户joe在这种情况下正在连接到localhost,并且它将使用为该用户和主机的连接配置的任何身份验证过程。请注意,服务器不会认为该连接是 SSL 加密的,因为实际上在 SSH 服务器和 PostgreSQL 服务器之间未对连接进行加密。只要它们在同一台计算机上,就不会造成任何额外的安全风险。

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

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

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

但随后数据库服务器将看到连接进入其foo.com接口,默认设置listen_addresses = 'localhost'不会打开该接口。这通常不是您想要的。

如果必须通过某个登录主机“跳到”数据库服务器,则可能的设置如下所示:

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

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

Tip

存在一些其他应用程序,这些应用程序可以使用概念上与刚刚描述的过程类似的过程来提供安全隧道。