SSH端口转发

利用SSH进行端口转发

SSH简介

secure shell能做很多事

本地端口转发

感觉这里的本地主机L1可以理解为内网主机
本地主机L1(IP:192.168.1.1),远程主机R1(47.11.11.11)
远程主机开放3000端口,对IP进行限定。通过本地端口转发,使得,本地主机L1访问localhost:2000,来达到访问远程主机R1的3000端口的同样效果。
即係:L1请求本地2000—>L1请求远程R1:3000

1
2
3
# 在本地主机L1登陆远程云主机R1,并进行本地端口转发
# -L 本地网卡地址:本地端口:目标地址:目标端口
ssh -L localhost:2000:localhost:3000 root@47.11.11.11

本地网卡地址可以省略,表示2000端口绑定本地L1的所有网卡。

另外,-L选项中的目标地址也可以是其他主机的地址。假设远程云主机R2的局域网IP地址为192.168.59.100,则可以这样进行端口转发:

1
2
# 在本地主机L1登陆远程云主机R1,并进行本地端口转发。请求被转发到远程云主机R2上
ssh -L 2000:192.168.59.100:3000 root@47.1.1.1

远程端口转发

本地主机L1没有公网IP,或者外网无法访问,开放3000端口服务。远程主机R1通过访问localhost:2000,来达到访问本地主机L1的3000端口的同样效果。

即係:R1请求本地2000—>R1请求本地L1:3000

1
2
3
# 在本地主机L1登陆远程云主机R1,并进行远程端口转发
# -R 远程网卡地址:远程端口:目标地址:目标端口
ssh -R localhost:2000:localhost:3000 root@47.11.11.11

同理,远程网卡地址可以省略,目标地址也可以是其他主机地址。假设本地主机L2的局域网IP地址为192.168.0.100。

1
2
# 在本地主机L1登陆远程云主机R1,并进行远程端口转发
ssh -R 2000:192.168.0.100:3000 root@103.59.22.17

动态端口转发

对于本地端口转发和远程端口转发,都存在两个一一对应的端口,分别位于SSH的客户端和服务端,而动态端口转发则只是绑定了一个本地端口,而目标地址:目标端口则是不固定的。目标地址:目标端口是由发起的请求决定的,比如,请求地址为192.168.1.100:3000,则通过SSH转发的请求地址也是192.168.1.100:3000。

这时,通过动态端口转发,可以将在本地主机L1发起的请求,转发到远程主机R1,而由R1去真正地发起请求。

1
2
3
# 在本地主机L1登陆远程云主机R1,并进行动态端口转发
# -D 本地网卡地址:本地端口
ssh -D localhost:2000 root@47.11.11.11

而在本地发起的请求,需要由Socket代理(Socket Proxy)转发到SSH绑定的2000端口。

链式端口转发

本地端口转发与远程端口转发结合起来使用,可以进行链式转发。假设A主机在公司,B主机在家,C主机为远程云主机。A主机上运行了前文的Node.js服务,需要在B主机上访问该服务。由于A和B不在同一个网络,且A主机没有独立公共IP地址,所以无法直接访问服务。

通过本地端口转发,将发送到B主机3000端口的请求,转发到远程云主机C的2000端口。

1
2
# 在B主机登陆远程云主机C,并进行本地端口转发
ssh -L localhost:3000:localhost:2000 root@103.59.22.17

通过远程端口转发,将发送到远程云主机C端口2000的请求,转发到A主机的3000端口。

1
2
# 在A主机登陆远程云主机C,并进行远程端口转发
ssh -R localhost:2000:localhost:3000 root@103.59.22.17

这样,在主机B可以通过访问http://localhost:3000来访问主机A上的服务

参考:
https://blog.fundebug.com/2017/04/24/ssh-port-forwarding/