什么是 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 快速清理,问题排查期间可能让人误以为状态“清不掉”,需要改成等待超时或重启相关服务。
网络类加固项适合成组落地:单开某一项而基线里其他参数不匹配,实际行为往往与预期不符,落地前后都要用同一套方法验证。