通过 SSH 隧道进行端口流量转发

通过 SSH-L-R 参数可在管道内部建立一个有向隧道:

  • 使用 -L(Local) 参数建立一个由本地到远程的隧道(正向隧道);
  • 使用 -R(Remote) 参数建立一个由远程到本地的隧道(反向隧道)。

正向隧道

ssh -L [<bindHost>:]<sourcePort>:<forwardToHost>:<onPort> <connectToHost>

在本机与 connectToHost 的连接管道上,建立一条从本机到 connectToHost 的隧道。然后本机把收到的从 bindHost 发到本机 sourcePort 端口的数据通过隧道由 connectToHost 转发给 forwardToHostonPort 端口。

注意: 1. bindHost* 或者省略时,则表示所有主机;
2. forwardToHost 主机是以 connectToHost 的角度来看的,若 connectToHostlocalhost 则表示是 connectToHost 的本地回环。

反向隧道

ssh -R [<bindHost>:]<sourcePort>:<forwardToHost>:<onPort> <connectToHost>

-L 类似,在本机与 connectToHost 的连接管道上, 建立一条由 connectToHost 到本机的隧道。然后 connectToHost 把它收到的从 bindHost 主机发往 connectToHostsourcePort 的流量转发到本机,并由本机发送到 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