必须同时配置ClientAliveInterval与ClientAliveCountMax,前者设300秒心跳间隔,后者设3次容错,总超时15分钟;缺一不可,且需取消注释、重启sshd生效。

要让 SSH 服务真正防住“死连接”,光设 ClientAliveInterval 不够,必须搭配 ClientAliveCountMax 并确保服务端主动探测生效——它不是“延长超时”,而是定期发加密心跳确认客户端是否真实在线。
必须配对:ClientAliveInterval 和 ClientAliveCountMax
这两个参数在 /etc/ssh/sshd_config 中协同工作:
- ClientAliveInterval:sshd 每隔多少秒向客户端发一次心跳包(单位:秒),推荐值 300(5 分钟)或 60(1 分钟);设为 0 表示禁用探测
- ClientAliveCountMax:允许连续几次心跳无响应才断开连接,推荐值 3(配合 300 就是 15 分钟总容忍);设为 0 表示无限重试,不推荐
- 总空闲容忍时间 = ClientAliveInterval × ClientAliveCountMax,例如 300 × 3 = 900 秒(15 分钟)
配置时容易踩的坑
写错格式或忽略细节,会导致配置完全不生效:
- 必须取消注释:检查行首不能有 #,也不能写成 ClientAliveInterval=300(等号是语法错误,sshd 启动会失败)
- 别照搬激进值:某些云镜像默认设了 ClientAliveInterval 10,这等于 10 秒没响应就断,先用 grep -E "^ClientAlive" /etc/ssh/sshd_config 查清现状再覆盖
- TCPKeepAlive 建议开启:加一行 TCPKeepAlive yes,作为底层 TCP 层兜底,和上层加密心跳形成双保险
改完必须重启 sshd 才能生效
reload 有时不加载心跳参数,尤其在 systemd-logind 干预时:
- 执行 sudo systemctl restart sshd(注意:当前 SSH 会话会断开)
- 验证语法无误:运行 sshd -t,返回空表示配置格式正确
- 但语法对 ≠ 功能通,真实有效性需后续验证
怎么确认它真在起作用
别只看变量有没有、配置有没有写对,要分层验证:
- 网络层验证:另一台机器连上后,执行 sudo ss -tnp | grep :22 确认 ESTABLISHED 连接存在;然后拔网线或关掉客户端,等待超过 ClientAliveInterval × ClientAliveCountMax 时间,再查连接是否消失
- 干扰项排查:systemd-logind 的 IdleAction=terminate 可能抢在 sshd 前干掉会话,用 loginctl show-user $USER | grep Idle 检查


















