本地端口范围是什么
net.ipv4.ip_local_port_range 决定本机主动发起连接时,内核可以自动分配哪些本地端口。默认是 32768 到 60999,约 2.8 万个。每个出站连接会占用一个本地端口,短连接密集的机器(代理、网关、爬虫、压测客户端、调用第三方接口的服务)会在短时间内把这些端口用光,内核随即拒绝建连并返回 Cannot assign requested address。它管的是出站端的端口池,不是本机服务的监听端口。
基本信息
| 参数 | net.ipv4.ip_local_port_range |
|---|---|
| 默认值 | 32768 60999(两个数字之间用空格或制表符分隔) |
| 写入格式 | 两个数字一起写在同一行,用引号包住整个值避免被拆开 |
| 耗尽报错 | Cannot assign requested address(应用侧常表现为连接建立失败) |
| 保留端口 | net.ipv4.ip_local_reserved_ports 可把区间内的端口留给指定服务 |
| 相关参数 | net.ipv4.tcp_tw_reuse、net.ipv4.tcp_max_tw_buckets |
典型使用场景
- 正向代理与出站网关:并发出站请求量大,本地端口周转不过来导致大面积建连失败
- 压测客户端:用大量短连接压测单个目标时,本地端口最先成为瓶颈而不是被压端
- 定时任务与批处理:夜间集中跑同步任务时偶发连接失败,白天却正常
- 上云迁移后容量下降:云 NAT 网关也会限制每地址的端口与会话数,需要与本地端口一起核对
- 排查偶发故障:服务日志出现随机建连失败但被调方无任何记录,优先怀疑本地端口耗尽
查看与调整
查看与调整
sysctl net.ipv4.ip_local_port_range # 读当前范围
ss -s | head # 各状态套接字汇总,看 TIME_WAIT 与已用端口规模
ss -tan state time-wait | wc -l # TIME_WAIT 数量,判断端口是否被长期占住
netstat -an | grep -c ':\[::\]' # 兼容老系统时的粗查方式
sysctl -w net.ipv4.ip_local_port_range="1024 65535" # 临时扩大范围
sysctl net.ipv4.ip_local_reserved_ports # 确认是否有保留区间需要避开落盘与回读
落盘与回读
# /etc/sysctl.d/99-net-tuning.conf
net.ipv4.ip_local_port_range = 1024 65535 # 扩大出站端口池,注意避开业务固定端口
# 与出站端口池配套的常见调整
net.ipv4.tcp_tw_reuse = 1 # 允许安全复用 TIME_WAIT 端口
# 回读命令:sysctl net.ipv4.ip_local_port_range端口耗尽判断
| 观察点 | 含义 | 正常与异常 |
|---|---|---|
| Cannot assign requested address | 建连时无可用本地端口 | 出现即要处理,属确定性故障信号 |
| ss -s 的 TIME_WAIT 行 | 处于 TIME_WAIT 的套接字数 | 数量接近端口池总量时说明池子被占住 |
| 本地端口分布 | 出站连接占用端口的集中区间 | 集中在高位区间说明确实在消耗临时端口池 |
| 对端分布 | 连接集中到少数目标地址 | 单目标高并发时端口池实际可用量会明显小于总数 |
端口能否复用取决于四元组(本地地址、本地端口、远端地址、远端端口)是否冲突。连接到同一个目标时,可选的本地端口数就是端口池大小;分散到多个目标时同一个本地端口可以同时出现多条连接,这就是为什么端口耗尽的故障往往集中在少数目标上。
扩大范围前先确认不与业务固定监听端口冲突,也不要与 ip_local_reserved_ports 里保留的区间重叠。习惯上把下限放在 1024 以上,避免与特权端口及常见服务端口混杂,便于日后排查看图。
端口耗尽通常是组合问题而不是单一参数问题:调用方短连接模式加上目标集中,再叠加 60 秒左右的 TIME_WAIT,才把池子耗光。优先手段依次是改长连接与连接池、允许安全复用、最后才是扩大端口池。
云环境还有一层约束:经过 NAT 网关出公网时,网关侧对每个弹性地址的会话数与端口也有限制,本地扩端口池后仍可能在建连高峰失败。此时需要增加出口地址或拆分流量,而不是继续调内核参数。
压测机上把范围开到 1024 到 65535 会产生大量随机源端口流量,若经过安全设备或防火墙,可能触发端口扫描类告警。变更前先与网络安全侧确认,避免测试流量被拦截或引发误报。