首页/网络/网络排障速查/NAT 环境排障要点(SNAT/DNAT/回环)
排查流程与方法36 条

NAT 环境排障要点(SNAT/DNAT/回环)

NAT 是排障黑洞最多的地方:SNAT 端口耗尽、DNAT 后端变更未同步、内网访问公网映射地址(hairpin)失败;先确认连接的「真实五元组」在两端的映射关系。

网络排障速查网络更新于 2026-10-13

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 增长放在同一时间轴上对比才能区分。

易错点

  • 只在内网一侧抓包:看不到 NAT 改写过程,疑似 NAT 问题时必须在设备两侧对照抓包
  • 改完 NAT 映射不清旧会话:老连接继续走旧映射,表现为「改了没用」,实际是表项未老化
  • 把 hairpin 失败当链路故障:内网访问公网映射地址失败而外网正常,几乎可以直接指向回环支持问题
  • 忽略连接跟踪表上限:只调 NAT 规则不查 count 与 max 的比值,表满后的丢包始终无法解释

数据来源与参考

  • RFC 3022:Traditional IP NAT
  • conntrack 工具手册(nf_conntrack)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌