问题描述
本地转发,将本地连接转发到远程服务器;远程转发,将本地服务映射到远程主机的端口上;动态转发,类似于 SOCKS 代理功能。
该笔记将记录:与 SSH 端口转发有关的内容。
动态转发(SSH -D)
功能介绍
该功能实际上使用SOCKS协议,因此经常被用来*。使用动态转发,只要是远程主机可以访问的站点,客户端也可以访问(所以说是*嘛)。
如何配置
执行如下命令即可,然后配置应用程序,使用SOCKS协议即可。
ssh -D 8888 user@remoteserver
使用场景
1)网络加速。当时由SSH提供的SOCKS协议具有某些特征,容易被长城牌子的防火墙识别,因此作用也不是很大。
本地转发(SSH -L)
功能介绍
该功能在本地监听一个端口,该端口的连接被转发到远程主机的特定端口。相当于把远程端口映射到本地,即“将远程端口放在本地”。
如何配置
如下命令,监听本地的 9999 端口,任何访问 9999 的客户端,都相当于访问远程主机 xample.com 的80端口,但是流量是通过 remoteserver 的,并且所有流量都被加密:
ssh -L 0.0.0.0:9999:example.com:80 user@remote.server # 上述命令涉及到三台主机: # 本地主机:0.0.0.0 # 目标主机:example.com,这是我们要访问的主机 # 代理主机:remote.server,也是我们的跳板机
还有一种变体:目标主机与代理主机可以是同一台主机,即将remote.server服务映射到本地:
ssh -L 0.0.0.0:9999:127.0.0.1:6379 user@remote.server
出于安全考虑,在远程主机中的某个服务只监听了6379端口,但是另一台主机想访问该服务。此时,我们便可以将服务通过SSH映射到该主机上。
使用场景
1)流量加密。比如,你在远程主机上搭建HTTP代理,但是,如果你直接使用它,容易被发现(比如被防火墙屏蔽),这时可以加一层SSH转发,将远程的HTTP端口映射到本地。现在(09/21/2019)SOCKS协议已经可以被检测到,所以不要直接访问SOCKS主机,可以将流量通过SSH进行代理。
2)服务安全。比如,上面的“变体”,明白人已经看出来6379是REDIS服务了,由于REDIS的安全性较弱,可以通过该方法提高安全性(这只是一个主意,还有很多细节需要测试,比如性能、可用性、稳定性等等)。
远程转发(SSH -R)
功能介绍
与“本地转发”正好相反,该功能在远程监听一个端口,该端口的连接被转发到本地主机的特定端口。相当于把本地端口映射到远程,即“将本地端口放在远程”。
如何配置
如下命令,在远程主机上监听 1999 端口,访问 1999 端口的连接等同于访问本地的 902 端口
ssh -v -R 0.0.0.0:1999:127.0.0.1:902 user@remote.server
使用场景
1)内网服务映射。将在内网中的服务,通过远程主机暴露出来,提供给他人访问。
补充说明
通过 -N 选项,可使不执行任何命令。
参考文献
WikiNotes/端口转发
SSH Examples, Tips & Tunnels
SSH 端口转发
SSH port forwarding without session - Super User