再探 ssh 和 VScode((双重)远程转发和本地转发)
注:本文使用的 7890、7891、7892 端口仅用于区分,实际转发时两端端口号可以相同。
一、通过 SSH 指令实现端口转发
命令行下进行端口转发,核心在于理解 -R 和 -L 参数。
1. 远程转发(反向代理 / -R)
应用场景:让远程服务器使用本机的端口。例如让服务器走本地的 VPN 代理(详见之前写的 转发到本地 VPN 工具教程)。
基本指令:
-R 代表 RemoteForward(远程转发)。意思是把远程的某个端口,映射到本地的目标端口。
格式如下:
# ssh -R <远程监听端口>:<目标主机>:<目标端口> 远程主机
ssh -R 7891:localhost:7890 RemoteB
设本机为 LocalA。执行上述指令后,在 RemoteB 上访问 7891 端口,就等价于访问 LocalA 的 7890 端口。
(注:7891 前面省略了 IP,默认为绑定在远程的 localhost。如果不省略则形如 192.168.1.100:7891:localhost:7890)
双重远程转发:
遇到需要通过登录节点跳转到计算节点的情况,可以连用 -R 实现双层转发。
先用上述方法登录到 RemoteB,再在 RemoteB 的终端里用同样的方法登录 RemoteC:
ssh -R 7892:localhost:7891 RemoteC
此时:在 RemoteC 上访问 7892 -> 等于访问 RemoteB 的 7891 -> 等于访问 LocalA 的 7890。
2. 本地转发(前向代理 / -L)
应用场景:在本地直接访问远程服务器上的服务。例如远程节点跑了 TensorBoard 或 Jupyter 后端,想在本地浏览器或编辑器直接打开。
基本指令:
-L 代表 LocalForward(本地转发)。意思是把本地的某个端口,映射到远程的目标端口。
格式如下:
# ssh -L <本地监听端口>:<目标主机>:<目标端口> 远程主机
ssh -L 7890:localhost:7891 RemoteB
执行后,访问本机 LocalA 的 7890 端口,就等价于访问 RemoteB 的 7891 端口。
二、VSCode 中的端口转发配置
如果在 VSCode 的 ~/.ssh/config 中配置端口转发,参数的顺序其实是高度统一的,永远遵循 <监听端> <目标端> 的规律:
- 本地转发:在本地开端口,送到远程
LocalForward local_socket remote_socket - 远程转发:在远程开端口,送回本地
RemoteForward remote_socket local_socket
带着这个公式来看配置文件,就会非常清晰。
1. 远程转发配置(RemoteForward)
在对应的 Host 下添加 RemoteForward:
Host RemoteB
HostName RemoteB
User user_of_RemoteB
Port 22
# 语法: RemoteForward remote_socket local_socket
RemoteForward localhost:7891 localhost:7890
2. 本地转发配置(LocalForward)
同理,添加 LocalForward:
Host RemoteB
HostName RemoteB
User user_of_RemoteB
Port 22
# 语法: LocalForward local_socket remote_socket
LocalForward localhost:7890 localhost:7891
3. VSCode 自带的图形化转发
对于本地转发,日常开发中往往不需要去手动写 config 文件,可以依赖 VSCode 的图形界面:
- 单层转发:跑完 TensorBoard 或 Jupyter 指令后,VSCode 通常会自动检测并帮你完成转发。你可以在编辑器底部的 [终端] 旁边的 [端口] (Ports) 面板中看到,也可以手动在这里添加端口映射。
- 双重本地转发(本机 -> 登录节点 -> 计算节点):第一层连接登录节点时,不需要在 config 预先设置
-L或LocalForward。直接连上第二层(计算节点)之后,在底部的 [端口] 面板中手动添加一次所需端口即可,VSCode 会自动处理这层嵌套关系。

浙公网安备 33010602011771号