使用 ssh 创建安全隧道

作者:Mitch Frazier

如果您管理远程服务器或者您有多台计算机,您很可能使用过ssh命令。一个关于ssh的简单描述是它是一个安全的版本telnet,但这就像说保时捷只是一个更好的版本的大众甲壳虫。

其中,ssh命令允许您设置到远程计算机的安全隧道。我经常使用的一个创建隧道的例子是使用 phpmyadmin 查看远程服务器上的数据库,而无需在远程服务器上实际安装 phpmyadmin

为了做到这一点,我只需在我的本地系统上安装 phpmyadmin,然后我使用ssh来创建到我想与之交互的服务器的隧道。这意味着我不需要远程安装 phpmyadmin,如果我管理多个服务器,我也不必维护多个 phpmyadmin 安装。

当然,mysql 本身就具有网络功能,因此也可以在本地系统上设置 phpmyadmin 以直接与远程服务器上的 mysql 通信。但是,出于安全原因,您可能不希望 mysql 直接在公共接口上监听:让它在 localhost 上监听,但不在互联网上监听。

这种隧道类型的本质是启动ssh并告诉它监听本地 TCP/IP 端口,并将它在该端口上看到的任何流量转发到远程侧的特定端口。正常的 mysql 端口是 3306,所以您可以做的是告诉ssh在本地计算机上的端口 3308 上监听,并将该端口转发到远程侧的端口 3306。

例如,如果相关的远程服务器是myserver.example.com您可以在本地系统上运行以下命令来创建如上所述的隧道

ssh -T -N -L 3308:localhost:3306 myserver.example.com

该命令的核心是-L选项,它告诉ssh在本地端口 3308 上监听,然后在远程侧将该端口上的所有流量转发到 localhost:3306。请注意,这里的 localhost 不是指本地系统,而是指在远程侧将内容转发到 哪里,在这种情况下是远程侧的 localhost

The-T命令禁用 tty 的分配,而-N命令禁用在远程侧运行命令(例如您的登录 shell)。这意味着这个ssh实例不会像终端一样工作,它只是用于端口转发。

您可以使用本地系统上 mysql 的命令行界面来测试隧道。您可能需要在命令中指定主机名或地址

$ mysql -P 3308 -u USERNAME -pPASSWORD DATABASE

# OR

$ mysql -h localhost -P 3308 -u USERNAME -pPASSWORD DATABASE

# OR

$ mysql -h 127.0.0.1 -P 3308 -u USERNAME -pPASSWORD DATABASE

如果这有效,那么您的隧道就设置好了。现在您需要做的就是配置 phpmyadmin,我将其作为一个练习留给您,因为这里的重点是隧道而不是 phpmyadmin

这种隧道能力只代表了您可以使用ssh隧道技术做的事情的一部分。例如,假设myserver.example.com实际上是一个防火墙,它保护了系统private.localprivate.local可以从myserver.example.com访问,但不能直接从互联网访问。所以,现在您可以运行

ssh -T -N -L 3308:private.local:3306 myserver.example.com

这里,ssh在本地系统上的端口 3308 上监听,并将数据转发到private.host上的端口 3306,但它是 通过 服务器myserver.example.com来完成的。换句话说,本地端口 3308 上的流量首先被传输到远程系统,然后远程系统将其传输到private.host上的端口 3306。当然,如果private.localmysql 服务器仅在 本地接口上监听,这将不起作用,您需要更复杂的方法。

您可以做的另一种隧道类型是反向隧道:而不是使用-L您可以指定-R以便隧道的监听端在远程侧而不是本地侧。例如,假设 phpmyadmin 安装在myserver.example.com上,并且您想允许使用该 phpmyadmin 安装的人连接到本地系统上运行的 mysql 实例。只需替换-R-L在第一个ssh上面的命令中

ssh -T -N -R 3308:localhost:3306 myserver.example.com

这里远程sshmyserver.example.com的端口 3308 上监听,然后将该连接上的流量转发到本地系统上的端口 3306。请注意,默认情况下ssh仅在远程系统的 localhost 接口上监听,因此如果远程 phpmyadmin 安装是安全的,则您的本地系统也将是安全的。请记住,您仍然从本地系统运行此ssh命令,您不是从服务器运行它(除非您的系统是可路由的,否则您可能无论如何也无法在远程系统上成功执行它)。

为了测试连接,在 远程 系统上,使用与我们上面使用的相同的命令执行命令行 mysql 客户端。这应该连接到您本地计算机上的数据库。再次,phpmyadmin 的配置留给您作为练习。

Mitch Frazier 是 Emerson Electric Co. 的嵌入式系统程序员。自 2000 年代初以来,Mitch 一直是 Linux Journal 的贡献者和朋友。

加载 Disqus 评论