大道至简,知易行难
广阔天地,大有作为

SSH隧道及本地端口转发、远程端口转发和动态端口转发

SSH除了作为Security Shell的基本功能外,还能够以端口转发(Port Forwarding)的方式为X11连接和任意TCP连接等提供安全的信道,即通过加/解密SSH客户端与服务端之间网络通信避免用户名密码及其他隐私信息的明文传输,也被称为隧道(Tunneling)。在SSH的手册中是这样进行介绍的:

SSH手册上的介绍

SSH手册上的介绍

端口转发有三种类型,英文比中文容易理解:
1、Local port forwarding – connections from an SSH client are forwarded, via the SSH server, to a destination server;
2、Remote port forwarding – connections from an SSH server are forwarded, via the SSH client, to a destination server;
3、Dynamic port forwarding – connections from various programs are forwarded, via the SSH client to an SSH server, and finally to several destination servers;

一、本地端口转发

SSH本地端口转发

SSH本地端口转发

本地端口转发时,SSH客户端会监听指定的TCP端口,连到该端口上的连接会被通过SSH隧道,由SSH服务端转发至对应的远程地址(remote_socket)上。常常用来突破网络限制等,例如:

SSH本地端口映射示意

SSH本地端口映射示意

企业内部的Telnet服务器192.168.234.131没有公网IP,不允许从防火墙外部直接访问,而服务器192.168.234.130是一个具有公网IP的服务器,可以连接到Telnet服务器192.168.234.131。当防火墙从外部使用22端口连接到192.168.234.130时,防火墙外的用户101.202.134.71就可以通过SSH协议连接到192.168.234.130上,再通过192.168.234.130做跳板连接到192.168.234.131。在这种情况下,实际的数据流向是:data<- ->localhost:9999端口<- ->localhost:xxxx(随机在客户端开一个端口)<- ->202.131.48.69:22(通过SSH隧道封装)<- ->202.131.48.69:yyyy(SSH服务器解并随机开一个端口作为Telnet客户端)<- ->192.168.239.131:23。
由于本地没有这种环境,所以使用iptables进行模拟:

禁止192.168.239.131访问192.168.239.133的80端口

禁止192.168.239.131访问192.168.239.133的80端口

验证192.168.239.131无法访问192.168.239.133的80端口:

192.168.239.131无法访问192.168.239.133的80端口

192.168.239.131无法访问192.168.239.133的80端口

而其他机器可以:

其他机器可以访问192.168.239.133的80端口

其他机器可以访问192.168.239.133的80端口

此时,在192.168.239.131上执行:
ssh -fN -L 9999:192.168.239.133:80 192.168.239.129
命令,使得经由192.168.239.129转发。此时,192.168.239.131上执行:
wget localhost:9999
命令时将能够获取到网页:

访问本地的9999端口经由SSH端口转发访问受限内容

访问本地的9999端口经由SSH端口转发访问受限内容

我们可以看到,当ssh命令发出后客户端被立即要求进行登录,此时SSH隧道就建立起来了。其中,参数-f和-N的含义分别表示后台运行和不执行远程命令,记住就行了:

ssh的-f参数

ssh的-f参数

ssh的-N参数

ssh的-N参数

此时使用ps命令可以看到对应的后台进程:

ssh的-f参数生成的后台进程

ssh的-f参数生成的后台进程

应该注意,使用
ssh -fN -L 9999:192.168.239.133:80 192.168.239.129
命令与使用
ssh -fN -L *:9999:192.168.239.133:80 192.168.239.129
命令是有区别的,区别在于后者绑定到了所有地址上并使得192.168.239.131:9999能够被允许远程访问:

SSH本地端口映射允许外部访问

SSH本地端口映射允许外部访问

此外,我们可以使用一句ssh命令设置多个到不同机器的隧道,只需使用多个空格分隔即可,例如:
ssh -Y -L 1111:test1.test.com:22 -L 2222:test2.test.com:22-L 4444:web.test.com:443

二、远程端口转发

SSH远程端口转发

SSH远程端口转发

本地端口转发的方式适用于防火墙外允许从墙外到墙内建立连接的方式;然而,在实际生产中,还非常有可能出现防火墙只允许从墙内向墙外建立连接或存在NAT的情况。此时,就需要用到远程端口转发,也有人将其称为反向代理甚至内网穿透(可以认为,内网穿透是反向代理的一种特例)。
为了试验,我们让192.168.239.132作为SSH客户端、192.168.239.129作为SSH服务端,让192.168.239.131通过192.168.239.129访问192.168.239.133。首先,在192.168.239.132上使用ssh命令的-R参数设置远程端口转发:

ssh配置远程端口转发

ssh配置远程端口转发

我们需要注意,如果SSH服务端绑定的接口允许外部访问,那么配置文件中的GatewayProts选项必须被使能。GatewayProts可选的参数包括:
1、GatewayPorts no-This prevents connecting to forwarded ports from outside the server computer.
2、GatewayPorts yes-This allows anyone to connect to the forwarded ports. If the server is on the public Internet, anyone on the Internet can connect to the port.
3、GatewayPorts clientspecified-This means that the client can specify an IP address from which connections to the port are allowed. The syntax for this is ssh -R 52.194.1.73:8080:localhost:80 test.example.com. In this example, only connections from the IP address 52.194.1.73 to port 8080 are allowed.
当配置了远程端口转发后,之前访问不了192.168.239.133的192.168.239.131就可以通过192.168.239.129访问192.168.239.133了:

通过远程端口映射访问

通过远程端口映射访问

请注意,本地端口转发和远程端口转发顾名思义,就在于进行端口转发时,是连接的“本地服务器端口”还是“远程服务器端口”,是否本地是对ssh客户端而言的。例如,192.168.239.131:9999是在ssh客户端“本地”将发到9999端口的数据通过SSH隧道传给了ssh服务端并由服务端相应的端口转发出去;而192.168.239.129:8888则是先从墙内的ssh客户端向墙外的ssh服务端建立SSH隧道,之后数据是通过发到“远程”服务器192.168.239.129的8888端口上,进而墙外的ssh服务端将数据通过隧道转回墙内的ssh客户端并由ssh客户端的相应端口转发出去的。
最后,用一张图总结远程端口转发:

SSH远程端口转发

SSH远程端口转发

三、动态端口转发

SSH动态端口转发

SSH动态端口转发

本地端口转发和远程端口转发都只能做到一对一的转发(一个host的port到另一个host的port上的映射),动态端口转发就是用来解决这个问题的,即完成本机一个端口到任意远程地址和端口的转发。动态端口转发实现了应用层面的动态端口映射,通过在SSH客户端监听侦听一个SOCKS端口实现,此时SSH客户端也就变成了一个SOCKS服务器。当该端口上有了连接之后,该连接就会被经由SSH隧道交由SSH服务端转发出去。由于SOCKS协议可以根据指定要连接的真正地址和端口,也就实现了“动态”端口转发的概念:

SSH动态端口转发

SSH动态端口转发

早期,SSH动态端口转发可以实现绕过国家级数据包过滤系统的作用,但由于国家级数据包过滤系统已经能够通过DPI判断SSH协议,并对重点IP段进行随机干扰,故现已失效。

参考资料:
1、https://www.ssh.com/ssh/tunneling/example;

转载时请保留出处,违法转载追究到底:进城务工人员小梅 » SSH隧道及本地端口转发、远程端口转发和动态端口转发

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址