通过 SSH 隧道进行端口流量转发
通过 SSH 的 -L 、-R 参数可在管道内部建立一个有向隧道:
- 使用
-L(Local) 参数建立一个由本地到远程的隧道(正向隧道); - 使用
-R(Remote) 参数建立一个由远程到本地的隧道(反向隧道)。
正向隧道
ssh -L [<bindHost>:]<sourcePort>:<forwardToHost>:<onPort> <connectToHost>
在本机与 connectToHost 的连接管道上,建立一条从本机到 connectToHost 的隧道。然后本机把收到的从 bindHost 发到本机 sourcePort 端口的数据通过隧道由 connectToHost 转发给 forwardToHost 的 onPort 端口。
注意:
bindHost为*或者省略时,则表示所有主机;forwardToHost主机是以connectToHost的角度来看的,若connectToHost为localhost则表示是connectToHost的本地回环。
反向隧道
ssh -R [<bindHost>:]<sourcePort>:<forwardToHost>:<onPort> <connectToHost>
与 -L 类似,在本机与 connectToHost 的连接管道上, 建立一条由 connectToHost 到本机的隧道。然后 connectToHost 把它收到的从 bindHost 主机发往 connectToHost 的 sourcePort 的流量转发到本机,并由本机发送到 forwardToHost 主机的 onPort 端口。
其它相关参数
-f:使 SSH 在建立连接之后保持在后台运行。-N:告诉 SSH,我们只希望建立隧道,而不会在远程主机上执行任何指令。-T:告诉 SSH,我们只希望建立隧道,因而不需要创建虚拟终端。-C:允许 SSH 压缩数据。-D:动态端口转发。将指定地址端口的数据转发到远程服务器,支持SOCKS5协议。如:ssh -D localhost:1077 root@8.8.8.8将本地1077端口接收到的数据转发到8.8.8.8