为什么ssh长时间空闲后,终端就卡死了

十一月 27, 2025 #ssh

问题原因

具体分析

解决方案(推荐组合使用)

启用 SSH 客户端保活(最常用)

在 客户端 的 ~/.ssh/config 中为对应主机配置:

Host your-server  # 或 * 表示全局
    HostName example.com
    User peter
    ServerAliveInterval 60      # 每60秒客户端发一个空包探测
    ServerAliveCountMax 3       # 连续3次无响应则断开
    TCPKeepAlive yes            # 同时启用底层 TCP keepalive(可选)

✅ 效果:每 60 秒发一次 SSH_MSG_CHANNEL_REQUEST "keepalive@openssh.com",穿透 NAT 设备,防止被丢弃。

服务端保活(需有服务器权限)

在服务端 /etc/ssh/sshd_config 中添加:

ClientAliveInterval 60
ClientAliveCountMax 3

重启 sshd:sudo systemctl restart sshd

⚠️ 注意:若中间设备超时 < 60 秒(如某些企业防火墙为 30 秒),可设为 30。

系统级 TCP keepalive 调优(全局生效)

临时调整(重启失效):

# Debian/Ubuntu
sudo sysctl -w net.ipv4.tcp_keepalive_time=300
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=60
sudo sysctl -w net.ipv4.tcp_keepalive_probes=3
# 永久生效:写入 /etc/sysctl.d/99-tcp-keepalive.conf

诊断技巧