SSH (SSH 全称为 Secure Shell)端口转发也被称作 SSH 隧道(SSH Tunnel),因为它们都是通过SSH登陆之后,在 SSH 客户端与 SSH 服务端之间建立了一个隧道,从而进行通信。SSH 隧道是非常安全的,因为 SSH 是通过加密传输数据的。有了隧道我们自然可以翻山越岭,看看外面的花花世界。
简介
SSH 有三种端口转发模式,本地端口转发(Local Port Forwarding),远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic Port Forwarding)。
符号说明
文中使用A、B、C:
A,本地
B,远端SSH服务器
C,目标服务器
Local Port Forwarding
使用场景
A——B:portB——C:portC
A—————C:portC
如上图所示,本地主机A 可以访问远端 SSH 服务器 B 端口 portB,B 可以访问目标主机 C 端口 portC,但是 A 访问 C 的端口 portC。当然 C 也可能是 B(有点绕。。。):
A——B:portB——B:portB2
A—————B:portB2
上图所示本地主机 A 可以访问远端SSH服务器 B 的 PortB 端口,但不能访问 PortB2 端口。
使用本地端口转发就可以解决上述问题。
使用
命令如下:
bind_address 是本地主机地址,可省略,表示绑定本机所有IP。port 是本地主机绑定的端口。
例:
这样,发送到本地端口 portA 的数据将会通过 B 转发给 C 的端口 portC,效果如下:
*——A:portA======B====C:portC
Remote Port Forwarding
使用场景
C:portC——A——B:portB
C:portC—————B
如上图所示,本地主机A 可以访问远端 SSH 服务器 B 端口 portB,A 也可以访问目标主机 C 端口 portC,但是 B 不能访问 C 的端口 portC。当然 C 也可能是 A:
A———B:portB
A:portA-—-B
很多情况下是因为本地主机 A 处在内网,外网无法直接访问 A,就可以使用该方法进行 NAT 穿透。
使用
命令如下:
bind_address 是远端 SSH 服务器绑定地址,同样可省略。port 是远端 SSH 服务器绑定的地址。
例:
这样,发送到远端服务器B portB 的数据将会通过本地主机 A 转发给 C 的端口 portC,效果如下:
*——B:portB======A====C:portC
Dynamic Port Forwarding
使用场景
上述两个端口转发都限制了目标服务器以及目标服务器对应的端口,而动态端口转发更像是一个代理。
A——B:portB——花花世界
A—————花花世界
看到这,是不是发现了什么?
使用
命令如下:
bind_address 是本地主机地址,可省略,表示绑定本机所有IP。port 是本地主机绑定的端口。
例:
这样,发送到本地主机 A portA 的数据将会转发给B,远程主机 B 会根据数据包的应用层协议(如HTTP)自动建立对应的连接,并将数据返回给 A。
SSH 部分参数
-p: 指定端口
-C: 压缩发送/接受的数据
-N: 不执行远端命令,端口转发时使用
-f: 后台操作,通常和-N连用
-g: 允许远端主机连接本地转发端口
其他命令可参考手册
领取专属 10元无门槛券
私享最新 技术干货