SSH/SFTP连接慢或超时主因是中间设备清除空闲会话,需通过ClientAliveInterval(服务端)、ServerAliveInterval(客户端)和TCP keepalive(系统级)三层保活协同解决。

SSH/SFTP 连接慢或频繁超时,往往不是网络本身卡顿,而是中间防火墙、NAT 设备或负载均衡器在连接空闲一段时间后主动清除了会话状态。这时靠客户端重连或反复尝试效果有限,真正有效的是让连接“保持活跃”——通过 ClientAliveInterval(服务端)和 TCP keepalive(客户端或系统级)协同维持连接心跳。
Server 端:启用并调低 ClientAliveInterval
这是 OpenSSH 服务端控制 SSH 连接保活的核心参数。它会让服务器定期向客户端发送探测包,若客户端无响应则断开连接,避免僵死连接堆积,同时也防止中间设备因长期无数据而丢弃连接。
-
配置位置:修改
/etc/ssh/sshd_config -
关键参数:
-
ClientAliveInterval 30:每 30 秒发一次探测(建议设为 30–60,太短增加无效流量,太长仍可能被中间设备切断) -
ClientAliveCountMax 3:连续 3 次探测无响应才断开(即最多容忍约 90–180 秒无响应) -
TCPKeepAlive yes(可选但建议开启,与下文系统级 TCP keepalive 协同)
-
-
生效方式:修改后执行
sudo systemctl reload sshd(或sudo service ssh reload)
Client 端:配置 ServerAliveInterval 避免被动等待
如果无法修改服务端配置(如连接第三方 SFTP 服务器),可在客户端强制发起保活探测。OpenSSH 客户端对应参数是 ServerAliveInterval,作用类似但方向相反——由客户端主动“打招呼”,更适用于 NAT 环境或客户端出口受限场景。
-
临时使用:
sftp -o ServerAliveInterval=45 -o ServerAliveCountMax=2 user@host -
全局配置:在
~/.ssh/config中添加:Host example.com
ServerAliveInterval 45
ServerAliveCountMax 2 -
注意:该设置对所有基于 OpenSSH 的连接(sftp/scp/ssh)生效;值略小于服务端
ClientAliveInterval更稳妥(例如服务端设 60,客户端设 45),避免双方探测错位导致误断。
系统级:调整 TCP keepalive 参数(Linux/macOS)
当 SSH 层保活未覆盖到(比如进程卡住、信号阻塞),底层 TCP keepalive 可作为兜底机制。它由内核控制,影响所有 TCP 连接,包括 SSH。
-
Linux 查看当前值:
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes - 常见默认值:time=7200s(2小时)、intvl=75s、probes=9 → 实际检测延迟高达 2h+11min,远超多数防火墙超时阈值(通常 300–1800s)
-
推荐临时调整(root):
sudo sysctl -w net.ipv4.tcp_keepalive_time=600
即:空闲 10 分钟后开始探测,每 30 秒一次,失败 3 次断连(总容忍约 11.5 分钟)
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30
sudo sysctl -w net.ipv4.tcp_keepalive_probes=3 -
永久生效:写入
/etc/sysctl.conf或/etc/sysctl.d/99-keepalive.conf
验证与排查小技巧
调整后别急着测试上传,先确认保活是否真正触发:
-
抓包确认:用
tcpdump -i any port 22 -nn观察是否有周期性 ACK 包(ClientAlive/ServerAlive 探测体现为带 ACK 标志的空数据包) -
服务端日志:开启
LogLevel VERBOSE后,/var/log/auth.log中会出现Received client alive message或Timeout, server not responding记录 -
客户端调试:加
-v参数运行 sftp,看到debug1: Sending SSH2_MSG_GLOBAL_REQUEST kex-strict-c-v00@openssh.com类似日志说明保活已激活 - 避开干扰:确保客户端和服务器时间同步(NTP),避免因系统时间跳变导致 keepalive 时间计算异常











