首页/网络/网络排障速查/出口 SNAT 端口耗尽排查

出口 SNAT 端口耗尽排查

大量外连卡在 SYN_SENT、部分连接失败,可能是出口 NAT 源端口耗尽:客户端侧看状态分布,网关侧看会话表与端口池。

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

出口源地址转换为什么会耗尽

内网主机访问外网时,出口设备把源地址改写成自己的地址并分配一个端口,靠「源地址、源端口、目的地址、目的端口」四元组区分不同会话。出口地址和可用端口都是有限的,当大量客户端集中访问同一个目标时,可用于区分的组合很快被占满,新连接就没有端口可分配,表现为连接卡在建立阶段、超时与偶发成功并存。这与连接跟踪表满是两类常同时出现的问题。

基本信息

症状到同一目标大量连接卡在建连状态,超时与偶发成功并存
根因源地址转换的端口池耗尽,或会话表达到上限
缓解手段扩大出口地址与端口范围、缩短回收时间、客户端改长连接、拆分出口
关联问题常与连接跟踪表满同时发生,需要一起看
取证位置客户端侧看连接状态分布,出口设备侧看会话表与端口使用

典型使用场景

  • 办公网大量终端访问同一云服务:排查出口端口是否耗尽
  • 爬虫或批量任务导致外连失败:确认并发连接数与端口池的关系
  • 跨机房访问异常:区分是出口转换问题还是目标侧限流
  • 出口设备升级评估:按峰值并发会话数规划地址与端口规模
  • 客户端改造前后对比:长连接复用是否减少了端口占用

客户端与网关两侧

客户端与网关两侧
ss -Htan state syn-sent | wc -l
ss -Htan state syn-sent | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head
# 网关侧(Linux 出口):
conntrack -C; conntrack -S | head
cat /proc/sys/net/netfilter/nf_conntrack_count /proc/sys/net/netfilter/nf_conntrack_max
# 观察本地临时端口占用:
ss -tan | awk '{print $4}' | awk -F: '{print $NF}' | sort -n | uniq -c | tail -5

现象与归因

现象可能原因验证方式
大量建连中状态端口池耗尽或对端限流看目标是否集中在同一地址
偶发成功与超时并存端口回收后瞬间可用对比失败与成功的时间分布
仅特定目标失败该目标的会话占用集中统计按目标的会话数
会话表接近上限并发会话规模超出规划查会话计数与上限
客户端临时端口耗尽本地端口范围不足查本地端口使用与回收状态
多个内部客户端经同一出口访问同一目标时最先耗尽端口:可用于区分的组合里,源地址与目的地址都受限。

易错点

  • 把出口转换问题当目标端故障,反复排查对端而毫无结果
  • 只看客户端连接状态,不查出口设备侧会话表与端口池
  • 用扩大本地端口范围代替出口扩容:本地端口充足而出口受限时改动无效
  • 短连接改造后不压测:端口回收速度赶不上新建速度,问题只会在高峰期暴露

数据来源与参考

  • RFC 3022:传统 NAT 模型
  • Linux 内核文档:nf_conntrack sysctl

相关工具

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