客户端出站 TCP 端口是否可以同时用于多个目的地?

网络工程 ipv4 通讯协议 ipv6
2021-07-21 08:09:49

客户端出站 TCP 端口是否可以同时用于多个目的地?

如果可能的话,这将使 NAT 网关更多地挤入 IP 地址,并使临时端口耗尽几乎不可能。

我想这个问题有几个层次:

  1. 它在概念上可行吗?
  2. 是否产生了难以缓解的新安全问题?
  3. 这已经有名字了吗?
  4. 是否有任何标准问题由于某种原因不允许这样做?推理是什么?
2个回答

从概念上讲,是的

TCP 服务器接受同一端口上的多个连接,并将它们关联到正确的活动套接字连接。反之亦然。

关于 TCP 会话的常识表明,当您连接到网站时,您的本地机器使用一个临时端口,然后与另一端配对作为“连接”。然后在连接打开时该端口不再可用。

我怀疑客户端 TCP 端口可以重用,至少在概念上是这样。这是因为每个数据包都有源 IP、源端口、目的 IP 和目的端口。

设想:

  • 客户端 A 使用 203.0.113 与 TCP 连接。1 :12345 到主机 B 203.0.113。2 :80
  • 客户端 A 使用相同的端口 203.0.113 与 TCP 连接。1 :12345 到主机 C 203.0.113。3 :80
  • 当主机 B 收到来自客户端 A 的数据包时,它看到的源 IP:Port 为 203.0.113。1 :12345
  • 当客户端 A 收到来自主机 B 的数据包时,它看到源 IP:Port 为 203.0.113。2 :80,因此可以与主机 B TCP 会话相关联
  • 当客户端 A 收到来自主机 C 的数据包时,它看到源 IP:Port 为 203.0.113。3 :80 并且可以与主机 C TCP 会话相关联。

之前,我曾经认为一个 NAT IP 地址限制为 65536 个连接。即 1xSourceIP X 65536xSourcePorts X 1xDestinationIP X 1xDestinationPort。但是,这种方案可以进一步扩展单个 IP 地址:

  • 理论上:15,891T 连接 - 1xSourceIP X 65536xSourcePorts X 3.7MxDestinationIPs X 65536xDestinationPort
  • 实际上:242B 连接 - 1xSourceIP X 65536xSourcePorts X 3.7MxDestinationIPs X 1xDestinationPort

当客户端 A 多次使用同一目的地时,到该目的地 IP:Port 的连接将被限制为 65536 个。如果目标提供更多的目标端口别名,它可以连接到同一个目标 IP 地址 4.2M 次。

今天在任何主要操作系统上都可以使用 TCP/IP 堆栈吗?

它与 UDP 一起修改了 QUIC 协议。但这不是 TCP。

是否有任何工程问题使其无法实施?

不,在 TCP/IP 堆栈中的代码实现非常简单,并且它已经是一个成功实现的概念,用于 TCP 侦听器/服务器。

我无法在 TCP/IP 堆栈实现中找到任何相关文档。不过我还没有仔细搜索。

是否产生了难以缓解的新安全问题?

不会。数据包已经可以被欺骗,以下几个方面使其难以被利用:

  • 源/目标耦合
  • 内部 TCP 功能,例如序列号
  • 在 TCP 连接套接字之上使用 TLS 通道

这已经有名字了吗?

我不知道我的头顶

运营商是否已经在运营商级 NAT 上这样做了?

我不知道我的头顶

是否有任何标准问题由于某种原因不允许这样做?推理是什么?

我不知道我的头顶

TCP 连接由 4 个参数唯一定义:

  • 本地IP地址
  • 本地端口
  • 远程 IP 地址
  • 远程端口

所以暂时把 NAT 放在一边:

  • 您可以在同一 IP 地址之间建立多个连接,前提是一个端口不同。由于通常服务器端的端口是固定的,这意味着客户端的端口需要更改。这就是为什么我们有临时端口。

  • 您可以使用相同的端口号建立多个连接,但不同的 IP 地址(通常是客户端)。

如果您查看netstat(eg netstat -n46)的输出,您会看到列出的每个连接确实具有这 4 个参数(以及一些状态信息),并且您经常有许多连接具有 2 或 3 个公共参数,但从来没有 4常见的。

除了明显的资源问题和相关的操作系统限制(和保留端口)之外,这意味着服务器(具有固定的本地 IP 和端口)可以接收65535 * 223*(1<<24)连接。客户端(具有固定的本地 IP)可以打开到单个服务器(具有固定的 IP 和端口)的 65535 个连接,但是65535 * 223*(1<<24)到多个服务器的连接都在单个端口上侦听,并且65535 * 65535 * 223*(1<<24)与多个服务器的连接在所有可能的端口上侦听。

现在,当您引入 NAT 时,问题是如何将内部 IP 地址和端口映射到外部 IP 地址和端口。方法多种多样(对NAT设备的处理有不同的要求):

  • 有些会为单个(内部 IP 地址、内部端口)组合保留给定的外部端口。
  • 其他人将在映射中包括远程 IP 地址和/或端口。
  • 其他人仍将使用 IP 地址池,而不仅仅是一个。

这导致了许多不同的 NAT 转换方法,它们具有有趣的名称,例如“Full Cone”、“Restricted Cone”、“Port Restricted Cone”等等。

这对点对点(主要用于音频/视频呼叫)的 NAT 遍历产生影响,并导致对 STUN、TURN、ICE 等的要求。

当您需要能够报告在给定时间哪个用户使用哪个端口时,这也可能使事情变得更加复杂,因此运营商可能对他们实施 NAT 的方式有限制。