4

有没有办法将临时端口的数量增加一倍并绕过 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 端口用于这个代理机器。)

4

4 回答 4

3

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

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

于 2013-09-09T20:29:55.050 回答
1

It's a limitation of the network protocols. Both TCP & UDP, for instance, have 16 bit source and destination ports. Even if you could increase the number of ports no one could address them.

于 2013-09-09T15:08:51.137 回答
0

似乎有办法,但它不是免费的。它被称为“连接前绑定”。请参阅这篇简短而密集的文章,它总结得非常好。

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

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

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

于 2015-03-23T20:24:06.867 回答
0

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

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

于 2014-06-20T10:01:05.467 回答