如何在 Linux 中创建 SSH 隧道或端口转发
SSH 隧道(也称为 SSH 端口转发)只是通过 SSH 将本地网络流量路由到远程主机。这意味着您的所有连接都使用加密进行保护。它提供了一种设置基本VPN(虚拟专用网络)的简单方法,对于通过不安全的公共网络(例如互联网)连接到专用网络非常有用。
您还可以用于通过安全隧道将 NAT 和防火墙后面的本地服务器暴露到 Internet,如 ngrok 中实现的那样。
SSH 会话默认允许隧道网络连接,并且 SSH 端口转发分为三种类型:本地、远程和动态 端口转发。
在本文中,我们将演示如何在 Linux 中快速轻松地设置 SSH 隧道或不同类型的端口转发。
测试环境:
出于本文的目的,我们使用以下设置:
- 本地主机:192.168.43.31
- 远程主机:Linode CentOS 7 VPS,主机名为server1.example.com。
通常,您可以使用 SSH 安全地连接到远程服务器,如下所示。在此示例中,我在本地和远程主机之间配置了无密码 SSH 登录,因此它没有要求用户 admin 的密码。
ssh [email
本地 SSH 端口转发
这种类型的端口转发允许您从本地计算机连接到远程服务器。假设您位于限制性防火墙后面或被传出防火墙阻止访问远程服务器上端口 3000 上运行的应用程序。
您可以转发本地端口(例如 8080),然后使用该端口在本地访问应用程序,如下所示。 -L
标志定义转发到远程主机的端口和远程端口。
ssh [email -L 8080:server1.example.com:3000
添加 -N
标志意味着不执行远程命令,在这种情况下您将不会获得 shell。
ssh -N [email -L 8080:server1.example.com:3000
-f
开关指示 ssh 在后台运行。
ssh -f -N [email -L 8080:server1.example.com:3000
现在,在本地计算机上打开浏览器,无需使用地址 server1.example.com:3000 访问远程应用程序,您只需使用 localhost:8080
或192.168.43.31:8080
,如下图所示。
远程 SSH 端口转发
远程端口转发允许您从远程计算机连接到本地计算机。默认情况下,SSH 不允许远程端口转发。您可以使用远程主机上 SSHD 主配置文件 /etc/ssh/sshd_config 中的 GatewayPorts 指令来启用此功能。
使用您最喜欢的命令行编辑器打开文件进行编辑。
sudo vim /etc/ssh/sshd_config
查找所需的指令,取消注释,并将其值设置为 yes,如屏幕截图所示。
GatewayPorts yes
保存更改并退出。接下来,您需要重新启动 sshd 以应用您最近所做的更改。
sudo systemctl restart sshd
OR
sudo service sshd restart
接下来运行以下命令将远程计算机上的端口 5000 转发到本地计算机上的端口 3000。
ssh -f -N [email -R 5000:localhost:3000
一旦您了解了这种隧道方法,您就可以轻松、安全地将本地开发服务器(尤其是在 NAT 和防火墙后面)通过安全隧道暴露到 Internet。 Ngrok、pagekite、localtunnel 等隧道和许多其他隧道的工作方式类似。
动态 SSH 端口转发
这是第三种端口转发。与允许与单个端口进行通信的本地和远程端口转发不同,它使得跨一系列端口的全方位 TCP 通信成为可能。默认情况下,动态端口转发将您的计算机设置为侦听端口 1080 的 SOCKS 代理服务器。
对于初学者来说,SOCKS 是一种 Internet 协议,它定义客户端如何通过代理服务器(在本例中为 SSH)连接到服务器。您可以使用-D选项启用动态端口转发。
以下命令将在端口 1080 上启动 SOCKS 代理,允许您连接到远程主机。
ssh -f -N -D 1080 [email
从现在开始,您可以通过编辑应用程序的设置并将其配置为使用它来连接到远程服务器,从而使计算机上的应用程序使用此 SSH 代理服务器。请注意,关闭 SSH 会话后,SOCKS 代理将停止工作。
另请阅读:关闭 SSH 后保持远程 SSH 会话运行的 5 种方法
概括
在本文中,我们解释了从一台计算机到另一台计算机的各种类型的端口转发,用于通过安全 SSH 连接传输流量。这是 SSH 的众多用途之一。您可以通过下面的反馈表将您的声音添加到本指南中。
注意:SSH端口转发有一些相当大的缺点,它可能被滥用:它可以用来绕过网络监控和流量过滤程序(或防火墙)。攻击者可以利用它进行恶意活动。在下一篇文章中,我们将展示如何禁用 SSH 本地端口转发。保持联系!