NAT 排障的入手点
NAT 是排障黑洞最多的地方:同一条连接在 NAT 设备前后源地址、源端口、目的地址都可能被改写,只在一侧观察永远看不到全貌。排查的核心不是背概念,而是把「真实五元组」在两端的映射关系对出来:SNAT 关注源端口是否耗尽,DNAT 关注后端变更是否同步到映射表,hairpin(内网访问公网映射地址)则要先确认设备是否支持回环。
基本信息
| 适用场景 | Linux 网关(iptables/nftables)、云 NAT 网关、四层负载均衡 |
|---|---|
| 常见现象 | 部分用户偶发失败、内网访问公网域名超时、连接数暴涨后新连接全挂 |
| 关键证据 | NAT 会话表(conntrack 或网关会话表)+ NAT 设备两侧抓包对照 |
| 典型协议 | TCP/UDP 五元组改写;参考 RFC 3022 |
| 权限要求 | 查看与清理会话表需 root |
典型使用场景
- 内网主机访问公网间歇失败:确认是否 SNAT 源端口耗尽
- 内网访问公网域名或弹性 IP 超时、外网访问正常:怀疑不支持 hairpin
- 修改后端映射后老连接仍走旧地址:需要清理残留的会话表项
- 连接数突增后新连接失败:核对连接跟踪表使用率与上限
- 排查跨网段访问异常:确认 NAT 前后地址改写是否符合预期
查 NAT 会话与统计
查 NAT 会话与统计
# Linux conntrack:查看指定方向的会话与统计
conntrack -L -p tcp --dport 443 | head -20
conntrack -S | grep -E 'insert_failed|drop' # insert_failed 增长是端口/表空间压力的信号
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
# hairpin(内网访问公网映射地址)判断:
curl -v --connect-timeout 3 https://<公网域名或EIP>/ # 内网直连超时、外网正常,疑似不支持回环
curl -v --connect-timeout 3 https://<内网地址>/ # 改用内网直连地址验证
# 改完映射后清理旧会话,避免老连接继续走旧映射
conntrack -D -p tcp --dport 443现象与指向
| 现象 | 可能原因 | 验证方式 |
|---|---|---|
| 高峰期新连接失败、已有连接正常 | SNAT 源端口耗尽 | 看 conntrack 计数与 insert_failed 增长趋势 |
| 内网访问公网映射地址超时 | 设备不支持 hairpin 回环 | 改用内网地址直连验证 |
| 改了后端映射但无效果 | 旧会话仍缓存原映射 | 清理相关 conntrack 表项后复测 |
| 连接跟踪表满导致丢包 | nf_conntrack 上限偏低或存在大量长连接 | 对照 count 与 max 比值 |
| 部分用户偶发失败 | 端口复用冲突或会话老化时间过短 | 按来源 IP 与端口分布对照会话表 |
SNAT 端口耗尽表现为「高峰期新连接失败、已有连接正常」,与防火墙拦截症状极易混淆;要把失败时段与 conntrack 计数、insert_failed 增长放在同一时间轴上对比才能区分。