PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 17. 服务器设置和操作 | 下一页

# 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文档获取详情。

> 提示: 还有几种不同的产品可以提供安全的通道，所使用的过程类似我们刚刚描述的过程。

上一页 | 起始页 | 下一页
用 SSL 进行安全的 TCP/IP 连接 | 上一级 | 在Windows上注册事件日志