在批量管理服务器场景下,最推荐在客户端配置文件 ~/.ssh/config 中开启心跳保活,这样既能避免连接中断,又不会影响服务器上的其他用户。
先说结论:优先在管理机(客户端)配置 SSH 心跳参数,除非你有权限且确认需要全局修改服务器端设置。
- 适合:运维人员批量操作、长时间空闲的 SSH 会话、处于 NAT 网关后的连接环境
- 先准备:确认本地 ~/.ssh 目录权限及 SSH 客户端版本支持配置选项
- 验收:配置完成后空闲等待数分钟,确认连接未自动断开且无报错
命令速用版
如果你只是想快速临时测试,可以在命令中直接加上参数:
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 user@host
如果要永久生效,编辑本地配置文件:
echo -e "Host *\n ServerAliveInterval 60\n ServerAliveCountMax 3" >> ~/.ssh/config chmod 600 ~/.ssh/config
为什么会这样
SSH 连接断开通常不是因为服务器挂了,而是因为中间的网络设备(如防火墙、NAT 路由器)认为这条连接太久没有数据流动,主动切断了会话。SSH 协议本身提供了应用层的心跳机制,客户端定期发送一个加密的空包给服务器,告诉网络设备“这条线还在用”。
这里有两个层面的配置:客户端发出的心跳(ServerAliveInterval)和服务器端要求客户端回应的心跳(ClientAliveInterval)。批量管理时,我们通常控制的是客户端行为,因此修改本地配置最安全。
分步处理
1. 检查本地配置文件
查看是否存在 ~/.ssh/config 文件,如果没有就创建一个。确保文件权限是 600,否则 SSH 会拒绝读取。
ls -l ~/.ssh/config chmod 600 ~/.ssh/config
2. 写入心跳配置
在配置文件中添加以下内容。Host * 表示对所有服务器生效,你也可以指定特定 IP 段。
Host *
ServerAliveInterval 60
ServerAliveCountMax 3参数含义:每 60 秒发送一次心跳,如果连续 3 次没有收到回应,则断开连接。这能防止假死。
3. 服务器端配置(可选)
如果你希望服务器主动检测客户端是否存活,需要修改服务器上的 /etc/ssh/sshd_config。这需要 root 权限,且修改后需重启 sshd 服务,会影响所有用户,生产环境请谨慎。
# 在服务器上编辑 ClientAliveInterval 60 ClientAliveCountMax 3
怎么验证是否生效
1. verbose 模式观察
使用 -v 参数连接服务器,空闲一段时间后,观察终端输出。如果配置生效,你会定期看到 debug 信息表明发送了 keepalive 包。
ssh -v user@host
2. 实际空闲测试
连接成功后,不要操作键盘,离开电脑 5 到 10 分钟。回来后按回车,如果 prompt 立即出现且没有显示“Connection closed”或“Broken pipe”,说明心跳配置成功阻止了超时断开。
常见坑
1. 配置文件权限错误
SSH 对权限非常敏感。如果 ~/.ssh/config 权限过于开放(如 777 或 644),SSH 客户端会忽略该文件并报错。务必设置为 600。
2. 服务器端全局修改风险
在 /etc/ssh/sshd_config 中修改 ClientAliveInterval 会影响登录这台服务器的所有用户。如果设置过短(如 5 秒),可能会增加服务器负载或被安全策略误判。公开资料中没有看到可靠的量化数据说明具体负载影响,但通常建议不低于 60 秒。
3. 网络层限制
有些严格的企业防火墙会丢弃非标准端口的 SSH 心跳包,或者强制限制 TCP 连接时长。这种情况下,应用层心跳可能无效,需要结合 TCPKeepAlive yes 一起尝试,但 TCP 层心跳容易被网络设备伪造,安全性略低于 SSH 层心跳。
参考来源
- OpenSSH Manual, ssh_config(5), "ServerAliveInterval", "ServerAliveCountMax". URL: https://man7.org/linux/man-pages/man5/ssh_config.5.html
- OpenSSH Manual, sshd_config(5), "ClientAliveInterval", "ClientAliveCountMax". URL: https://man7.org/linux/man-pages/man5/sshd_config.5.html