必须同时配置ClientAliveInterval与ClientAliveCountMax,缺一不可;前者设300秒心跳间隔,后者设3次容错,总超时15分钟,配合ServerAliveInterval 45和ServerAliveCountMax 5客户端兜底,并禁用TMOUT防假断连。

Linux SSH 安全防御中,连接限制与空闲断开不是可选项,而是生产环境的底线配置。只靠密码或密钥认证远远不够——未主动管理会话生命周期,就等于把“已登录”的门虚掩着。
服务端强制空闲断连(核心防线)
这是最可靠、全局生效的方式,直接作用于 sshd 进程:
- 编辑
/etc/ssh/sshd_config,取消注释并设置两行(必须同时存在):ClientAliveInterval 300(每 5 分钟发一次加密心跳)ClientAliveCountMax 3(连续 3 次无响应即断开,总容忍约 15 分钟) -
切勿设
ClientAliveCountMax 0:这会导致首次心跳失败就立即踢人,极易被网络抖动误杀 - 改完必须执行
sudo systemctl restart sshd;仅 reload 可能不生效
客户端主动保活(补充兜底)
当你无法修改服务器,或只想对特定主机生效时,用本地客户端配置:
- 编辑
~/.ssh/config,添加(注意权限必须为600):Host *ServerAliveInterval 45ServerAliveCountMax 5 - 该组合兼顾兼容性:45 秒探测频次能绕过多数家用光猫的 5 分钟清理机制,5 次容错避免误断
- 若只针对某台服务器,用具体 Host 名(如
Host prod-db),避免全局影响其他连接
防 Shell 层“假断连”(常被忽略)
TMOUT 是 shell 自己的计时器,和 SSH 连接状态无关,但会让人误以为是 SSH 断开了:
- 运行
echo $TMOUT,若输出数字(如 600),说明 Bash/Zsh 会在 10 分钟无键盘输入后自动退出 - 临时禁用:
unset TMOUT;永久关闭可在~/.bashrc中加TMOUT=0 - 图形终端(GNOME Terminal、iTerm2 等)通常完全忽略
TMOUT,但会自带“空闲断开”开关,需单独检查关闭
排查中间设备干扰(真实掉线元凶)
即使两端保活都配对,连接仍可能被掐断,重点查三处:
- 家用光猫/NAT 网关:默认空闲超时多为 300–600 秒,需登录管理界面调大或关闭“TCP 连接空闲清理”
- 终端工具自身 Keepalive:MobaXterm、SecureCRT、PuTTY 都有独立设置,优先级高于 SSH 配置,务必确认是否启用并设为发送 NO-OP
-
跳板链路:若使用
ProxyJump或自定义代理,客户端心跳只作用于最后一跳,前面链路仍可能静默中断


















