端口转发概述
端口转发,能够将其他TCP端口的网络数据通过SSH链路转发,并且提供了ssh的加密和解密的服务。
ssh端口转发有如下这些优点:
- 提供了ssh的加密传输,利于安全
- 能够突破防火墙限制
目前ssh端口转发有如下几种方式:
- 本地转发
- 远程转发
- 动态转发
1. 本地转发
场景:假设有一台服务器(1.1.1.1),服务端口为(80),但是出于安全限制,服务器只开放了ssh的22端口,并且只允许在服务器上的应用才能访问到该端口服务(监听socket:127.0.0.1:80)。我们有一台远程客户端(2.2.2.2),我们希望在远程客户端上对该服务进行调试。有什么办法可以实现?
这种场景,就非常适合实用ssh本地转发模式。
本地转发的命令格式
ssh -L <local port>:<remote host>:<remote port> <ssh hostname>
-g 参数开启网关模式,允许从非本地连接
在客户端上执行
ssh -L 9527:localhost:80 1.1.1.1
如果觉得难以理解,不要着急,先看一下这个数据流是怎么走的:
- 我们在客户端上的应用将数据发送到客户端的9527端口上,
- 而客户端的 SSH Client 会将9527端口收到的数据加密并转发到服务器的 SSH Server 上。
- SSH Server 会解密收到的数据并将之转发到监听的80端口上,
- 最后再将从80端口返回的数据原路返回以完成整个流程。
从上面的数据流,可以看到,ssh实现了加密、转发、解密、通信的过程。
2. 远程转发
场景:由于限制,我们的客户端无法访问到服务器的任何端口。但是服务器能够访问客户端却是被允许的。此时,我们就需要通过远程转发来实现端口转发。
远程转发的命令格式
ssh -R <local port>:<remote host>:<remote port> <SSH hostname>
服务器上执行
ssh -R 9527:localhost:80 2.2.2.2
远程转发的数据流与本地转发大致是一样的,但是SSH Client与SSH Server的位置互换:
- 我们的客户端上的应用将数据发送到客户端的9527端口上
- 客户端的SSH Server会将9527端口上接收的数据加密转发到服务器的SSH Client上
- SSH Client接收到数据后解密,并转发到监听的80端口上
- 最后再将80端口返回的数据原路返回完成整个流程。
3. 多主机转发
场景:我们有两台客户端,分别为A、C,有两台服务器,分别为B、D。客户端网络与服务器网络有防火墙限制,但是我们能够实现从客户端A通过ssh访问到服务器D。我们的需求是,需要从客户端C访问到服务器B上80端口服务。此时,我们就可以使用多主机端口转发。
在客户端C上执行
ssh -g -L 9527:<B ip>:80 <D ip>
解释:
- 通过SSH Client C与SSH Server D建立ssh隧道,实现C转发B的80服务。命令中我们填写了B的ip,来表示被转发的服务ip。
- 然后我们添加-g参数,表示开启网关转发模式,来实现非本地客户端访问。
缺点:
虽然从C->D的链路是有加解密的过程。但是从A->C,从B->D是非安全连接。如果这其中的网络有风险。那么我们的服务的转发也是有风险的。
4. 动态转发
动态转发相对于本地转发、远程转发等,他是不需要指定要转发的端口号。这样就可以实现多端口号转发。
命令格式
ssh -D <local port> <SSH Server>
参数解释:
-D port
This works by allocating a socket to listen to port on the local side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and the application protocol is then used to determine where to connect to from the remote machine. Currently the SOCKS4 and SOCKS5 protocols are supported, and ssh will act as a SOCKS server. Only root can forward privileged ports. Dynamic port forwardings can also be specified in the configuration file.
执行
ssh -D 7001 <SSH Server>
缺点:
同样的,从SSH Client到SSH Server的数据是被保护的,脱离这部分的网络则并不是安全的。