Linux 通过添加额外的以太网接口增加临时端口

Linux 通过添加额外的以太网接口增加临时端口,linux,tcp,port,ethernet,ifconfig,Linux,Tcp,Port,Ethernet,Ifconfig,有没有办法将临时端口的数量增加一倍,并绕过16位限制?我已经尝试过在eth0上创建虚拟以太网接口,希望这能解除限制。尽管应用程序在出站流量中使用了新的虚拟IP,但它似乎仍然达到了相同的短暂端口限制。我假设虚拟端口与物理接口上的端口有1对1的映射 ifconfig eth0:1 10.10.10.210网络掩码255.255.255.192 ifconfig eht0:2 10.10.10.211网络掩码255.255.255.192 有人能告诉我如何在不添加额外NIC的情况下将Linux中临时端

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

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 open file,更改端口范围,启用tcp循环/时间戳,减少tcp fin超时…我想我们只需要为该代理计算机提供超过65k的端口。)

这是网络协议的一个限制。例如,TCP和UDP都有16位的源端口和目标端口。即使您可以增加没有人可以寻址的端口数。

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


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

事实证明,如果要超过65535限制,就不能使用0绑定临时端口。相反,您需要使用显式端口号


此外,启用
tcp\u tw\u重用
可能会有所帮助:

似乎有办法,但这不是免费的。它被称为“连接前绑定”。看,这很好地概括了这一点

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

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


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

当套接字绑定到虚拟IP时,远程计算机将虚拟IP视为连接的原始IP。理论上,我们仍然坚持16位端口限制,但是额外的虚拟接口应该创建一个新的临时端口池来使用。我说的对吗?你知道,我不是100%确定。除非我有时间做一些研究,否则我会删除我的答案。也许我应该澄清我需要什么。我不希望在单个IP上增加16位端口限制。我真正想要的是创建额外的(虚拟)IP,以便允许代理(或Linux操作系统)使用更多端口。如果这样做有效,出站连接将绑定到不同的IP。希望有意义。目标服务器看到tcp连接绑定到虚拟IP。只要5元组(协议、源地址、源端口、目标地址、目标端口)不存在,操作系统是否应该允许重用相同的本地端口?我有一个确切的问题。在添加10个虚拟IP并在其上绑定套接字之后,这些套接字仍然限于临时端口范围。我不确定是否需要SO_REUSEPORT。你解决这个问题了吗?谢谢Manoj。我在代理中使用squid。我只是查看他们的网站;SU REUSEADDR似乎已经是默认选项。