🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 17.10\. 用SSH隧道进行安全 TCP/IP 连接 使用SSH对PostgreSQL 服务器和客户端之间的网络连接进行加密是可能的。经过适当处理后, 这样做可以获得一个足够安全的网络连接。即使是没有 SSL 的客户端上也如此。 首先确认SSH正在和PostgreSQL 服务器的同一台机器上正确地运行,而且你可以通过某个用户用`ssh`登录。 然后你可以用下面这样的命令从客户端的机器上建立一个安全通道: ``` ssh -L 63333:localhost:5432 joe@foo.com ``` `-L`参数的第一个数字(63333)是你这端通道的端口号,可以是任何未使用的端口。 (IANA提供端口49152到65535位私人使用。)第二个数字(5432)是通道的远端, 也就是服务器使用的端口号。在两个端口号之间的名称或者 IP 地址是你准备连接的数据库服务器, 在例子中是`foo.com`。为了使用这个通道与数据库服务器连接, 你在本机于端口63333连接: ``` psql -h localhost -p 63333 postgres ``` 对于数据库服务器而言,在这种情况下,它会把你当做主机`foo.com` 连接到`localhost`的真正的用户`joe`, 并且使用为这个用户和主机设置的认证手段进行认证。请注意,服务器不会认为连接是 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文档获取详情。 > **Tip:** 还有几种不同的产品可以提供安全的通道,所使用的过程类似我们刚刚描述的过程。