为什么 Linux 不使用 IANA 临时端口范围?

Eva*_*oll 30 linux ip tcp

根据维基百科

Internet 号码分配机构 (IANA) 建议将 49152 到 65535 的范围用于动态或专用端口。许多 Linux 内核使用端口范围 32768 到 61000。

尽管似乎与 IANA 建议的范围存在一些历史偏差,但 Windows Vista、Windows 7、Windows Server 2008、FreeBSD 4.6+ 和许多其他版本都同意这个范围,但 Linux 仍然脱颖而出,这似乎很尴尬。

不过,仔细研究一下,瞧:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
32768   61000
Run Code Online (Sandbox Code Playgroud)

为什么 Linux 没有采用标准范围?

小智 22

曾经有一段时间 IANA 只分配了最多 1023 个端口。请参阅RFC1700。曾几何时,这是一种标准。大多数情况下,当 RFC 流中的事情发生变化时,我可以毫无困难地找到,但是对于将端口从 1024 更改为 49152 的问题,从注册到分配,我没有找到。

在Linux历史方面,2007年有一个关于默认ip_local_port_range的问题。当时决定使用你提到的Linux范围,因为担心高端口号可能会导致问题,从49152开始的范围可能会留下太少池中的端口号。看到这个和它的线程。当时表达的想法是,从 32768 开始即使不完全符合,也符合 IANA 程序的精神。在阅读本文时,我推断开发人员假设大多数分配将从范围的底部开始并向上移动。在撰写本文时,我统计了 32768 和 49152 之间分配的 100 多个端口号(不将不同的协议单独计算在内),因此在过去五年中一直保持良好状态。

我不知道为什么认为范围太小,但我可以想象两个原因:

  1. 端口号是随机的以阻止某些攻击。池中的地址越多,这种防御的效果就越好。
  2. 高活动服务器可能会遇到端口号耗尽的问题。虽然端口可能是短暂的,但它们的使用不是即时的。特别是套接字可以在 TCP 关闭后持续几分钟。

这篇博文涉及第 2 点,如果您希望您的 Linux 系统使用不同范围的本地端口,则建议一个答案。(使用 /etc/sysctl.d 定义您喜欢的范围。如果出现特定冲突,还有一个 ip_local_reserved_ports 条目可能有用。这些与您引用的 /proc/sys 条目匹配。)

总之。Linux默认设置与当前的 IANA 规范不匹配,但任何特定的 Linux 系统都可以,如果其所有者愿意的话。