ssh连接不掉线需启用保活机制,必须同时配置serveraliveinterval(推荐45或60)与serveralivecountmax(建议5),写入~/.ssh/config按host精确设置,并设权限为600。

SSH 连接超时不是“等太久才断”,而是中间网络设备(如防火墙、NAT 网关)在连接空闲后主动清理了会话。真正有效的办法是让客户端定期发心跳包,让链路始终“有流量”,而 ServerAliveInterval 就是控制这个心跳频率的核心参数。
ServerAliveInterval 必须配合 ServerAliveCountMax 使用
单独设置 ServerAliveInterval 没有效果。它只定义“每隔多少秒发一次心跳”,但不决定“发几次没回应就断”。后者由 ServerAliveCountMax 控制。
- ServerAliveInterval 设为 60:客户端每分钟向服务器发一个空包
- ServerAliveCountMax 设为 5:最多容忍 5 次无响应,即实际保活窗口为 5 × 60 = 300 秒(5 分钟)
- 设为 0 表示禁用该机制,不是“永不超时”
推荐值与避坑要点
45 或 60 是最稳妥的间隔值,兼顾兼容性与稳定性:
- 太小(如 10):可能触发家用光猫或企业 NAT 的限速或丢包
- 太大(如 120):常见防火墙默认超时为 300 秒,留不出探测余量,容易被静默中断
- ServerAliveCountMax 建议设为 5:比默认的 3 更耐网络抖动,又不会过度延迟断连判断
配置位置和权限要求
应写入用户级配置文件 ~/.ssh/config,按 Host 精确匹配更安全:
Host prod-server
HostName 10.20.30.40
User admin
ServerAliveInterval 60
ServerAliveCountMax 5
- 不要直接改 /etc/ssh/ssh_config(系统级),影响所有用户且易被覆盖
- 必须执行 chmod 600 ~/.ssh/config,否则 SSH 会忽略该文件
- 临时测试可用命令行:
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=5 user@host
为什么配了还是掉线?检查这三个地方
即使参数正确,掉线仍可能发生,问题常不在 SSH 配置本身:
-
GSSAPIAuthentication yes:多数内网未部署 Kerberos,会导致密码输入后卡顿 10–30 秒,误判为超时。解决:在
/etc/ssh/sshd_config中加GSSAPIAuthentication no并重启 sshd -
TMOUT 变量:Shell 自身的空闲退出(如
echo $TMOUT输出 600 表示 10 分钟自动退出)。临时禁用:unset TMOUT;永久关闭:在~/.bashrc加export TMOUT=0 - 终端软件自带保活开关:iTerm2、MobaXterm、SecureCRT 等都有独立的 Keepalive 设置,需一并开启或对齐参数











