网络栈调优98 条

NAT 映射异常排查

NAT 相关丢连接看跟踪条目的双向字段与 UNREPLIED 标记, 结合后端服务与回程路由定位。

NAT 场景异常排查

做地址转换的 Linux 网关(含 Kubernetes 节点)依赖连接跟踪表来记住每条会话的转换关系。条目里同时保存原始方向与回复方向的元组,并可能带未回复标记:请求到达了但没有看到回包,就会出现持续的未回复条目。另一类现象是条目频繁重建,通常与空闲超时和应用心跳间隔不匹配有关,表现为长连接莫名中断。

基本信息

适用平台Linux netfilter 网关、负载均衡节点、容器节点
依赖模块nf_conntrack
关键参数net.netfilter 下各类协议的空闲超时
观察对象未回复标记的条目比例与条目重建频率
权限要求root 或 CAP_NET_ADMIN

典型使用场景

  • 网关后面的服务偶发超时,需要区分是回程缺失还是上游没响应。
  • 转换后的连接在客户端看来一直「半死」,需要确认条目是否被提前回收。
  • 长连接空闲一段时间后中断,而两端都没有主动关闭。
  • 排查同一目标下部分来源不通用,需要按目标收敛条目。
  • 容量评估:确认转换场景下表条目增长速度是否超出预期。

观察与对照

观察与对照
conntrack -L 2>/dev/null | grep UNREPLIED | head -20           # 未回复条目
conntrack -L -p tcp --dport 8080 2>/dev/null | head           # 只看某目标端口
sysctl net.netfilter.nf_conntrack_tcp_timeout_established     # 已建立连接超时
sysctl net.netfilter.nf_conntrack_tcp_timeout_time_wait       # 关闭等待超时
conntrack -E -p tcp --dport 8080 2>/dev/null | head -20       # 事件流,看条目新建与销毁
ip route get 10.0.0.11                                        # 回程路由是否存在

现象归因

现象可能原因处置方向
未回复条目持续出现回程路径缺失核对回程路由、邻居表与上游策略
条目频繁重建空闲超时短于心跳间隔对齐心跳与超时,或调整超时参数
长连接突然中断且无握手挥手中间设备清理了会话核对转换设备的会话表与超时
条目里的方向字段容易读反:回复元组描述的是回程,判断「请求有没有到」要看原始方向,两者混淆会得出相反结论。
调大超时参数会同时放大表占用:在容量紧张的网关上,先修好心跳与回收逻辑,再考虑放宽超时,否则只是把问题推迟到表满的时候。

易错点

  • 条目字段方向读错,把源与目的混淆,得出「请求没到」的错误结论。
  • 只看单条示例,不结合同目标条目的整体比例,容易把个别现象当成普遍故障。
  • 只查回程路由不看邻居表:二层解析异常同样会造成回程缺失,漏查会反复返工。
  • 长连接中断就怀疑应用:转换设备的会话超时同样会造成这种现象,需要两边一起看。
  • 在容量紧张时直接调大超时:表条目增长速度上升,可能引发更严重的连接丢弃。

数据来源与参考

  • man conntrack(8)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌