有没有办法将短暂端口的数量加倍并在16位限制附近工作?我尝试在eth0上创建虚拟以太网接口,并希望能够解除限制 . 虽然应用程序在出站流量中使用新的虚拟IP,但它似乎仍然达到了相同的临时端口限制 . 我想虚拟端口与物理接口上的端口有一对一的映射关系 .
ifconfig eth0:1 10.10.10.210 netmask 255.255.255.192 ifconfig eht0:2 10.10.10.211 netmask 255.255.255.192
有人可以建议我如何在不添加额外NIC的情况下将Linux中短暂端口的总数翻倍?
(仅供参考,我尝试增加ulimit / max打开文件,更改端口范围,启用tcp循环/时间戳,减少tcp fin超时...我想我们只需要超过65k端口用于此代理机器 . )
4 回答
似乎's a way, but it'不是免费的 . 它被称为"bind before connect" . 见this short but dense article,总结得非常好 .
拥有多个虚拟IP只是一个开始 . 引用链接文章:
所以这很糟糕,你必须通过几个正确的设置(你已经找到它们中的大部分)来改善你的起始位置,并通过一个聪明的套接字分配技术来绕过全局限制 . 结果是您将手动控制所有传出IP . 这似乎也无法与使用传统“连接”方式的系统上的其他应用程序很好地配合 .
如果您在eth0上创建虚拟接口,那么您应该能够为这些接口分配不同的IP地址 . 有了这个,您可以使用相同的短暂端口号(它们在内核中分配,因此您实际上没有太多控制权)用于每个绑定到不同地址的多个套接字 - 您可能需要设置SO_REUSEADDR选项 . 这将起作用的原因是因为对于传入的数据包(UDP / TCP),通过查看本地源IP和端口号来识别流 .
正如@Duck所提到的,由于TCP / UDP报头仅为端口号分配16位,因此增加本地堆栈中的短暂范围没有太大意义 .
这是网络协议的限制 . 例如,TCP和UDP都有16位源和目标端口 . 即使您可以增加端口数量,也没有人可以解决它们 .
事实证明,如果要超过65535限制,则不能使用0来绑定临时端口 . 相反,您需要使用显式端口号 .
并打开
tcp_tw_reuse
可能会有所帮助:http://krenel.org/tcp-time_wait-and-ephemeral-ports-bad-friends.html