【折腾必懂·实践篇】第五期 端口转发/端口映射实践
目录:
SSH隧道或SSH端口转发是一种在客户端和服务器计算机之间创建加密的SSH连接的方法,通过该连接可以中继服务端口。
SSH转发对于传输使用未加密协议的服务(例如VNC或FTP)的网络数据,访问受地理限制的内容或绕过中间防火墙非常有用。 基本上,您可以转发任何TCP端口并通过安全的SSH连接建立隧道流量。
SSH端口转发有三种类型:
- 本地端口转发。 -将连接从客户端主机转发到SSH服务器主机,然后再转发到目标主机端口。远程端口转发。 -将端口从服务器主机转发到客户端主机,然后再转发到目标主机端口。动态端口转发。 -创建SOCKS代理服务器,该服务器允许跨多个端口进行通信。
,我们将讨论如何设置本地,远程和动态加密的SSH隧道。
本地端口转发
本地端口转发使您可以将本地(ssh客户端)计算机上的端口转发到远程(ssh服务器)计算机上的端口,然后再转发到目标计算机上的端口。
在这种类型的转发中,SSH客户端侦听给定端口,并将与该端口的任何连接通过隧道传输到远程SSH服务器上的指定端口,然后该远程SSH服务器连接到目标计算机上的端口。 目标计算机可以是远程SSH服务器或任何其他计算机。
本地端口转发通常用于连接到内部网络(例如数据库或VNC服务器)上的远程服务。
在Linux,macOS和其他Unix系统中,以创建本地端口转发,将
-L
选项传递给
ssh
客户端:
ssh -L LOCAL_PORT:DESTINATION:DESTINATION_PORT SSH_SERVER
使用的选项如下:
-
LOCAL_PORT本地计算机的IP和端口号。 当省略LOCAL_IP,ssh客户端将绑定到本地主机。DESTINATION:DESTINATION_PORT目标计算机的IP或主机名和端口。SERVER_IP远程SSH用户和服务器IP地址。
您可以将大于
1024
任何端口号用作
LOCAL_PORT
。 小于
1024
的端口是特权端口,并且只能由root用户使用。 如果您的SSH服务器正在侦听22以外的端口(默认端口),请使用
-p
选项。
目标主机名必须可以从SSH服务器解析。
假设您有一个运行在内部(专用)网络上的机器
db001.host
上的MySQL数据库服务器,其端口3306可从机器
pub001.host
访问,并且您想使用本地机器
mysql
客户端连接到数据库服务器。 为此,您可以像这样转发连接:
ssh -L 3336:db001.host:3306 [email protected]
运行命令后,系统将提示您输入远程SSH用户密码。 输入后,您将登录到远程服务器并建立SSH隧道。 最好设置一个基于SSH密钥的身份验证并连接到服务器而无需输入密码。
现在,如果将本地计算机数据库客户端指向
127.0.0.1:3336
,则连接将通过充当中间服务器的
pub001.host
计算机转发到
db001.host:3306
MySQL服务器。
您可以在一个ssh命令中将多个端口转发到多个目标。 例如,您在机器
db002.host
上运行了另一台MySQL数据库服务器,并且想要从本地客户端连接到两台服务器,您将运行:
ssh -L 3336:db001.host:3306 3337:db002.host:3306 [email protected]
要连接到第二台服务器,请使用
127.0.0.1:3337
。
如果目标主机与SSH服务器相同,而不是指定目标主机IP或主机名,则可以使用
localhost
。
假设您需要通过运行在同一服务器上且无法从外部访问的VNC连接到远程计算机。 您将使用的命令是:
ssh -L 5901:127.0.0.1:5901 -N -f [email protected]
-f
选项告诉
ssh
命令在后台运行,
-N
告诉它不执行远程命令。 我们使用
localhost
是因为VNC和SSH服务器在同一主机上运行。
远程端口转发
远程端口转发与本地端口转发相反。 它允许您将远程(ssh服务器)计算机上的端口转发到本地(ssh客户端)计算机上的端口,然后将其转发到目标计算机上的端口。
在这种类型的转发中,SSH服务器侦听给定的端口,并将与该端口的任何连接通过隧道传输到本地SSH客户端上的指定端口,然后该客户端再连接到目标计算机上的端口。 目标计算机可以是本地计算机或任何其他计算机。
在Linux,macOS和其他Unix系统中,要创建远程端口转发,请将
-R
选项传递给
ssh
客户端:
ssh -R REMOTE_PORT:DESTINATION:DESTINATION_PORT SSH_SERVER
使用的选项如下:
-
REMOTE_PORT远程SSH服务器上的IP和端口号。 空的REMOTE表示远程SSH服务器将在所有接口上绑定。DESTINATION:DESTINATION_PORT目标计算机的IP或主机名和端口。SERVER_IP远程SSH用户和服务器IP地址。
本地端口转发通常用于使外部人员可以访问内部服务。
假设您正在本地计算机上开发Web应用程序,并且想向开发人员显示预览。 您没有公共IP,因此其他开发人员无法通过Internet访问该应用程序。
ssh -L 8080:127.0.0.1:3000 -N -f [email protected]
上面的命令将使ssh服务器侦听端口
8080
并将所有流量从该端口传输到端口
3000
上的本地计算机。
现在,您的同级开发人员可以在浏览器中输入
the_ssh_server_ip:8080
并预览您的超赞应用程序。
动态端口转发
动态端口转发使您可以在充当SOCKS代理服务器的本地(ssh客户端)计算机上创建套接字。 当客户端连接到该端口时,连接将转发到远程(ssh服务器)计算机,然后再转发到目标计算机上的动态端口。
这样,所有使用SOCKS代理的应用程序都将连接到SSH服务器,并且该服务器会将所有流量转发到其实际目的地。
在Linux,macOS和其他Unix系统中,用于创建动态端口转发(SOCKS)的
-D
选项传递给
ssh
客户端:
ssh -D LOCAL_PORT SSH_SERVER
使用的选项如下:
-
LOCAL_PORT本地计算机的IP和端口号。 当省略LOCAL_IP,ssh客户端将绑定到本地主机。SERVER_IP远程SSH用户和服务器IP地址。
动态端口转发的典型示例是通过SSH服务器建立Web浏览器流量隧道。
以下命令将在端口
9090
上创建一个SOCKS隧道:
ssh -D 9090 -N -f [email protected]
建立隧道后,您可以配置您的应用程序以使用它。 本文介绍了如何配置Firefox和Google Chrome浏览器以使用SOCKS代理。
必须为要通过其传输流量的每个应用程序分别配置端口转发。
在Windows中设置SSH隧道
Windows用户可以使用PuTTY SSH客户端创建SSH隧道。 您可以在此处下载PuTTY。
-
启动Putty,然后在
Host name (or IP address)字段中输入SSH服务器IP地址。




将显示一个新窗口,要求您输入用户名和密码。 输入用户名和密码后,您将登录到服务器并启动SSH隧道。
设置公共密钥身份验证将使您无需输入密码即可连接到服务器。
结论
我们已经向您展示了如何设置SSH隧道以及如何通过安全的SSH连接转发流量。 为了易于使用,您可以在SSH配置文件中定义SSH隧道,或创建将建立SSH隧道的Bash别名。
SSH安全











