这是一份为您定制的最终操作文档。针对您的 MFA(安全码)环境、VS Code 远程开发需求以及链路不稳定的痛点,我们将通过核心配置优化与隧道解耦来实现最高程度的稳定性。
请将以下内容覆盖或合并到您的本地 ~/.ssh/config 文件中。这份配置通过激进的心跳检测和长效端口复用来对抗网络抖动。
Host dev1
# 基础连接信息
HostName dev1_ip
User your_user
# [核心] 反向隧道配置:将远程 4000 转发至本地 127.0.0.1:4000
RemoteForward 4000 127.0.0.1:4000
# [核心] 端口复用配置:一次验证码,多路复用
ControlMaster auto
ControlPath ~/.ssh/sockets/%C
# 即使主窗口关闭,连接也在后台保持 12 小时
ControlPersist 12h
# [核心] 链路保活配置:对抗网络抖动和防火墙切断
# 每 15 秒发送一次心跳
ServerAliveInterval 15
# 允许连续 10 次心跳失败(约 150 秒窗口期),给网络重连留足时间
ServerAliveCountMax 10
# 强制开启 TCP 层面保活
TCPKeepAlive yes
# 优化数据包优先级,减少被丢弃概率
IPQoS throughput
# 自动创建目录权限提示
# 请确保本地已执行: mkdir -p ~/.ssh/sockets
为了防止 VS Code 闪断导致整个隧道崩溃,建议将“反向隧道”与“日常编码”解耦。
打开一个独立的终端窗口(如 macOS 的 Terminal 或 Windows 的 PowerShell),输入:
ssh dev1 "while true; do date; sleep 60; done"
- 动作: 此时会提示你输入密码和安全码。
- 作用: 这个窗口通过一个死循环不断打印时间,确保 SSH 链路永远处于“活跃”状态,不被防火墙判定为“空闲”。
- 效果: 只要这个窗口不关,
dev1上的 4000 端口转发就会一直有效。
直接打开 VS Code 并连接 dev1。
- 效果: 由于启用了
ControlMaster,VS Code 会瞬间秒连,不需要再次输入安全码。 - 稳定性: 即使 VS Code 因为插件崩溃或窗口重载,只要第一步的“守卫”窗口还在,连接就不会断,无需重输验证码。
如果你不希望桌面上多出一个“守卫”窗口,可以采用后台挂载。
ssh -fnN dev1
-
参数解释:
-
-f: 验证完安全码后,立即转入后台运行。 -
-nN: 不执行任何远程命令,仅用于建立隧道。 -
操作流: 输入安全码 -> 回车 -> 终端看起来结束了,但其实 Master 连接已在后台。接着打开 VS Code 即可。
当网络发生剧烈波动,导致连接“假死”或提示端口已占用时,请执行以下“重置”三部曲:
- 清理本地 Socket(解决无法连接):
rm -f ~/.ssh/sockets/*
- 清理远程僵尸进程(解决端口占用):
如果在连接时看到
Warning: remote port forwarding failed,说明远程还留着旧进程。在远程终端执行:
# 杀死旧的 SSH 会话
pkill -u your_user sshd
- 检查本地服务:
确保本地服务仍然监听在
127.0.0.1:4000。
- 安全性: 本地仅监听
127.0.0.1,确保只有你自己的 SSH 隧道能触达服务。 - 无感化: 配合
ControlMaster,每日只需在早晨开启一次“守卫”窗口并输入一次安全码,全天 VS Code 工作均无需再次验证。 - 稳定性: 通过
ServerAliveInterval 15和ControlPersist 12h极大延长了链路的容错能力。