SSH 隧道或 SSH 端口转发是一种在客户端和服务器计算机之间创建加密 SSH 连接的方法,通过该连接可以中继服务端口。
SSH 转发对于传输使用未加密协议的服务的网络数据非常有用,例如 VNC 或FTP、访问地理限制的内容或绕过中间防火墙。基本上,您可以转发任何 TCP 端口并通过安全 SSH 连接隧道传输流量。
SSH 端口转发分为三种类型:
- 本地端口转发。 - 将连接从客户端主机转发到 SSH 服务器主机,然后转发到目标主机端口。
- 远程端口转发。 - 将端口从服务器主机转发到客户端主机,然后转发到目标主机端口。
- 动态端口转发。 - 创建允许跨一系列端口进行通信的 SOCKS 代理服务器。
本文介绍如何设置本地、远程和动态加密的 SSH 隧道。
本地端口转发#
本地端口转发允许您将本地(ssh 客户端)计算机上的端口转发到远程(ssh 服务器)计算机上的端口,然后将其转发到目标计算机上的端口。
在此转发类型中,SSH 客户端侦听给定端口,并将到该端口的任何连接通过隧道传输到远程 SSH 服务器上的指定端口,然后远程 SSH 服务器连接到目标计算机上的端口。目标计算机可以是远程 SSH 服务器或任何其他计算机。
本地端口转发主要用于连接到内部网络上的远程服务,例如数据库或VNC服务器。
在 Linux、macOS 和其他 Unix 系统中,要创建本地端口转发,请传递-L
的选项ssh
client:
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
使用的选项如下:
-
[LOCAL_IP:]LOCAL_PORT
- 本地计算机的 IP 地址和端口号。什么时候LOCAL_IP
省略,ssh 客户端绑定在本地主机上。
-
DESTINATION:DESTINATION_PORT
- 目标计算机的 IP 或主机名以及端口。
-
[USER@]SERVER_IP
- 远程 SSH 用户和服务器 IP 地址。
您可以使用大于的任何端口号1024
as a LOCAL_PORT
。端口数小于1024
是特权端口,只能由 root 使用。如果您的 SSH 服务器正在侦听22 以外的端口(默认),使用-p [PORT_NUMBER]
option.
目标主机名必须可从 SSH 服务器解析。
假设您的机器上运行着 MySQL 数据库服务器db001.host
在内部(专用)网络上的端口 3306 上,可从计算机访问该端口pub001.host
,并且您想要使用本地计算机 MySQL 客户端连接到数据库服务器。为此,您可以使用以下命令转发连接:
ssh -L 3336:db001.host:3306 user@pub001.host
运行该命令后,系统将提示您输入远程 SSH 用户密码。输入后,您将登录到远程服务器,并且 SSH 隧道将建立。这也是一个好主意设置基于 SSH 密钥的身份验证并无需输入密码即可连接到服务器。
现在,如果您将本地计算机数据库客户端指向127.0.0.1:3336
,连接将被转发到db001.host:3306
MySQL 服务器通过pub001.host
充当中间服务器的机器。
您可以在单个 ssh 命令中将多个端口转发到多个目标。例如,您的计算机上运行着另一个 MySQL 数据库服务器db002.host
,并且您想从本地客户端连接到两台服务器,您可以运行:
ssh -L 3336:db001.host:3306 3337:db002.host:3306 user@pub001.host
要连接到第二个服务器,您可以使用127.0.0.1:3337
.
当目的主机与SSH服务器相同时,可以不指定目的主机IP或主机名,而使用localhost
.
假设您需要通过 VNC 连接到远程计算机,该计算机运行在同一台服务器上,并且无法从外部访问。您将使用的命令是:
ssh -L 5901:127.0.0.1:5901 -N -f user@remote.host
The -f
选项告诉ssh
在后台运行的命令和-N
不执行远程命令。我们正在使用localhost
因为VNC和SSH服务器运行在同一台主机上。
如果您在设置隧道时遇到问题,请检查远程 SSH 服务器配置并确保AllowTcpForwarding
未设置为no
。默认情况下,允许转发。
远程端口转发#
远程端口转发与本地端口转发相反。它允许您将远程(ssh 服务器)计算机上的端口转发到本地(ssh 客户端)计算机上的端口,然后将其转发到目标计算机上的端口。
在此转发类型中,SSH 服务器侦听给定端口,并将到该端口的任何连接通过隧道传输到本地 SSH 客户端上的指定端口,然后本地 SSH 客户端连接到目标计算机上的端口。目标计算机可以是本地计算机或任何其他计算机。
在Linux、macOS和其他Unix系统中创建远程端口转发,通过-R
的选项ssh
client:
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
使用的选项如下:
-
[REMOTE:]REMOTE_PORT
- 远程 SSH 服务器上的 IP 和端口号。一个空的REMOTE
意味着远程 SSH 服务器将绑定在所有接口上。
-
DESTINATION:DESTINATION_PORT
- 目标计算机的 IP 或主机名以及端口。
-
[USER@]SERVER_IP
- 远程 SSH 用户和服务器 IP 地址。
远程端口转发主要用于向外部人员提供对内部服务的访问。
假设您正在本地计算机上开发 Web 应用程序,并且想要向其他开发人员显示预览。您没有公共 IP,因此其他开发人员无法通过 Internet 访问该应用程序。
如果您有权访问远程 SSH 服务器,则可以按如下方式设置远程端口转发:
ssh -R 8080:127.0.0.1:3000 -N -f user@remote.host
上面的命令将使 ssh 服务器监听端口8080
,并将所有流量从该端口隧道传输到端口上的本地计算机3000
.
现在您的开发人员同事可以输入the_ssh_server_ip:8080
在他/她的浏览器中预览您出色的应用程序。
如果您在设置远程端口转发时遇到问题,请确保GatewayPorts
被设定为yes
在远程 SSH 服务器配置中。
动态端口转发#
动态端口转发允许您在本地(ssh 客户端)计算机上创建套接字,该计算机充当 SOCKS 代理服务器。当客户端连接到此端口时,连接将转发到远程(ssh 服务器)计算机,然后将其转发到目标计算机上的动态端口。
这样,所有使用 SOCKS 代理的应用程序都将连接到 SSH 服务器,并且服务器会将所有流量转发到其实际目的地。
在Linux、macOS和其他Unix系统中创建动态端口转发(SOCKS)通过-D
的选项ssh
client:
ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER
使用的选项如下:
-
[LOCAL_IP:]LOCAL_PORT
- 本地计算机的 IP 地址和端口号。什么时候LOCAL_IP
省略,ssh 客户端绑定在本地主机上。
-
[USER@]SERVER_IP
- 远程 SSH 用户和服务器 IP 地址。
动态端口转发的一个典型示例是通过 SSH 服务器传输 Web 浏览器流量。
以下命令将在端口上创建 SOCKS 隧道9090
:
ssh -D 9090 -N -f user@remote.host
建立隧道后,您可以配置应用程序以使用它。本文解释如何配置 Firefox 和 Google Chrome 浏览器以使用 SOCKS 代理。
必须为您想要对流量进行隧道传输的每个应用程序单独配置端口转发。
在 Windows 中设置 SSH 隧道#
Windows 用户可以使用 PuTTY SSH 客户端创建 SSH 隧道。您可以下载 PuTTYhere
.
-
启动 Putty 并在框中输入 SSH 服务器 IP 地址Host name (or IP address)
field.
-
在下面Connection
菜单,展开SSH
并选择Tunnels
。检查Local
用于设置本地的单选按钮,Remote
用于远程,以及Dynamic
用于动态端口转发。
- 设置本地转发时,在“本地转发端口”中输入
Source Port
场和在Destination
输入目标主机和IP,例如localhost:5901
.
- 对于远程端口转发,请在“远程SSH服务器转发端口”中输入
Source Port
场和在Destination
输入目标主机和IP,例如localhost:3000
.
- 如果设置动态转发,则仅在本地 SOCKS 端口中输入
Source Port
field.
-
单击Add
按钮,如下图所示。
-
返回到Session
页面保存设置,这样您就不需要每次都输入它们。在中输入会话名称Saved Session
字段并单击Save
button.
-
选择保存的会话并通过单击登录到远程服务器Open
button.
将显示一个新窗口,询问您的用户名和密码。输入用户名和密码后,您将登录到服务器,并且 SSH 隧道将启动。
配置公钥认证允许您无需输入密码即可连接到服务器。
结论#
我们向您展示了如何设置 SSH 隧道并通过安全 SSH 连接转发流量。为了便于使用,您可以在您的应用程序中定义 SSH 隧道SSH 配置文件或创建一个Bash 别名这将设置 SSH 隧道。
如果您遇到问题或有反馈,请在下面发表评论。