再探 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 预先设置 -LLocalForward。直接连上第二层(计算节点)之后,在底部的 [端口] 面板中手动添加一次所需端口即可,VSCode 会自动处理这层嵌套关系。
posted @ 2024-11-04 23:56  Cold_Chair  阅读(3416)  评论(4)    收藏  举报