0. 背景 : 拒绝“远程套娃”
最近搞定了家里的网络环境,通过内网穿透映射到了公司的办公机(Ubuntu)。原本的操作链路是:家里 Windows -> SSH/向日葵 -> 公司办公机 -> SSH -> 内网算力服务器。
这种“套娃”式开发极其痛苦:不仅操作有延迟,而且无法直接使用本地 VS Code 的强大插件生态来调试内网服务器上的代码。
其实,利用 OpenSSH 的 ProxyJump 功能,我们完全可以打通这条链路,实现 VS Code (Home) -> 算力服务器 的丝滑直连,就像服务器摆在家里一样。
本文记录了在 Windows 客户端下的配置细节,以及如何解决 Windows 缺失 ssh-copy-id 的痛点。
1. 架构梳理与准备
我们要打通的链路如下:
- 本地端 (Client):Windows 电脑,安装 VS Code。
- 跳板机 (Jump Host):公司办公机 (Ubuntu),已做公网映射。
- 假设公网映射 IP:
x.x.x.x - 映射端口:
9000 - 内网用户名:
jump_user
- 假设公网映射 IP:
- 目标机 (Target):内网两台 GPU 服务器
llm和flux。- 内网 IP 段:
172.26.x.x - 端口:
8022
- 内网 IP 段:
2. 配置文件 : 核心 ProxyJump 设定
在 Windows 本地,打开 VS Code,F1 输入 Remote-SSH: Open Configuration File,编辑 C:\Users\你的用户名\.ssh\config。
这里最大的技巧在于使用 ProxyJump 指令,让 SSH 自动处理跳转逻辑,而无需手动分步连接。
# --- 1. 跳板机(公司办公电脑) ---
Host jump-pc
# 内网穿透的公网 IP
HostName x.x.x.x
# 映射出来的端口
Port 9000
User jump_user
# 建议开启压缩,提升内网穿透下的传输速度
Compression yes
# --- 2. 目标服务器 LLM ---
Host llm
# 这里填公司内网的真实 IP
HostName 172.26.x.156
Port 8022
User root
# 【核心配置】指定通过 jump-pc 跳转
ProxyJump jump-pc
# --- 3. 目标服务器 FLUX ---
Host flux
HostName 172.26.x.133
Port 8022
User root
ProxyJump jump-pc
# 注意:如果你本地 Windows 没有在 7890 跑代理软件,
# 建议先注释掉下面这行,否则连接会报端口转发错误
# RemoteForward 8888 127.0.0.1:7890
注意:
RemoteForward是反向代理,用于让服务器借用本地的网络环境(如拉取 HuggingFace 模型)。如果本地没开对应代理软件,开启此项会导致 SSH 连接时报 Warning,虽不影响连接,但看着心烦。
3. 密钥分发 : 解决 Windows 无 ssh-copy-id 问题
配置好 Config 后,理论上已经可以连接了,但每次都需要输入两次密码(跳板机一次,目标机一次),体验极差。我们需要配置 SSH Key 免密登录。
Linux/Mac 下通常用 ssh-copy-id 一键搞定,但 Windows 默认没有这个命令。我们可以利用 PowerShell 的管道命令实现同样的效果。
前提:确保你在 Windows 上已经有了公钥(没有则运行 ssh-keygen 一路回车)。
3.1 步骤一:打通跳板机 (Windows -> Jump Host)
打开 PowerShell,执行以下命令(注意替换真实 IP):
# 读取本地公钥 -> 通过 SSH 发送 -> 追加到远程 authorized_keys
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh -p 9000 jump_user@x.x.x.x "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
输入密码后,尝试 ssh jump-pc,如果直接进入,说明第一层打通成功。
3.2 步骤二:隔山打牛 (Windows -> Target Host)
这里有一个很酷的技巧:既然我们在 Config 里配置了 ProxyJump,SSH 命令也会自动遵循这个路径。我们可以直接把公钥“穿透”发给内网服务器。
发送给 llm 服务器:
# SSH 会自动先连跳板机,再连 llm,最后执行写入
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh llm "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
发送给 flux 服务器:
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh flux "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
提示:执行上述命令时,因为第一层已经免密,你只需要输入目标服务器(root)的密码即可。
4. 最终效果
重启 VS Code,点击左侧 Remote Explorer。
你会发现 llm 和 flux 已经在列表里了。直接点击连接,VS Code 左下角状态栏会经历 Opening Remote -> Setting up SSH Host,几秒钟后,你就能直接看到内网服务器的文件目录。
现在,调试代码、监控 GPU 状态 (nvtop),所有操作都在你本地的 VS Code 界面内完成,中间的跳板机对你来说已经是完全透明的了。


发表回复