当多个客户端主机位于共享一个“外部” IP 地址的 NAT 后面时,多个客户端如何同时连接到同一个地址?

当多个客户端主机位于共享一个“外部” IP 地址的 NAT 后面时,多个客户端如何同时连接到同一个地址?

根据相关帖子端口转发无法同时为使用相同互联网服务/应用程序/协议(例如 FTP、HTTP 等)的多个客户端主机提供服务,因为每个互联网服务都有由 IANA 设置的专用端口。换句话说,仅使用端口转发,同一内部网络中的多个客户端主机无法同时使用相同的互联网服务或者即使是在单个主机上运行的同一个互联网应用程序的多个实例。然而,观察表明,在同一内部网络中同时支持多个互联网服务实例是可能的。

在实践中如何解释这一点?

答案1

我将您的问题解释为:“当多个客户端主机位于 NAT 后面并共享单个‘外部’ IP 地址时,多个客户端如何通过同一端口连接到同一服务器?”

这是通过完全相同的机制实现的,该机制还允许单身的主机与同一服务建立多个连接。(例如,您的 Web 浏览器经常使用 2-3 个并发 HTTP 连接与同一 Web 服务器建立连接。)

TCP 连接和 UDP 流始终通过一对端口。每个 TCP 或 UDP 数据包都带有两个字段:“源”端口和“目标”端口。

在来自客户端的数据包中,“目标”端口包含 IANA 分配的服务端口(例如 HTTP 的 80),但“源”端口由操作系统自动分配,因此 {源,目标} 对始终是唯一的。例如,客户端可能对第一个 HTTP 连接使用端口 {54794, 80},对第二个 HTTP 连接使用端口 {48973, 80}。服务器以相反的源和目标进行响应 - 其数据包将具有 {80, 54794} 或 {80, 48973}。

当 NAT 后面有多个客户端主机时,该过程保持不变,NAT 设备使用端口组合来识别哪个客户端建立了哪个连接。如果多个客户端设备恰好选择相同的端口,NAT 设备将转换源端口,以确保该对在 WAN 端仍然是唯一的。

同一答案的另一个版本(不太清楚,但有示例):互联网服务器如何响应来自私有 IP 的请求?


一些其他基于 IP 的协议(例如 SCTP)也具有以完全相同方式工作的端口。

QUIC 为此使用 UDP 封装 - QUIC 端口实际上是 UDP 端口。

ICMP Echo(又名 ping)具有唯一的 ID 字段,其用途与“源端口”相同。(您可以说 ICMP 类型/代码字段的用途与“目标端口”相同。)

IPsec ESP 具有安全关联 ID,但据我所知,它们通常不被 NAT 跟踪 - NAT 设备通常将 ESP 视为没有端口,并且只允许单个客户端连接到给定服务器(或者更糟的是,某些 NAT 设备一次只允许单个客户端使用 ESP)。UDP 封装用于解决这个问题。

答案2

正确。反过来想想为什么不允许这样做。如果我访问一个公共 IP(例如 74.32.xx:5000),其中有两台机器在内部使用相同的端口,如果它们都在路由器级别进行端口转发,它怎么知道要路由到哪一台?答案是在网络内部使用反向代理或负载平衡器,具体取决于用例来委托传入流量。负载平衡器将能够为在同一端口上运行的应用程序提供服务,而反向代理可以读取数据包头并将数据发送到正确的内部服务器。

反向代理示例:假设您有 2 个网站分别运行 blue.com 和 red.com,并且它们都托管在内部服务器上,但共享您的公共 IP,并且都在端口 80 上运行。传入的请求将到达路由器,发送到反向代理,然后反向代理会说“用户请求 red.com”,然后将请求传递给内部托管 red.com 的 Web 服务器。

负载均衡器示例e:2 个内部服务器共享同一个端口,托管同一个应用程序。负载平衡器接收传入请求并发送到流量最少的服务器,或者可以设置为始终发送到一个服务器,但如果该服务器停止响应,则重新路由到另一台服务器作为故障转移。

相关内容