改了TCP keepalive_time仍断连,是因为SFTP基于SSH且默认不启用TCP层保活;OpenSSH使用独立的ClientAliveInterval(服务端)和ServerAliveInterval(客户端)控制保活,二者互不依赖,必须至少配置其一才能防止空闲断连。

sftp 超时频繁的 TCP keepalive_time 与 ClientAliveInterval 配置

为什么改了 TCP keepalive_time 还是断连?

Linux 内核的 TCP keepalive_time 控制的是底层 TCP 连接空闲多久后开始发保活探测包,但 SFTP(基于 SSH)默认根本不会启用 TCP 层的 keepalive。即使你调小了 /proc/sys/net/ipv4/tcp_keepalive_time,OpenSSH 服务端和客户端仍可能在应用层直接关闭连接——因为它们各自有独立的保活机制,且默认关闭。

常见现象是:SFTP 传输大文件中途卡住、Connection closed by remote host、或上传到一半报 Broken pipe。这不是网络中断,而是 SSH 会话被静默终止。

ClientAliveIntervalServerAliveInterval 到底谁管谁?

服务端的 ClientAliveInterval 是 SSH daemon 主动向客户端发心跳的间隔;客户端的 ServerAliveInterval 是 ssh 命令主动向服务端发心跳的间隔。二者互不依赖,但必须至少启用其一,否则连接空闲超过服务端默认的 ClientAliveCountMax * ClientAliveInterval(通常 3 × 0 = 0 → 不检测)就会被 kill。

SFTP 命令行与文件管理器的行为差异

命令行 sftp 工具默认不开启保活,而很多图形化 SFTP 客户端(如 FileZilla、Cyberduck)内置心跳逻辑,所以后者更“耐挂”。如果你用 sftp user@host 手动操作,又长时间没敲命令,大概率被服务端踢掉。

别漏掉防火墙和中间设备的干扰

有些企业网络中的 NAT 设备、负载均衡器或防火墙会主动清理“空闲连接”,它们的超时阈值往往比 SSH 更短(比如 60–120 秒),且不识别 SSH 心跳包。这时即使 ServerAliveInterval 设为 30 秒,也可能因中间设备丢包导致心跳失效。

实际部署时最容易忽略的是:服务端 sshd_config 修改后忘记 sudo systemctl reload sshd,或者客户端配置写错 Host 别名导致匹配失败。保活不是越频繁越好,20–45 秒区间已足够覆盖绝大多数中间设备限制,再短反而可能触发限流或被当作扫描行为拦截。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。