Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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

对于数据库服务器,它会显示您是连接到 localhost 绑定地址的 foo.com 主机上的用户 joe,它将使用为该用户连接到该绑定地址进行配置的任何身份验证过程。请注意,服务器不会认为连接已通过 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]

注意,通过这种方法,从 shell.foo.comdb.foo.com 的连接不会通过 SSH 隧道进行加密。当网络以多种方式受到限制时,SSH 会提供相当多的配置选项。有关详细信息,请参阅 SSH 文档。

提示

还存在多个其他应用程序,它们可以使用类似于刚描述的概念的程序提供安全隧道。