出口源地址转换为什么会耗尽
内网主机访问外网时,出口设备把源地址改写成自己的地址并分配一个端口,靠「源地址、源端口、目的地址、目的端口」四元组区分不同会话。出口地址和可用端口都是有限的,当大量客户端集中访问同一个目标时,可用于区分的组合很快被占满,新连接就没有端口可分配,表现为连接卡在建立阶段、超时与偶发成功并存。这与连接跟踪表满是两类常同时出现的问题。
基本信息
| 症状 | 到同一目标大量连接卡在建连状态,超时与偶发成功并存 |
|---|---|
| 根因 | 源地址转换的端口池耗尽,或会话表达到上限 |
| 缓解手段 | 扩大出口地址与端口范围、缩短回收时间、客户端改长连接、拆分出口 |
| 关联问题 | 常与连接跟踪表满同时发生,需要一起看 |
| 取证位置 | 客户端侧看连接状态分布,出口设备侧看会话表与端口使用 |
典型使用场景
- 办公网大量终端访问同一云服务:排查出口端口是否耗尽
- 爬虫或批量任务导致外连失败:确认并发连接数与端口池的关系
- 跨机房访问异常:区分是出口转换问题还是目标侧限流
- 出口设备升级评估:按峰值并发会话数规划地址与端口规模
- 客户端改造前后对比:长连接复用是否减少了端口占用
客户端与网关两侧
客户端与网关两侧
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现象与归因
| 现象 | 可能原因 | 验证方式 |
|---|---|---|
| 大量建连中状态 | 端口池耗尽或对端限流 | 看目标是否集中在同一地址 |
| 偶发成功与超时并存 | 端口回收后瞬间可用 | 对比失败与成功的时间分布 |
| 仅特定目标失败 | 该目标的会话占用集中 | 统计按目标的会话数 |
| 会话表接近上限 | 并发会话规模超出规划 | 查会话计数与上限 |
| 客户端临时端口耗尽 | 本地端口范围不足 | 查本地端口使用与回收状态 |
多个内部客户端经同一出口访问同一目标时最先耗尽端口:可用于区分的组合里,源地址与目的地址都受限。