SSH自动断开主因是空闲超时机制,服务端需配置ClientAliveInterval 60、ClientAliveCountMax 3、TCPKeepAlive yes并重启sshd;客户端可配ServerAliveInterval 60与ServerAliveCountMax 3;仍断开则排查iptables、tmux/screen超时或中间网络设备限制。

SSH连接为什么老是自动断开
不是服务器“抽风”,是客户端或服务端默认启用了超时踢出机制。常见现象是:终端静置 5–15 分钟后突然显示 Connection closed by remote host 或直接黑屏。本质是 TCP 连接空闲太久,中间网络设备(如 NAT 网关、防火墙)主动清除了连接状态。
服务端配置 KeepAlive(推荐长期生效)
改 /etc/ssh/sshd_config 是最彻底的方式,影响所有 SSH 客户端连接。关键不是“加心跳”,而是让服务端主动探测连接是否还活着,并在失效后及时释放资源。
需要设置三行(缺一不可):
-
ClientAliveInterval 60:服务端每 60 秒发一次空包探测 -
ClientAliveCountMax 3:连续 3 次没收到响应才断开(即最多容忍 3×60=180 秒无响应) -
TCPKeepAlive yes:启用底层 TCP keepalive(辅助作用,防中间设备断连)
改完必须重启服务:sudo systemctl restart sshd。注意:某些云厂商(如阿里云 ECS)的自定义镜像可能禁用 ClientAlive*,需确认配置未被覆盖。
客户端配置避免改服务端权限
如果你只有普通用户权限,或者只是临时调试某台机器,直接在本地 SSH 配置里加心跳更安全。编辑 ~/.ssh/config(没有就新建),针对目标主机写:
Host example.com
HostName example.com
User myuser
ServerAliveInterval 60
ServerAliveCountMax 3
注意:ServerAlive* 是客户端行为,只对你本机发起的连接生效;ServerAliveInterval 必须是整数秒,不能写 0.5m 这类格式;如果用了 ProxyCommand 或跳板机,心跳可能被代理层拦截,此时得在跳板机上也配。
为什么开了心跳还是断?排查顺序
常见真凶往往不在 SSH 层:
- 检查是否触发了
iptables或nftables的连接跟踪超时(如nf_conntrack_tcp_timeout_established默认 432000 秒,但有些嵌入式设备设成 300 秒) - 确认终端复用(
tmux/screen)没被误杀——它们自身也有空闲超时,和 SSH 无关 - 某些企业网络会深度检测并重置“无数据交互”的长连接,这时只能靠应用层心跳(比如在 shell 里跑
while :; do echo -n .; sleep 30; done)
真正难搞的是链路中存在多层 NAT + 状态防火墙 + 低配网关的组合,这时候光调 SSH 参数没用,得协调网络侧调整会话保持时间。










