SSH 连接被服务端主动断开的典型表现
你执行命令到一半,终端突然卡住几秒后显示 Connection closed by remote host 或直接断连,且本地 ssh 进程退出。这不是网络抖动导致的临时丢包,而是服务端(sshd)主动终止了连接。
根本原因通常是服务端设置了空闲超时策略。OpenSSH 默认启用 ClientAliveInterval 和 ClientAliveCountMax 机制:若客户端在指定时间内未发任何数据包,sshd 会发送探测包;连续几次无响应就 kill 掉该连接。
常见错误配置包括:
-
ClientAliveInterval 0(禁用探测)但搭配了TCPKeepAlive no,导致内核无法感知链路异常 -
ClientAliveInterval 60且ClientAliveCountMax 3,意味着最多 3 分钟无交互就会断连 -
MaxStartups或MaxSessions被设得过低,高并发时新连接被拒绝或旧连接被踢出
如何确认是服务端配置导致的断连
登录服务器后检查 /etc/ssh/sshd_config 中的关键项,并比对当前生效值:
运行 sudo sshd -T | grep -E "(clientalive|tcpkeepalive|maxstart|maxsess)" 获取实际加载的配置(注意:此命令需 root 权限,且不校验语法,仅输出合并后的结果)。
重点关注以下字段是否被显式修改过:
-
ClientAliveInterval:非零值即启用保活探测,单位秒 -
ClientAliveCountMax:默认 3,表示允许连续丢失多少次探测响应 -
TCPKeepAlive:设为yes可让内核在传输层维持连接,但对 NAT 网关不友好 -
MaxStartups:如设为10:30:60表示最多 10 个未认证连接,超过后按概率丢弃
如果发现 ClientAliveInterval 是 60、120 或其他较小值,基本可锁定问题来源。