ssh连接频繁断开主因是心跳与空闲超时配置不当,需分别设置服务端(clientaliveinterval/countmax)和客户端(serveraliveinterval/countmax)保活参数,并排查防火墙、连接跟踪、跳板机及终端工具干扰。

SSH连接频繁断开,核心问题通常出在心跳检测没配好,或空闲超时机制生效。解决的关键是分清“网络链路保活”和“会话空闲断开”两类机制,并分别配置。
服务端主动探测:防中间设备静默断连
这是最推荐的统一方案,改一次,所有客户端都受益。编辑服务器上的 /etc/ssh/sshd_config,确保以下三项启用:
- TCPKeepAlive yes:开启内核级TCP保活,作为底层兜底
- ClientAliveInterval 60:服务端每60秒向客户端发一次探测包(建议30–120秒区间)
- ClientAliveCountMax 3:连续3次未收到响应才断开(即最多容忍3分钟无响应)
保存后执行 sudo systemctl reload sshd 生效。注意:ClientAliveInterval=0 表示禁用探测,务必确认不是注释状态或设为0。
客户端主动保活:适配无服务端权限场景
当你只有普通用户权限,或只想为特定主机优化,就在本地 ~/.ssh/config 中配置:
- 对某台主机单独设置:
Host myserver
HostName 192.168.1.100
User admin
ServerAliveInterval 60
ServerAliveCountMax 3 - 对所有主机统一生效:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3 - 临时连接可用命令行:
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 user@host
注意:ServerAlive* 参数只在客户端生效,且 OpenSSH 5.4 以前版本不支持,可用 ssh -V 检查版本。
Shell层防误杀:避开TMOUT导致的假断连
即使网络一直通,终端也可能因 Shell 自身超时退出。检查是否启用了空闲限制:
- 运行 echo $TMOUT,若输出数字(如600),说明10分钟无操作就退出
- 临时禁用:unset TMOUT
- 永久禁用(仅限可信环境):
在 ~/.bashrc 末尾添加 TMOUT=0,再执行 source ~/.bashrc
更稳妥的做法是搭配 tmux 或 screen 使用——它们能维持会话状态,SSH断了重连也能恢复。
常见失效原因排查
心跳配置看似正确却仍断连,真凶往往不在 SSH 配置本身:
- 企业防火墙(如 Palo Alto、深信服)可能过滤 SSH keepalive 报文,需放行类型为 SSH_MSG_GLOBAL_REQUEST 的消息
- iptables/nftables 的连接跟踪超时(如 nf_conntrack_tcp_timeout_established 被设为300秒)
- 跳板机或 ProxyCommand 中间层未同步配置心跳,导致保活包被截断
- 终端工具(如 MobaXterm、FinalShell)自带 KeepAlive 开关,优先检查图形界面设置是否冲突
不复杂但容易忽略










