slm*_*slm 55 linux networking ip tcp ipv4
是否可以设置 Linux 系统使其提供超过 65,535 个端口?目的是让超过 65k 个守护进程在给定的系统上监听。
显然有端口正在使用,因此由于这些原因这是不可能的,因此将其视为尝试了解 TCP 在执行此类操作时会受到限制的地方的理论练习。
slm*_*slm 89
查看 TCP 的 RFC:RFC 793 - 传输控制协议,答案似乎是否定的,因为 TCP 标头对于源/目标端口字段限制为 16 位。

不会。尽管 IPv6 将为我们提供更大的 IP 地址空间,32 位与 128 位,但它并未尝试改进 TCP 数据包对端口号 16 位的限制。有趣的是 IPv6 的 RFC: Internet Protocol, Version 6 (IPv6) Specification,需要扩展 IP 字段。
当 TCP 在 IPv6 上运行时,用于计算校验和的方法会根据RFC 2460更改:
任何在其校验和计算中包含来自 IP 标头的地址的传输或其他上层协议都必须修改以在 IPv6 上使用,以包含 128 位 IPv6 地址而不是 32 位 IPv4 地址。

一种方法是使用更多接口堆叠额外的 IP 地址。如果您的系统有多个 NIC,这会更容易,但即使只有一个 NIC,如果需要,也可以使用虚拟接口(又名别名)来分配更多 IP。
注意:使用别名已被取代iproute2,您可以使用别名在单个接口上堆叠 IP 地址(即eth0)。
$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
pfifo_fast state DOWN qlen 1000
link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
inet 192.0.2.2/24 scope global secondary eth1
Run Code Online (Sandbox Code Playgroud)
是否可以设置 Linux 系统使其提供超过 65,535 个端口?
不。
目的是让超过 65k 个守护进程在给定的系统上监听。
那么你需要:
iptables重定向流量内容的配置或
一个“服务代理服务”或“多路复用器服务”,它将接受单个端口上的传入连接并将其路由到“后面”的适当守护程序。如果您希望标准协议未经修改地通过,您可能必须在此多路复用器服务中以 IDS 或第 7 层防火墙会分析的方式实现协议嗅探/识别;大多数协议完全可能。
根据第二项,如果您真的愿意,您可以将此服务设计为处理超过 2^16 个“端口”。我确信与运行 2^16+ 个侦听器的负载相比,性能影响将是最小的。
Linux 中的守护进程可以侦听文件系统中存在的 unix 套接字,因此您的“多路复用器服务”可以维护外部端口 <-> 内部 unix 套接字的内部映射。在任何现代文件系统上的 inode 耗尽之前,您可能会遇到内核进程限制(32Kbyte 进程?)。