SSH 连接在空闲一段时间后经常会被断开,这在远程服务器管理中非常不便。通过配置 keepalive 机制,可以有效保持 SSH 会话的活跃状态。
问题原因
SSH 连接断开通常由以下原因导致:
- 防火墙/NAT 超时:中间网络设备清理长时间无数据的连接
- 服务端超时:SSH 服务器配置了空闲超时
- 网络不稳定:连接中断但双方都不知道
客户端配置
编辑 ~/.ssh/config 文件:
|
|
参数说明
| 参数 | 值 | 说明 |
|---|---|---|
ServerAliveInterval |
60 | 每 60 秒发送一次心跳包 |
ServerAliveCountMax |
3 | 3 次无响应后断开连接 |
实际效果:每 60 秒发送心跳,如果连续 3 次(180 秒)无响应则断开。正常情况下连接会一直保持。
针对特定主机配置
|
|
服务端配置
编辑 /etc/ssh/sshd_config 文件:
|
|
参数说明
| 参数 | 值 | 说明 |
|---|---|---|
ClientAliveInterval |
60 | 服务端每 60 秒检查客户端是否存活 |
ClientAliveCountMax |
3 | 3 次无响应后断开连接 |
配置后重启 SSH 服务:
|
|
临时使用(命令行)
不修改配置文件,临时启用 keepalive:
|
|
客户端 vs 服务端配置
| 配置位置 | 发起方 | 适用场景 |
|---|---|---|
| 客户端 | 客户端主动发心跳 | 个人使用,无需服务端权限 |
| 服务端 | 服务端主动检查 | 管理多用户,统一策略 |
建议:两端都配置,形成双向检测,效果更好。
验证配置
查看当前生效的配置:
|
|
注意事项
- 间隔不宜过短:建议 30-60 秒,过短会增加网络开销
- 防火墙兼容:确保心跳包能通过防火墙
- 断开检测:配置后如果网络中断,会在
Interval × CountMax时间内检测到并断开 - 批量管理:服务端配置适合管理大量用户的超时策略