net.ipv4.ip_local_port_range vs net.ipv4.ip_local_reserved_ports

net.ipv4.ip_local_port_range(出站端口范围)

  • 作用:定义内核在为本地客户端连接自动分配临时端口(ephemeral port)**时,可以使用的端口范围。

  • 默认值
    一般是 32768 60999(在 Linux 3.x/4.x),在一些发行版上可能是 49152 65535(符合 IANA 建议)。

  • 影响场景
    当进程调用 connect() 发起出站连接(没指定源端口时),内核会从这个范围里挑选一个可用端口。

  • 调优点

    • 如果服务器并发出站连接特别多(如反向代理、NAT 网关),需要扩大范围避免 “cannot assign requested address (EADDRNOTAVAIL)” 错误。

    • 修改命令:

      1
      sysctl -w net.ipv4.ip_local_port_range="1024 65535"

net.ipv4.ip_local_reserved_ports(监听端口范围)

  • 作用:指定一组不能分配给临时端口的保留端口(黑名单)。

  • 配置格式

    • 逗号分隔(如 8080,3306,5432
    • 范围(如 5000-5100
    • 可以混合(如 8080,3306,5432,5000-5100
  • 应用场景

    • 有些服务监听在高位端口(例如 8080),如果不排除它,内核可能会把 8080 分配给临时出站连接,造成 端口冲突
    • 适合 应用监听端口和临时端口范围冲突 时使用。
  • 注意事项

    • 只会影响 自动分配的 ephemeral port,不会阻止你手动 bind() 到这些端口。
    • 保留端口太多会缩小可用范围,导致连接数受限。
    • 建议只保留真正有冲突风险的端口。

关系 & 区别总结

参数 控制对象 默认值 典型用途
net.ipv4.ip_local_port_range 可用的临时端口范围(白名单) 32768 60999 控制并发出站连接总容量
net.ipv4.ip_local_reserved_ports 不可用的临时端口(黑名单) 避免和服务监听端口冲突

一句话总结

  • ip_local_port_range 定义“内核能用哪些端口”。
  • ip_local_reserved_ports 定义“这些端口即使在范围内也不能用”。

查看当前值

1
2
3
4
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.ip_local_reserved_ports
# 或者
cat /proc/sys/net/ipv4/ip_local_port_range

调整示例(扩大范围以防端口耗尽)

1
2
3
4
5
# 临时生效
sysctl -w net.ipv4.ip_local_port_range="1024 65535"

# 永久生效,写入 /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535