Skip to content

Instantly share code, notes, and snippets.

@zivee
Created March 11, 2026 18:52
Show Gist options
  • Select an option

  • Save zivee/b7697ff530eac0e80da85ad4465d5b03 to your computer and use it in GitHub Desktop.

Select an option

Save zivee/b7697ff530eac0e80da85ad4465d5b03 to your computer and use it in GitHub Desktop.

这是一份为您定制的最终操作文档。针对您的 MFA(安全码)环境、VS Code 远程开发需求以及链路不稳定的痛点,我们将通过核心配置优化隧道解耦来实现最高程度的稳定性。


🛠️ SSH 反向隧道稳定性终极方案

1. 核心配置文件 (~/.ssh/config)

请将以下内容覆盖或合并到您的本地 ~/.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


2. 操作步骤:方案 A - 隧道守卫模式(最推荐,最稳)

为了防止 VS Code 闪断导致整个隧道崩溃,建议将“反向隧道”与“日常编码”解耦。

第一步:建立“隧道守卫”连接

打开一个独立的终端窗口(如 macOS 的 Terminal 或 Windows 的 PowerShell),输入:

ssh dev1 "while true; do date; sleep 60; done"
  • 动作: 此时会提示你输入密码和安全码
  • 作用: 这个窗口通过一个死循环不断打印时间,确保 SSH 链路永远处于“活跃”状态,不被防火墙判定为“空闲”。
  • 效果: 只要这个窗口不关,dev1 上的 4000 端口转发就会一直有效。

第二步:启动 VS Code

直接打开 VS Code 并连接 dev1

  • 效果: 由于启用了 ControlMaster,VS Code 会瞬间秒连,不需要再次输入安全码
  • 稳定性: 即使 VS Code 因为插件崩溃或窗口重载,只要第一步的“守卫”窗口还在,连接就不会断,无需重输验证码。

3. 操作步骤:方案 B - 纯后台静默模式(追求清爽)

如果你不希望桌面上多出一个“守卫”窗口,可以采用后台挂载。

执行命令:

ssh -fnN dev1
  • 参数解释:

  • -f: 验证完安全码后,立即转入后台运行。

  • -nN: 不执行任何远程命令,仅用于建立隧道。

  • 操作流: 输入安全码 -> 回车 -> 终端看起来结束了,但其实 Master 连接已在后台。接着打开 VS Code 即可。


4. 故障排除(遇到断连或端口占用怎么办?)

当网络发生剧烈波动,导致连接“假死”或提示端口已占用时,请执行以下“重置”三部曲:

  1. 清理本地 Socket(解决无法连接):
rm -f ~/.ssh/sockets/*
  1. 清理远程僵尸进程(解决端口占用): 如果在连接时看到 Warning: remote port forwarding failed,说明远程还留着旧进程。在远程终端执行:
# 杀死旧的 SSH 会话
pkill -u your_user sshd
  1. 检查本地服务: 确保本地服务仍然监听在 127.0.0.1:4000

总结

  • 安全性: 本地仅监听 127.0.0.1,确保只有你自己的 SSH 隧道能触达服务。
  • 无感化: 配合 ControlMaster,每日只需在早晨开启一次“守卫”窗口并输入一次安全码,全天 VS Code 工作均无需再次验证。
  • 稳定性: 通过 ServerAliveInterval 15ControlPersist 12h 极大延长了链路的容错能力。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment