如何配置 SSH 端口转发
SSH隧道或SSH端口转发是一种在客户端和服务器计算机之间创建加密的SSH连接的方法,通过该连接可以中继服务端口
SSH 隧道(SSH tunneling)或称 SSH 端口转发(SSH port forwarding),是一种在客户端和服务器之间创建加密 SSH 连接的方法,通过这种连接可以中继(relay)服务端口。
SSH 转发功能非常实用,可用于传输那些使用未加密协议(如 VNC 或 FTP)的服务的网络数据、访问受地理位置限制的内容,或绕过中间的防火墙。
基本上,你可以转发任何 TCP 端口,并通过一个安全的 SSH 连接来传输流量。SSH 端口转发分为三种类型:
- 本地端口转发(Local Port Forwarding):将来自客户端主机的连接转发到 SSH 服务器主机,然后再转发到目标主机的端口。
- 远程端口转发(Remote Port Forwarding):将来自服务器主机的端口转发到客户端主机,然后再转发到目标主机的端口。
- 动态端口转发(Dynamic Port Forwarding):创建一个 SOCKS 代理服务器,允许在一系列端口上进行通信。
本教程将解释如何设置本地、远程和动态的加密 SSH 隧道。
本地端口转发
本地端口转发允许你将本地(SSH 客户端)机器上的一个端口转发到远程(SSH 服务器)机器上的一个端口,然后该连接再被转发到目标机器的指定端口。
在这种转发类型中,SSH 客户端会监听一个给定的端口,并将任何发送到该端口的连接,通过隧道转发到远程 SSH 服务器的指定端口,SSH 服务器接着会连接到目标机器的端口。目标机器可以是远程 SSH 服务器本身,也可以是任何其他机器。
本地端口转发主要用于连接到内部网络中的远程服务,例如数据库或 VNC 服务器。
在 Linux、macOS 和其他类 Unix 系统中,要创建本地端口转发,需要向 ssh
客户端传递 -L
选项:
ssh -L [本地IP:]本地端口:目标地址:目标端口 [用户@]SSH服务器地址
所使用的选项如下:
[本地IP:]本地端口
- 本地机器的 IP 地址和端口号。如果省略本地IP
,SSH 客户端将绑定在 localhost 上。目标地址:目标端口
- 目标机器的 IP 或主机名以及端口号。[用户@]服务器IP
- 远程 SSH 用户和服务器的 IP 地址。
你可以使用任何大于 1024
的端口号作为 本地端口
。小于 1024
的端口号是特权端口,只能由 root 用户使用。如果你的 SSH 服务器监听的端口不是 22(默认端口),请使用 -p [端口号]
选项。
目标主机名必须能从 SSH 服务器上解析。
假设你在内部(私有)网络中有一台 MySQL 数据库服务器,运行在机器 db001.host
的 3306 端口,这台机器可以从 pub001.host
这台机器访问。现在,你希望使用本地机器的 MySQL 客户端连接到该数据库服务器。为此,你可以使用以下命令转发连接:
ssh -L 3336:db001.host:3306 用户名@pub001.host
运行该命令后,系统会提示你输入远程 SSH 用户的密码。输入密码后,你将登录到远程服务器,SSH 隧道便建立成功。更好的做法是设置基于 SSH 密钥的认证,这样无需输入密码即可连接服务器。
现在,如果你将本地机器的数据库客户端指向 127.0.0.1:3336
,连接将通过作为中间服务器的 pub001.host
机器,被转发到 db001.host:3306
的 MySQL 服务器。
你可以在一个 ssh 命令中将多个端口转发到多个目标。例如,你还有另一台 MySQL 数据库服务器运行在机器 db002.host
上,并且你想从本地客户端同时连接到这两台服务器,你可以运行:
ssh -L 3336:db001.host:3306 3337:db002.host:3306 用户名@pub001.host
要连接到第二台服务器,你应使用 127.0.0.1:3337
。
当目标主机与 SSH 服务器相同时,你可以使用 localhost
,而无需指定目标主机的 IP 或主机名。
假设你需要通过 VNC 连接到一台远程机器,而 VNC 服务与 SSH 服务运行在同一台服务器上,并且无法从外部访问。你可以使用以下命令:
ssh -L 5901:127.0.0.1:5901 -N -f 用户名@remote.host
-f
选项告诉 ssh
命令在后台运行,-N
选项表示不执行远程命令。我们使用 localhost
是因为 VNC 和 SSH 服务器运行在同一台主机上。
如果你在设置隧道时遇到问题,请检查你的远程 SSH 服务器配置,确保 AllowTcpForwarding
没有被设置为 no
。默认情况下,转发是允许的。
远程端口转发
远程端口转发与本地端口转发相反。它允许你将远程(SSH 服务器)机器上的一个端口转发到本地(SSH 客户端)机器上的一个端口,然后再转发到目标机器的指定端口。
在这种转发类型中,SSH 服务器会监听一个给定的端口,并将任何发送到该端口的连接,通过隧道转发到本地 SSH 客户端的指定端口,SSH 客户端接着会连接到目标机器的端口。目标机器可以是本地机器或任何其他机器。
在 Linux、macOS 和其他类 Unix 系统中,要创建远程端口转发,需要向 ssh
客户端传递 -R
选项:
ssh -R [远程IP:]远程端口:目标地址:目标端口 [用户@]SSH服务器地址
所使用的选项如下:
[远程IP:]远程端口
- 远程 SSH 服务器上的 IP 和端口号。一个空的远程IP
意味着远程 SSH 服务器将在所有网络接口上绑定。目标地址:目标端口
- 目标机器的 IP 或主机名以及端口号。[用户@]服务器IP
- 远程 SSH 用户和服务器的 IP 地址。
远程端口转发主要用于将内部服务开放给外部人员访问。
假设你正在本地机器上开发一个 Web 应用,并想向你的同事展示预览。你没有公网 IP,所以你的同事无法通过互联网访问该应用。
如果你可以访问一台远程 SSH 服务器,你可以设置一个远程端口转发,如下所示:
ssh -R 8080:127.0.0.1:3000 -N -f 用户名@remote.host
上述命令将使 SSH 服务器监听 8080
端口,并将所有来自此端口的流量通过隧道转发到你本地机器的 3000
端口。
现在,你的同事可以在他/她的浏览器中输入 ssh服务器的IP地址:8080
,就可以预览你出色的应用程序了。
如果你在设置远程端口转发时遇到问题,请确保远程 SSH 服务器配置中的 GatewayPorts
设置为 yes
。
动态端口转发
动态端口转发允许你在本地(SSH 客户端)机器上创建一个套接字(socket),该套接字作为一个 SOCKS 代理服务器。当客户端连接到此端口时,连接将被转发到远程(SSH 服务器)机器,然后由该机器再转发到目标机器的一个动态端口。
通过这种方式,所有使用该 SOCKS 代理的应用程序都会连接到 SSH 服务器,然后服务器会将所有流量转发到其最终目的地。
在 Linux、macOS 和其他类 Unix 系统中,要创建动态端口转发(SOCKS),需要向 ssh
客户端传递 -D
选项:
ssh -D [本地IP:]本地端口 [用户@]SSH服务器地址
所使用的选项如下:
[本地IP:]本地端口
- 本地机器的 IP 地址和端口号。如果省略本地IP
,SSH 客户端将绑定在 localhost 上。[用户@]服务器IP
- 远程 SSH 用户和服务器的 IP 地址。
动态端口转发的一个典型应用场景是通过 SSH 服务器来传输网页浏览器的流量。
以下命令将在 9090
端口上创建一个 SOCKS 隧道:
ssh -D 9090 -N -f 用户名@remote.host
隧道建立后,你可以配置你的应用程序来使用它。这篇文章解释如何配置 Firefox 和 Google Chrome 浏览器以使用 SOCKS 代理。
对于每个希望通过隧道传输流量的应用程序,都必须单独配置端口转发。
Windows 设置 SSH 隧道
Windows 用户可以使用 PuTTY SSH 客户端来创建 SSH 隧道。你可以在这里下载 PuTTY。
启动 Putty,并在 Host name (or IP address)
(主机名或 IP 地址)字段中输入 SSH 服务器的 IP 地址。

在 Connection
(连接)菜单下,展开 SSH
并选择 Tunnels
(隧道)。勾选 Local
(本地)单选按钮以设置本地转发,Remote
(远程)用于远程转发,Dynamic
(动态)用于动态端口转发。
- 设置本地转发时,在
Source Port
(源端口)字段中输入本地转发端口,在Destination
(目标)字段中输入目标主机和 IP,例如localhost:5901
。 - 对于远程端口转发,在
Source Port
(源端口)字段中输入远程 SSH 服务器的转发端口,在Destination
(目标)字段中输入目标主机和 IP,例如localhost:3000
。 - 如果设置动态转发,只需在
Source Port
(源端口)字段中输入本地 SOCKS 端口。

点击 Add
(添加)按钮,如下图所示。

返回 Session
(会话)页面以保存设置,这样你就不需要每次都输入它们。在 Saved Session
(已保存的会话)字段中输入会话名称,然后点击 Save
(保存)按钮。

选择已保存的会话,然后点击 Open
(打开)按钮登录到远程服务器。此时会弹出一个新窗口,要求你输入用户名和密码。输入用户名和密码后,你将登录到你的服务器,SSH 隧道便会启动。设置公钥认证可以让你无需输入密码即可连接到服务器。

结论
我们已经向你展示如何设置 SSH 隧道并通过安全地 SSH 连接转发流量。为了方便使用,你可以在你的 SSH 配置文件中定义 SSH 隧道,或者创建一个 Bash 别名来快速设置 SSH 隧道。
如果你遇到问题或有任何反馈,请在下方留言。