客户端出站 TCP 端口是否可以同时用于多个目的地?
如果可能的话,这将使 NAT 网关更多地挤入 IP 地址,并使临时端口耗尽几乎不可能。
我想这个问题有几个层次:
- 它在概念上可行吗?
- 是否产生了难以缓解的新安全问题?
- 这已经有名字了吗?
- 是否有任何标准问题由于某种原因不允许这样做?推理是什么?
客户端出站 TCP 端口是否可以同时用于多个目的地?
如果可能的话,这将使 NAT 网关更多地挤入 IP 地址,并使临时端口耗尽几乎不可能。
我想这个问题有几个层次:
从概念上讲,是的
TCP 服务器接受同一端口上的多个连接,并将它们关联到正确的活动套接字连接。反之亦然。
关于 TCP 会话的常识表明,当您连接到网站时,您的本地机器使用一个临时端口,然后与另一端配对作为“连接”。然后在连接打开时该端口不再可用。
我怀疑客户端 TCP 端口可以重用,至少在概念上是这样。这是因为每个数据包都有源 IP、源端口、目的 IP 和目的端口。
设想:
之前,我曾经认为一个 NAT IP 地址限制为 65536 个连接。即 1xSourceIP X 65536xSourcePorts X 1xDestinationIP X 1xDestinationPort。但是,这种方案可以进一步扩展单个 IP 地址:
当客户端 A 多次使用同一目的地时,到该目的地 IP:Port 的连接将被限制为 65536 个。如果目标提供更多的目标端口别名,它可以连接到同一个目标 IP 地址 4.2M 次。
今天在任何主要操作系统上都可以使用 TCP/IP 堆栈吗?
它与 UDP 一起修改了 QUIC 协议。但这不是 TCP。
是否有任何工程问题使其无法实施?
不,在 TCP/IP 堆栈中的代码实现非常简单,并且它已经是一个成功实现的概念,用于 TCP 侦听器/服务器。
我无法在 TCP/IP 堆栈实现中找到任何相关文档。不过我还没有仔细搜索。
是否产生了难以缓解的新安全问题?
不会。数据包已经可以被欺骗,以下几个方面使其难以被利用:
这已经有名字了吗?
我不知道我的头顶
运营商是否已经在运营商级 NAT 上这样做了?
我不知道我的头顶
是否有任何标准问题由于某种原因不允许这样做?推理是什么?
我不知道我的头顶
TCP 连接由 4 个参数唯一定义:
所以暂时把 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设备的处理有不同的要求):
这导致了许多不同的 NAT 转换方法,它们具有有趣的名称,例如“Full Cone”、“Restricted Cone”、“Port Restricted Cone”等等。
这对点对点(主要用于音频/视频呼叫)的 NAT 遍历产生影响,并导致对 STUN、TURN、ICE 等的要求。
当您需要能够报告在给定时间哪个用户使用哪个端口时,这也可能使事情变得更加复杂,因此运营商可能对他们实施 NAT 的方式有限制。