批量管理服务器时 SSH 心跳包丢失怎么配置保持连接

文章导读
在批量管理服务器场景下,最推荐在客户端配置文件 ~/.ssh/config 中开启心跳保活,这样既能避免连接中断,又不会影响服务器上的其他用户。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在批量管理服务器场景下,最推荐在客户端配置文件 ~/.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 会拒绝读取。

批量管理服务器时 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. 实际空闲测试

批量管理服务器时 SSH 心跳包丢失怎么配置保持连接

连接成功后,不要操作键盘,离开电脑 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