Linux“无法新建连接”本质是本地临时端口耗尽,需通过ss -s比对orphaned+timewait与ip_local_port_range差值确认;再分三类场景排查:无主ESTABLISHED连接、短连接风暴致TIME_WAIT爆炸、conntrack表打满。

Linux系统出现“无法新建连接”且报错类似 bind: cannot assign requested address 或连接建立缓慢,本质是本地可用临时端口被占满,而非网络不通或服务不可达。必须跳过ping和nc这类连通性测试,直接从端口资源维度切入定位。
确认是否真为端口耗尽
执行 ss -s 查看全局连接统计,重点关注输出中 “orphaned” 和 “timewait” 两项数值之和是否接近或超过 ip_local_port_range 的差值。
运行 cat /proc/sys/net/ipv4/ip_local_port_range,典型输出如 32768 60999,表示可用端口仅约 28232 个;若当前 TIME_WAIT + orphaned 连接数 > 25000,基本可定性为端口耗尽。
这一步不能只看 ESTABLISHED 数量——大量 ESTABLISHED 但进程已退出的残留 socket 同样会锁死端口,且 ss -tunp 查不到对应 PID。
区分三类端口卡死场景
方法一:检查是否存在无主 ESTABLISHED 连接
运行 ss -tun state established | grep -v "pid=",若有输出,说明内核中存在进程已退出但 TCP 状态仍为 ESTABLISHED 的残留 socket。这类连接不会自动释放,持续占用本地端口和文件描述符。
方法二:确认是否短连接风暴导致 TIME_WAIT 爆炸
执行 ss -tan state time-wait | wc -l,再对比 ss -tan state established | wc -l。若前者是后者的 5 倍以上,且应用日志显示高频建连(如每秒数百次 HTTP 调用),大概率是客户端未复用连接,疯狂发起新短连接。
方法三:排查 conntrack 表打满(NAT/网关环境必查)
运行 cat /proc/sys/net/netfilter/nf_conntrack_count 和 cat /proc/sys/net/netfilter/nf_conntrack_max。若前者 ≥ 后者 × 0.9,说明连接跟踪表已满,新连接 SYN 包会被静默丢弃,现象与端口耗尽高度相似,但根因在 netfilter 层而非 socket 层。
快速定位高连接进程
第一步:列出所有 TCP 连接并按进程聚合ss -tunp | awk '{if($7 != \"-\" && $7 ~ /pid=/) print $7}' | sort | uniq -c | sort -nr | head -10
第二步:对嫌疑进程深入分析其 socket 分布
假设上一步发现 PID 12345 占用最多,执行:lsof -nP -p 12345 | grep TCP | wc -l 统计该进程打开的 TCP socket 总数;再用 lsof -nP -p 12345 | grep ":" | head -5 看是否集中连接某几个下游服务。
第三步:检查该进程的文件描述符限制cat /proc/12345/limits | grep "Max open files",若 soft limit ≤ 1024,而 lsof 显示已打开 900+ socket,说明进程自身 FD 限制已成瓶颈,即使端口充足也无法建连。
验证端口分配是否真的枯竭
运行 ss -tan | awk '{print $4}' | cut -d':' -f2 | sort | uniq -c | sort -nr | head -20,观察本地端口分布是否呈现密集连续段(如 32780–32850 全部出现)。若端口号集中在某一小段,说明系统正在从 ip_local_port_range 起始位置顺序分配,且已逼近上限——这是端口即将耗尽的铁证。
此时再执行一次 ss -s,注意观察输出中 “TCP:” 行末尾的 “orphaned” 数值是否在持续上涨。如果每次执行都+10~50,说明有新连接不断进入 ESTABLISHED 但无法关闭,问题不在端口池大小,而在连接生命周期管理失控。


















