我对网络的了解足以让人感到危险。我对 NAT 的底层细节并不十分了解。
今天早些时候,我偶然发现自己参与了一场关于将我们的一堆节点置于 NAT 网关后面的讨论。(1 个公共 IP 地址和 X 个私有 LAN 地址)。我调用了 TCP 协议中对源端口和目标端口字段的 16 位限制,(http://www.ietf.org/rfc/rfc793.txt- 第 15 页)并提到它将限制我们连接数为 65,000 个(65536)。——我对这个答案不再那么有信心了。你能帮我提供一些详细信息吗?
我知道我们这边的传入端口(服务器端口)可以接受与源 IP x 源端口组合数量相同的连接。我们暂时不考虑这些,而是专注于源自 LAN、通过 NAT 网关并在随机端口的随机主机上结束的连接。
在普通的 [Linux] 系统上,我认为每个源 IP 每个端口的传出连接数限制为 1 个。如果我们假设我们生活在一个简单的世界中,每个系统只有 1 个 IP 地址,那么“普通系统”的最大连接数将限制为 65536 个。
1)在 TCP 中,单个源 IP 的理论最大传出连接数是否限制为 65536?
2)或者每个远程主机的连接数限制实际上是 65536 个?
2)[换种写法]:同一个源端口可以用于不同的 remoteHostIP:RemotePort 组合吗?
例如:(以下可以吗?)
Source IP |Source Port |Remote IP|Remote Port
192.168.0.20:36500 --> 8.8.8.8:23
192.168.0.20:36500 --> 8.8.4.4:23
3)对于“非正常系统” [思科路由器充当 NAT 网关],问题 1 和 2 的答案是否不同?
例如:一个专用网络设备,它有一个面向公众的 IP,背后有多达 65,000 个 Lan IP [或更多]?这其中是否有魔力,还是问题 2 的答案永远是:是?(或否)
4) 以上问题都假设存在有状态的 TCP 连接。对于像 UDP 这样的无状态连接,情况会有什么不同吗?
最后:
5)我们的 LAN 通过单个公共 IP 地址与外界建立的并发连接数是否会被限制为 65536(或其他理论限制)?
谢谢你! :)
就这个问题而言,我们使用的是非常强大和全新的 Cisco Nexus 设备(我认为是 7000 系列)。除非可以具体量化内存/等限制,否则最好忽略它们。
答案1
如果我错了请纠正我,但这是我的理解方式。限制是针对每个客户端/服务器/端口的。因此,鉴于此。
1)在 TCP 中,单个源 IP 的理论最大传出连接数是否限制为 65536?
不,我认为对于同一目标 IP,理论上最大数量限制为 65536。
Windows 工作站(非服务器版本)有限制,因此这个数字要小得多。Linux 有资源限制,但一般用户通常不会遇到这些限制,而且您可以轻松调整它们。
当您开始将数字增加到接近 64K 时,您可能会遇到其他资源限制。
由于资源有限,消费级路由器的限制可能会低得多。
2)或者每个远程主机的连接数限制实际上是 65536 个?
是的
3)对于“非正常系统” [思科路由器充当 NAT 网关],问题 1 和 2 的答案是否不同?
不
4) 以上问题都假设存在有状态的 TCP 连接。对于像 UDP 这样的无状态连接,情况会有什么不同吗?
UDP 是无连接的。因此这与 UDP 无关。
5)我们的 LAN 通过单个公共 IP 地址与外界建立的并发连接数是否会被限制为 65536(或其他理论限制)?
不。
在跟踪连接并提供其他跟踪功能的状态防火墙的背景下,这些模块本身可能存在限制。 op 没有说明正在使用哪种防火墙/NAT 路由器,因此我们目前甚至无法推测它可能施加什么限制。
答案2
长话短说,它严重依赖于平台、配置和实现。
但让我快速解释一下:
显然其他答案指出理论限制达到> 65535(注意端口0通常是预订的),这在一定程度上可能是正确的,例如……:
- 在大中央国家机关事务管理局系统或类似的高级路由器,其主要用途就是这个,包括NAT-PAT。
- 在某些Linux 发行版在某些情况下(例如 RAM > 1GB、内核已准备好等),使用 PC 通过 CPU 进行软件 NAT/路由时,理论上是可行的。
然而在现实世界中,硬件加速路由在资源有限的情况下进行,NAT 表具有众所周知的限制,这通常是用于保护的配置参数。
Cisco 提到从 IOS 12 开始,最大 NAT 取决于 DRAM,从而产生大约 10K 次转换(来源),比你问题中的 65K 要少。
以你旧的 xDSL 路由器为例,如果你想在家里建立具有许多连接的 P2P,大多数路由器都配置了 1024~4096 的全局最大限制。例如,我家里的高端 FTTH 路由器的 NAT 限制由供应商配置为 8K。
最后,回答 Q2-rewrite,我见过一些产品有 dispair 实现RFC3489使用以下 NAT 表。显然最后一个表确实大大限制了 NAT 的可能性:
- iAddr:iPort - eAddr:ePort - dAddr:dPort(典型的对称 nat)
- iAddr:port - eAddr:port - dAddr (非常低端产品)
如果您喜欢这个答案请点赞!
答案3
5)我们的 LAN 通过单个公共 IP 地址与外界建立的并发连接数是否会被限制为 65536(或其他理论限制)?
不是,因为一个端口 NAT IP 可以用于多个连接:
cat /proc/net/ip_conntrack | grep 51380
tcp 6 191 ESTABLISHED src=10.1.8.5 dst=17.133.254.23 sport=51380 dport=5223 src=17.133.254.23 dst=my.nat.pub.ip sport=5223 dport=51380 [ASSURED] mark=0 use=2
tcp 6 24 CLOSE_WAIT src=10.1.26.1 dst=80.68.255.71 sport=51380 dport=80 src=80.68.255.71 dst=my.nat.pub.ip sport=80 dport=51380 [ASSURED] mark=0 use=2
答案4
NAT映射表主键:
sourceIP:sourcePort + DestinationIP:DestinationPort
我们可以将不同的sourceIp:sourcePort映射到同一个DestinationIP:DestinationPort。因此端口号(2^16
)不是连接的限制。