我知道networking足够危险。 NAT的细节低级细节并不是我特别了解的。
我在今天早些时候偶然发现自己正在讨论关于在NAT网关后面放置一堆节点的问题。 (1个公共IP地址和X个私有LAN地址)。 我调用了TCP协议中源端口和目的端口字段的16位限制( http://www.ietf.org/rfc/rfc793.txt – 第15页),并提到它将限制我们的65,000个连接( 65536)。 – 我对这个答案不再那么自信了。 你能帮我一些细节吗?
我知道我们这边的传入端口(服务器端口)可以接受与sourceIP x SourcePort组合一样多的连接。 让我们暂时打折一下,重点关注源自局域网的连接,穿越NAT网关,随机在一个随机的端口上结束。
在一个正常的[Linux]系统上,我认为传出连接限制为每个源IP 1个端口。 如果我们假装我们生活在一个简单的世界里,每个系统只有一个IP地址,那么一个“正常系统”将被限制在绝对最大的65536个连接。
1)在TCP中是一个单一的来源IP限于65536 MAX的理论输出连接?
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)问题1和问题2的答案对于“非常规系统”(Cisco路由器充当NAT网关)是否有所不同?
例如:一个专门的networking设备,它具有一个面向公众的IP和多达65,000个Lan IP [或更多]。 有没有地方有魔法,或者只是总是回答问题2:是的? (或没有)
4)上述问题都假设一个有状态的TCP连接。 这个故事与UDP这样的无状态连接有什么不同?
5)我们的局域网是否仅限于通过单个公共IP地址与外部世界同时连接的65536(或其他理论上的限制)?
谢谢! 🙂
对于这个问题,我们背后非常BEEFY和全新的思科Nexus设备(我认为7000系列)。 忽略记忆/等的限制可能会更好,除非它们可以被特别量化。
纠正我,如果我错了,但这是我理解的方式。 限制是每个客户端/服务器/端口。 所以有鉴于此。
1)在TCP中是一个单一的来源IP限于65536 MAX的理论输出连接?
不,我相信对于相同的目标IP,它仅限于65536理论最大值。
Windows工作站(非服务器版本)有限制,使这个数字less得多。 Linux有资源限制,但一般不会受到普通用户的打击,您可以轻松调整它们。
当你开始增加64K附近的数字时,你可能会遇到其他的资源限制。
由于资源有限,消费级路由器可能有更低的限制。
2)或者是每个远程主机的实际限制65536个连接?
是
3)问题1和问题2的答案对于“非常规系统”(Cisco路由器充当NAT网关)是否有所不同?
没有
4)上述问题都假设一个有状态的TCP连接。 这个故事与UDP这样的无状态连接有什么不同?
UDP是无连接的。 所以这不是真的与UDP有关。
5)我们的局域网是否仅限于通过单个公共IP地址与外部世界同时连接的65536(或其他理论上的限制)?
没有。
在跟踪连接并提供其他跟踪function的有状态防火墙环境中,这些模块本身可能是有限制的。 运营商并没有说任何关于哪个防火墙/ NAT路由器正在使用,所以我们甚至不能猜测目前可能会施加什么限制。
由于NATdevise有很多方法,答案当然是“要看”。 Geoff Huston写了各种NATdevise的优秀概述。
根据我的经验,许多小型办公室/家庭办公室路由器不能处理相同地址的64k地址,但不仅仅是因为端口耗尽。 许多内存有限,并且在达到64k的限制之前会耗尽NAT表的内存。
5)我们的局域网是否仅限于通过单个公共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
长话短说的是,它依赖于平台,取决于configuration和实现。
但是让我快速解释一下:
显然 ,其他答案陈述理论极限达到> 65535(注意端口0通常是保留的 ),这在某种程度上是真实的,例如…:
然而 ,在现实世界中,在资源有限的硬件加速路由发生的情况下,NAT表具有众所周知的限制,这通常是用于保护的configuration参数。
思科提到从IOS 12开始,最大的NAT取决于DRAM产生大约10K左右的翻译( 来源 ),这比你的问题中的65Kless。
拿你的旧xDSL路由器来说,如果你想在家里build立一个有很多连接的P2P,大部分都已经configuration了一个1024〜4096的全局最大限制。 比如我家里的高端FTTH路由器,configuration了8K的NAT限制。
最后 ,为了回答Q2重写,我已经看到了带有以下NAT表的RFC3489的绝望实现的产品。 显然,最后一个限制了NAT的有效性:
如果你喜欢这个答案,请大声说出来!