SSH端口转发分为三种情况,分别为本地端口转发,远程端口转发以及动态端口转发.本文只介绍前两种.
什么是端口转发
日常生活中,客户端与服务器端连接(例如网页浏览时的http连接),都是从客户端发起时,指定服务器端的地址(包括IP和端口).例如访问百度时,浏览器指定服务器的地址为https://www.baidu.com. 其中www.baidu.com经过DNS解析后可得到一个IP地址,而https协议默认使用443端口,因此,访问百度时,浏览器会发起从本地到百度服务器443端口的连接. 而端口转发是指,客户端访问另一个地址和端口,该端口会将所有到达本端口的流量全部转发到目的地址.
SSH端口转发
ssh端口转发是指用ssh在本地环境和转发环境之间建立ssh隧道,这样不仅保证了数据传输安全,也能绕开一些网络防火墙等的限制.下面是ssh的man文档说明
SSH本地端口转发
使用 -L 指定本地端口转发,指令形式为
$ssh -L [bind_localhostdaddress]:localhostport:remotehost:remotehostport user@transhost
其中bind_localhostaddress为可选地址,默认为localhost,即127.0.0.1
上面这条指令的意思为:
将发往localhostport的流量发送到transhost, 然后transhost再将收到的流量发送到remotehost:remotehostport. 这样就实现了localhostport的流量转发到remotehost:remotehostport的目的.
本地端口转发使用场景
- 绕过IP限制
有hostA,hostB,hostC三台主机
目标:
hostA --访问--> hostC:80
现状:
hostA--可以访问-->hostB
hostA--不可以访问-->hostC:80
hostB--可以访问-->hostC:80
解决方案
在hostA中启用本地端口转发,将本地8080端口映射到hostC:80端口,这样hostA访问本地8080端口时,会自动将流量转发到hostC:80端口.
指令
[localuser@hostA] ssh -L 8080:hostC:80 hostBuser@hostB
- 绕过服务端端口限制
有hostA,hostB两台主机
目标:
hostA--访问-->hostB:443
现状:
hostA--仅可访问-->hostB:8888端口(同时hostB开放22端口供远程SSH访问)
解决方案
在hostA中启用本地端口转发,将本地8080端口映射到hostB中的443端口,在hostB中流量路径为 hostB:8080 --> hostB:443
指令
[localuser@hostA] ssh -L 8080:localhost:443 hostBuser@hostB
注意上面指令中的localhost.可以从流量的角度理解,此处较容易令人疑惑,分步理解如下
流量从hostA:8080经过ssh隧道(22端口)到达hostB.
此时流量应当转发至localhost:443端口,因为流量已经到达hostB.因此,从hostB看,下一步的目的地址为localhost:443.即到达了hostB:443
[localuser@hostA] ssh -L 8000:hostB:443