首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_rfc1337 TIME_WAIT 防护
网络栈调优98 条

net.ipv4.tcp_rfc1337 TIME_WAIT 防护

按 RFC 1337 处理 TIME_WAIT 状态的可疑 RST,避免连接被过早终止;默认 0(关闭),高安全要求场景可启用。

什么是 tcp_rfc1337

按 RFC 1337 的建议,处于 TIME_WAIT 状态的连接收到带有不匹配序列号的 RST 时应当忽略,而不是立刻拆掉这条连接状态。这样做的目的是防止旧连接残留报文或人为注入的 RST 把正常连接提前打断。Linux 的实现由 net.ipv4.tcp_rfc1337 控制:默认 0(关闭),开启后行为更贴近规范,代价是异常的 TIME_WAIT 连接不会被 RST 快速清掉,排查阶段可能更难手动收敛。

基本信息

参数路径net.ipv4.tcp_rfc1337
默认值0(关闭)
作用忽略 TIME_WAIT 期间携带不匹配序列号的 RST
规范RFC 1337
适用暴露面大、对连接被打断敏感的服务
观测ss -tan state time-wait 的堆积情况

典型使用场景

  • 安全加固:减少伪造 RST 打断连接造成的中断影响
  • 排查连接莫名被重置:确认是否与 TIME_WAIT 期间的 RST 处理有关
  • 长连接服务评估:让状态机行为更符合规范
  • 与负载均衡、NAT 设备并存时的兼容性核对
  • 合规基线检查:把该项作为可选加固条目逐项确认

查看与启用

查看与启用
sysctl net.ipv4.tcp_rfc1337                    # 当前取值
sudo sysctl -w net.ipv4.tcp_rfc1337=1          # 临时启用
ss -tan state time-wait | wc -l                # TIME_WAIT 数量
ss -tan state time-wait | head -5              # 看具体连接
# 持久化:写入 /etc/sysctl.d/99-net-tuning.conf 后 sysctl -p
nstat -az 2>/dev/null | grep -iE 'timewait|rst' | head

取值权衡

取值行为适用判断
0(默认)TIME_WAIT 状态可被 RST 提前终止排障便利,行为贴合历史习惯
1忽略不匹配的 RST,更贴近 RFC 1337安全加固偏好,注意排障差异
配合 TIME_WAIT 复用参数缩短状态停留时间需评估是否引入新的连接混淆风险
与中间设备共存设备可能自行处理 RST以链路实测行为为准
TIME_WAIT 本身是保护机制,数量大不一定是故障:判断标准是端口是否被耗尽、业务是否出现连接失败,而不是计数本身。
启用后异常的 TIME_WAIT 连接不会被 RST 快速清理,问题排查期间可能让人误以为状态“清不掉”,需要改成等待超时或重启相关服务。
网络类加固项适合成组落地:单开某一项而基线里其他参数不匹配,实际行为往往与预期不符,落地前后都要用同一套方法验证。

易错点

  • 启用后异常的 TIME_WAIT 连接不会被 RST 快速清理,问题排查阶段要注意它对现象的干扰
  • 不是通用必选项,结合暴露面与中间设备行为评估,盲目全量打开会改变故障现场
  • 把 TIME_WAIT 数量高当成故障去清理,忽略端口耗尽与连接失败这两个真实判定标准
  • 改动后不写入持久化配置,重启即失效,加固基线检查时会被判为不合规

数据来源与参考

  • RFC 1337
  • Linux 内核 Documentation/networking/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌