rocky linux 9.5(net.ipv4.tcp_tw_reuse = 2解释)

Rocky Linux 9.5(对应 RHEL9 内核系列,大概是 5.14.x 的长期支持内核),而且我看到:

1
2
3
4
net.ipv4.tcp_tw_reuse = 2
net.ipv4.tcp_timestamps = 1
net.ipv4.ip_local_port_range = 10000 65535
net.ipv4.tcp_fin_timeout = 15

解释为什么会出现 2

在标准 Linux upstream 内核 (5.14 主线) 里,tcp_tw_reuse 只有 0/1 两种取值。

  • 0 → 禁用
  • 1 → 启用(仅对 主动发起连接的 TIME_WAIT socket 允许复用)

RHEL 9 / CentOS Stream 9 / Rocky 9 内核里,Red Hat 打过一个 增强补丁,支持 “2” 模式。

👉 值 2 的语义(来自 Red Hat 文档 / 内核 patch 注释):

  • 2 = 在所有场景(包括服务端接受连接)也允许 TIME_WAIT socket 被复用。
  • 等同于过去被移除的 tcp_tw_recycle 的“弱化替代”,更激进,可能在 NAT/负载均衡环境下导致 连接错乱 / RST 激增

nat环境弊端


风险

  • 如果你的 upstream 服务器处于 SLB / NAT / 多客户端并发环境,那么 tcp_tw_reuse=2 会非常危险,因为不同客户端可能被错误复用 socket,导致连接被异常重置。
  • 这可能正好对应你抓包看到的现象:“同端口新会话 + 上一个会话没完整收尾 + RST”。

在SLB/NAT场景下推荐做法

  1. 回退到安全值 1

    1
    2
    sysctl -w net.ipv4.tcp_tw_reuse=1
    echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.d/99-sysctl.conf

    保证仅在主动发起连接场景生效,避免对服务端 TIME_WAIT 套接字做不安全复用。

  2. 保持 timestamps=1(复用逻辑依赖 TCP 时间戳校验,确保安全性)。

  3. 监控变化

    • 切换后再观察 Nginx upstream prematurely closed connection 是否明显下降。
    • ss -ant state time-wait | wc -l 观察 TIME_WAIT 数量变化。