【问题标题】:Increase ephemeral ports by adding extra ethernet interface通过添加额外的以太网接口来增加临时端口
【发布时间】:2013-09-13 02:37:09
【问题描述】:

有没有办法将临时端口的数量加倍并绕过 16 位限制?我曾尝试在 eth0 上创建虚拟以太网接口,并希望能解除限制。尽管应用程序在出站流量中使用了新的虚拟 IP,但它似乎仍然达到了相同的临时端口限制。我想虚拟端口与物理接口上的端口是一对一的映射。

ifconfig eth0:1 10.10.10.210 网络掩码 255.255.255.192 ifconfig eht0:2 10.10.10.211 网络掩码 255.255.255.192

有人可以告诉我如何在不添加额外 NIC 的情况下将 Linux 中的临时端口总数翻倍吗?

(仅供参考,我已尝试增加 ulimit/max 打开文件、更改端口范围、启用 tcp 回收/时间戳、减少 tcp fin 超时……我想我们只需要 65k 以上的端口用于此代理机器。)

【问题讨论】:

  • 也许我应该澄清一下我需要什么。我不希望增加单个 IP 的 16 位端口限制。我真正想要的是创建额外的(虚拟)IP,以允许代理(或 Linux 操作系统)使用更多端口。如果可行,出站连接将绑定到不同的 IP。希望这是有道理的。
  • 目标服务器看到 tcp 连接绑定到虚拟 IP。只要 5 元组(协议、源地址、源端口、目标地址、目标端口)不存在,操作系统是否应该允许重用相同的本地端口?
  • 我有确切的问题。添加 10 个虚拟 IP 并在其上绑定套接字后,套接字仍被限制在临时端口范围内。我不确定是否需要 SO_REUSEPORT。你解决了这个问题吗?

标签: linux tcp port ethernet ifconfig


【解决方案1】:

如果您通过 eth0 创建虚拟接口,那么您应该能够为这些接口分配不同的 IP 地址。这样,您可以对绑定到不同地址的多个套接字使用相同的临时端口号(它们在内核中分配,因此您实际上没有太多控制权)——您可能需要设置 SO_REUSEADDR 选项。这会起作用的原因是,对于传入的数据包 (UDP/TCP),流是通过查看本地源 IP 和端口号来识别的。

正如@Duck 提到的,由于 TCP/UDP 标头仅为端口号分配 16 位,因此增加本地堆栈中的临时范围没有多大意义。

【讨论】:

  • 谢谢 Manoj。我在代理中使用鱿鱼。我只是查看他们的网站; S_REUSEADDR 似乎已经是默认选项了。
【解决方案2】:

这是网络协议的限制。例如,TCP 和 UDP 都有 16 位源端口和目标端口。即使您可以增加没有人能解决它们的端口数量。

【讨论】:

  • 当套接字绑定到虚拟 IP 时,远程机器将虚拟 IP 视为连接的原始 IP。理论上,我们仍然坚持 16 位端口限制,但额外的虚拟接口应该创建一个新的临时端口池来使用。我说的对吗?
  • 你知道,我不是 100% 确定。除非我有时间做一些研究,否则我会尽快删除我的答案。
【解决方案3】:

似乎有办法,但不是免费的。它被称为“连接前绑定”。见this short but dense article,总结的很好。

拥有多个虚拟 IP 只是一个开始。引用链接的文章:

在 Linux 上,临时端口范围是全局资源,而不是 IP 地址本地的特定设置。

所以这很糟糕,您必须通过一些正确的设置(其中大部分您已经找到)来改善您的起始位置,并通过巧妙的套接字分配技术绕过全局限制。结果是您将手动控制所有传出 IP。这似乎也不能很好地处理系统上使用传统“连接”方式的其他应用程序。

【讨论】:

    【解决方案4】:

    事实证明,如果你想超过 65535 的限制,你不能使用 0 来绑定临时端口。相反,您需要使用明确的端口号。

    同时打开tcp_tw_reuse 可能会有所帮助:http://krenel.org/tcp-time_wait-and-ephemeral-ports-bad-friends.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 2011-09-05
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多