SSH 连接在空闲一段时间后经常会被断开,这在远程服务器管理中非常不便。通过配置 keepalive 机制,可以有效保持 SSH 会话的活跃状态。

问题原因

SSH 连接断开通常由以下原因导致:

  1. 防火墙/NAT 超时:中间网络设备清理长时间无数据的连接
  2. 服务端超时:SSH 服务器配置了空闲超时
  3. 网络不稳定:连接中断但双方都不知道

客户端配置

编辑 ~/.ssh/config 文件:

1
2
3
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

参数说明

参数 说明
ServerAliveInterval 60 每 60 秒发送一次心跳包
ServerAliveCountMax 3 3 次无响应后断开连接

实际效果:每 60 秒发送心跳,如果连续 3 次(180 秒)无响应则断开。正常情况下连接会一直保持。

针对特定主机配置

1
2
3
4
5
6
7
Host myserver.example.com
    ServerAliveInterval 30
    ServerAliveCountMax 5

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

服务端配置

编辑 /etc/ssh/sshd_config 文件:

1
2
ClientAliveInterval 60
ClientAliveCountMax 3

参数说明

参数 说明
ClientAliveInterval 60 服务端每 60 秒检查客户端是否存活
ClientAliveCountMax 3 3 次无响应后断开连接

配置后重启 SSH 服务:

1
2
3
sudo systemctl reload sshd
# 或
sudo service sshd reload

临时使用(命令行)

不修改配置文件,临时启用 keepalive:

1
ssh -o ServerAliveInterval=60 user@host

客户端 vs 服务端配置

配置位置 发起方 适用场景
客户端 客户端主动发心跳 个人使用,无需服务端权限
服务端 服务端主动检查 管理多用户,统一策略

建议:两端都配置,形成双向检测,效果更好。

验证配置

查看当前生效的配置:

1
2
3
4
5
6
# 查看客户端配置
ssh -G example.com | grep -E "serveralive"

# 输出示例
serveraliveinterval 60
serveralivecountmax 3

注意事项

  1. 间隔不宜过短:建议 30-60 秒,过短会增加网络开销
  2. 防火墙兼容:确保心跳包能通过防火墙
  3. 断开检测:配置后如果网络中断,会在 Interval × CountMax 时间内检测到并断开
  4. 批量管理:服务端配置适合管理大量用户的超时策略

参考来源