我可以通过附加 IPv4 地址让单个服务器侦听超过 65535 个端口吗

我可以通过附加 IPv4 地址让单个服务器侦听超过 65535 个端口吗

我有一个数字要通过 SSH 访问的服务器,其中一些位于不同 NAT 后面,可能需要 SSH 隧道。目前我正在使用单个 VPS 来实现此目的。当那个数字达到65535 - 1023 = 64512,并且 VPS 耗尽了可连接隧道的端口,我是否需要启动另一个 VPS,或者只是将额外的 IP 地址附加到现有 VPS?

换句话说,是为每台 Linux 机器还是为每个网络接口设置了 65535 个限制?这个答案似乎一般是指每个 IP 地址,特别是每个 IPv4 地址。一个也是如此5元组是否意味着引入新的 IP 地址将需要新的元组,从而重置限制?如果 IPv4 是这样,那么 IPv6 是否会有所不同?

答案1

侦听端口的限制是针对每个地址的,无论 IPv4 还是 IPv6。限制来自于传输控制协议UDP协议数据包标头为两个字节,因此 TCP 和 UDP 的端口号只能在0x0000(0) 到0xFFFF(65535) 范围内。

当任何服务(包括SSH服务器)侦听某个端口时,它可以选择侦听一个IP地址或每个IP地址。因此,添加新地址不一定有帮助,除非您将每项服务配置为侦听一个特定的 IP 地址。

然而两个或多个服务只要它们监听不同的 IP 地址,就共享相同的端口。


老实说,NAT 一直以来都是一种黑客行为。 IPv6 中对它的需求已经下降,每台机器都有自己的面向公众的 IPv6 地址和限制传入连接的防火墙以取代 NAT。


解决这种情况的更常见的方法是使用“堡垒”机器...用户通过 ssh 进入堡垒,然后从那里 ssh 进入他们想要的盒子。

答案2

两个都IPv4IPv6没有端口概念,只有源IP地址和目的IP地址。端口限制由下式确定传输控制协议UDP协议协议。

如果您想扩展起始端口限制(默认值:1024)以向最终用户添加更多端口,您可以使用以下命令将特权端口范围降低到较低的数字sysctl

echo "net.ipv4.ip_unprivileged_port_start=100" > /etc/sysctl.d/privileged_ports.conf

您可以使用 IP 别名将多个 IP 地址添加到单个网络接口卡。

通过 systemd 你可以使用.network文件:

[Network]
Address=192.168.55.1/24
Address=192.168.55.2/24
Gateway=...

答案3

如果多个进程绑定到不同的 IP,那么您肯定可以在同一端口上侦听多个进程。

这是使用的演示nc

% nc -l 127.0.0.1 1234 &
[1] 24985
% nc -l 192.168.1.178 1234 &
[2] 24988
% netstat -an | grep 1234
tcp4       0      0  192.168.1.178.1234     *.*                    LISTEN     
tcp4       0      0  127.0.0.1.1234         *.*                    LISTEN     

如您所见,我nc以侦听模式启动了两次,一次绑定到127.0.0.1,另一次绑定到192.168.1.178(恰好是该计算机上的两个 IP 地址),两者都使用端口1234

netstat然后显示两个监听套接字。

我在 macOS 上进行了测试,但在 Linux 上,您可以添加-pnetstat 以显示两个不同的进程。在 macOS 上,您可以使用lsof -nP它来显示相同​​的内容。

请注意,由于您在安全层中打开了一个“漏洞”,因此您可能不想绑定到外部可访问的(公共)IP 地址,否则任何人都可以连接到该 IP+端口并到达显然需要的远程系统受到保护。

您应该仅使用环回 IP 地址 ( 127.0.0.1, 127.0.0.2...) 或仅可通过受信任系统访问的专用网络上的专用 IP 地址。

为了完整起见,我们指定活动 TCP 连接由 4 元组(本地 IP、本地端口、远程 IP、远程端口)定义,但侦听套接字确实仅由本地 IP 和端口定义。与该套接字建立的连接将获得完整的 4 元组。

答案4

该端口已分配给 IP 地址,并且您可以(据我所知,在 Linux 中)为该接口分配多个 IP 地址。但当然可能还有其他限制(例如可用的文件描述符 - socket() 系统调用返回文件描述符或 -1 错误)。

相关内容