再探 ssh 和 VScode((双重)远程转发和本地转发)
注: 本文使用的 7890/7891/7892 端口只是为了区分,实际转发时可以相同。
远程转发(反向代理):
基本指令:
'-R' 代表 RemoteForward(远程转发,也叫反向代理),意义为使得远程服务器在访问远程某端口时,等于访问本机的某端口。
指令形如:
ssh -R 7890:localhost:7891 RemoteB
设本机为 LocalA,在 Remote B 上访问 7891 上,等价于访问 LocalA 的 7890 端口。
注意这是一个简写,7890 的前面还可以加具体的 IP 地址,省略的话默认为 localhost:
不省略例如:
ssh -R 192.168.1.100:7890:localhost:7891 RemoteB
VSCode 指令:
Host RemoteB
HostName RemoteB
User user_of_RemoteB
Port 22
RemoteForward localhost:7891 localhost:7890
注意 RemoteForward 和 -R 的顺序是反过来的。
应用:
远程转发可以让远程服务器使用本机的端口(例如 VPN)
之间讲的转发到本地 VPN 工具的见:
https://www.cnblogs.com/coldchair/p/18050457
双重远程转发:
有的时候我们会有一个登录节点,需要通过登录节点才能连接到计算节点。
我们先用上面的方法登录到 RemoteB,再用同样的方法登录到 Remote C 即可实现双重转发:
ssh -R 7891:localhost:7892 RemoteC
此时 RemoteC 上访问 7892 端口,等价于访问 RemoteB 7891 端口,等价于访问 LocalA 7890 端口。
本地转发(前向代理)
基本指令
'-L' 代表 LocalForward(本地转发,也叫前向代理),意义为使得本地访问某端口时,等于访问远程服务器某端口。
指令形如:
ssh -L 7890:localhost:7891 RemoteB
访问本机 LocalA 的 7890 端口时,等价于访问 RemoteB 的 7891 端口。
VSCode 指令:
其余不变
LocalForward localhost:7890 localhost:7891
注意这次顺序没反,所以 VScode 的 .ssh/config 中的顺序是 ???Forward <要被转发的端口> <转发到的端口>
而 -L/R 的顺序是 <本机端口>:<远程端口>
应用:
假设远程节点上开了个 tensorboard,我们想在本地的浏览器打开,就需要本地转发。
或者远程节点开了个 jupyter 后端,我们想在本地的编辑器打开。
一般来说,只有一层转发的话,VSCode 会自己帮你转发(例如在运行 tensorboard 指令时),在编辑器下面 [终端] 旁边的 [端口] 中。
双重本地转发:
有登录节点,在计算节点打开某后端,在本机运行需要双重本地转发。
第一层连接时,VSCode 不用预先设置 -L 或者 LocalForward,直接弄好第二层连接时,再在 [端口] 中设置一个即可。