SSH 隧道

考虑到在宿舍无法直接访问工作室的网络环境,只能折腾一下各种隧道。

实验环境

服务器一

  • 远程服务器 地址 remote.com
  • 远程服务器 ssh用户 user
  • 远程服务器 ssh端口 22
  • 进程A 监听地址 127.0.0.1
  • 进程A 监听端口 8080
  • 进程B 监听地址 127.0.0.1
  • 进程B 监听端口 8081

服务器二

  • 远程服务器 地址 remote.org
  • 远程服务器 ssh用户 user
  • 远程服务器 ssh端口 22
  • 进程C 监听地址 0.0.0.0
  • 进程C 监听端口 8082

本地计算机

  • 本地计算机 地址 local0.com
  • 本地计算机 地址 local1.com
  • local0.com进程D 监听地址 127.0.0.1
  • local0.com进程D 监听端口 8083

本地端口转发

我们希望,发送到本地计算机指定端口的数据,转发到远程服务器指定端口。

我们希望,可以通过访问local0.com的80端口,实现访问remote.com的进程A,访问local0.com的81端口,实现访问remote.com的进程B。local1.com可以通过访问local0.com的81端口,访问remote.com的进程B。

  1. local0.com请求数据 <-> local0.com: 80 <-> (ssh隧道) <-> remote.com: A: 8080
  2. local0.com请求数据 <-> local0.com: 81 <-> (ssh隧道) <-> remote.com: B: 8081
  3. local1.com请求数据 <-> local0.com: 81 <-> (ssh隧道) <-> remote.com: B: 8081

我们需要使用ssh建立两个隧道:隧道一在local0.com监听127.0.0.1:80,将数据发送到remote.com的127.0.0.1:8080;隧道二在local0.com监听0.0.0.0:81,将数据发送到remote.com的127.0.0.1:8081。

  1. local0.com 127.0.0.1:80 <--隧道--> remote.com 127.0.0.1:8080
  2. local0.com 0.0.0.0:81 <--隧道--> remote.com 127.0.0.1:8081

命令:-N -L 本地进程地址:本地进程端口:远程进程地址:远程进程端口

# 在local0.com执行
ssh -N -L 127.0.0.1:80:127.0.0.1:8080 user@remote.com -p 22
# 在local0.com执行
ssh -N -L 0.0.0.0:81:127.0.0.1:8081 user@remote.com -p 22

远程端口转发

我们希望,访问远程主机指定端口的请求,转发到指定计算机指定端口。

我们希望,请求remote.com:8888的数据,被转发到remote.org的进程C,请求remote.com:9999的数据,被转发到local0.com的进程D。

  1. 请求 <-> remote.com:8888 <-> (ssh隧道) <-> remote.org: C: 8082
  2. 请求 <-> remote.com:9999 <-> (ssh隧道) <-> local0.com: D: 8083

我们需要使用ssh建立两个隧道:隧道一在remote.com监听127.0.0.1:8888,将数据发送到remote.org的0.0.0.0:8082;隧道二在remote.com监听0.0.0.0:9999,将数据发送到local0.com的127.0.0.1:8083。

注意,远程端口转发,在远程服务器上,只能监听localhost,你可能需要Nginx进行TCP代理。

  1. remote.com 127.0.0.1:8888 <--隧道--> remote.org 0.0.0.0:8082
  2. remote.com 127.0.0.1:9999 <--隧道--> local0.com 127.0.0.1:8083

命令:-N -R 远程进程A地址:远程进程A端口:远程进程B地址:远程进程B端口

# 在local0.com执行
ssh -N -R 127.0.0.1:8888:remote.org:8082 user@remote.com -p 22
# 在local0.com执行
ssh -N -R 127.0.0.1:9999:127.0.0.1:8083 user@remote.com -p 22

动态端口转发

我们希望,由remote.com转发数据到目的地。

数据 <----> 127.0.0.1:1080 <--ssh隧道--> remote.com <----> 目的地

命令:-N -D 本地地址:本地端口

# 在本地执行
ssh -N -D 127.0.0.1:1080 user@remote.com -p 22

Chromium参考:SwitchyOmega

参数列表

  • -N 不执行何指令
  • -L 建立本地到远程的隧道
  • -R 建立远程到远程的隧道
  • -D 建立本地到远程的V动.态P隧.道N

建议参数

  • -f 后台执行
  • -o TCPKeepAlive=yes 确保链接长时间闲置不会被断开