VSCode Remote-SSH 断连主因是客户端未配置 SSH 心跳,需同时设置 ServerAliveInterval 和 ServerAliveCountMax;服务端需配 ClientAliveInterval 与 ClientAliveCountMax;VSCode 应启用 useLocalServer 并检查日志确认配置生效。
客户端配置 SSH 心跳:ServerAliveInterval 和 ServerAliveCountMax 必须配对用
VSCode Remote-SSH 断连,90% 是因为本地 SSH 客户端根本没发心跳包——不是服务器“不给活”,是你没告诉它“我还在线”。ServerAliveInterval 控制发送间隔(单位秒),ServerAliveCountMax 控制容忍丢包次数,两者缺一不可。
常见错误现象:
- 改了
ServerAliveInterval但没设ServerAliveCountMax,结果一丢包立刻断开 - 在命令行用
ssh -o ServerAliveInterval=60 user@host临时连接,却忘了加-o ServerAliveCountMax=3 - 把配置写在
~/.ssh/config里,但 Host 别名写错了(比如用了 IP 而非 HostName),导致配置未生效
实操建议:
- 编辑
~/.ssh/config,添加通用规则:Host *
ServerAliveInterval 60
ServerAliveCountMax 3 - 若只针对某台主机,用具体别名更安全:
Host prod-server
HostName 10.0.2.5
User ops
ServerAliveInterval 45
ServerAliveCountMax 5 - 参数差异:
ServerAliveInterval 60表示每分钟探一次;ServerAliveCountMax 3意味着最多容忍 3 分钟无响应——超时后客户端主动断开,避免卡死
服务端配置 SSH 心跳:ClientAliveInterval 不等于客户端的“镜像”
服务端的 ClientAliveInterval 和 ClientAliveCountMax 看似和客户端对称,但作用对象相反:它是服务器主动探测“你还在不在”,不是转发你的心跳。很多运维误以为只要客户端配了,服务端就不用动,结果中间防火墙或云厂商 NAT 网关照样掐断连接。
使用场景:
- 你在阿里云/腾讯云上跑开发机,公网 IP 经过 SNAT,会话空闲 5–10 分钟就被回收
- 公司内网有统一出口防火墙,默认 TCP 连接空闲超时为 300 秒
实操建议:
- 编辑
/etc/ssh/sshd_config,取消注释并设置:ClientAliveInterval 300
ClientAliveCountMax 2(即每 5 分钟探一次,两次失败后断开)
- 不要盲目抄 “60+3”:服务端间隔太短(如 30 秒)会增加无效流量;太大(如 1800 秒)则起不到保活作用
-
ClientAliveInterval仅对协议 v2 生效,且必须配合TCPKeepAlive yes(默认已开启)才可靠 - 改完务必执行
sudo systemctl restart sshd,否则配置不生效
VSCode Remote-SSH 插件的隐藏开关:remote.ssh.useLocalServer 影响隧道稳定性
VSCode Remote-SSH 不是直接复用你的终端 SSH 连接,而是启动一个独立的 SSH 隧道进程。这个进程如果被系统休眠、资源限制或插件自身 Bug 干扰,就会静默掉线——此时即使 SSH 配置全对,也救不了。