我使用的是调制解调器路由器,在某些情况下也位于 ISP NAT 后面。NAT(ISP 的 NAT)后面的 NAT(路由器的 NAT)如何工作?
据我所知,NAT 的工作方式如下:计算机 A 和 B 获取内部 IPinternal1
和internal2
。然后 NAT 为它们提供相同 IP 上的端口,这样它们在面向公众时就位于someIP:1
和 之后someIP:2
。
但是如果路由器这样做了,然后 ISP 再次这样做了,那么 IP 的形式就会是someIP:1:100
,someIP:2:101
这是不可能的,因为端口没有二级端口。
那么这是如何实现的呢?
答案1
让我们尝试一个简单的例子。
在“正常”的 NAT 家庭网络中,192.168.1.2:11223
被映射到“公共”地址:端口对203.0.113.5:22334
。因此,最终目标主机认为它收到了数据包203.0.113.5:22334
,并且不知道其背后的“私有”网络。
现在,让我们将其扩展为具有两级 NAT 的双 NAT 网络。
在最靠近主机的路由器上,192.168.1.2:11223
被映射到“公共”地址:端口对10.0.0.8:22334
。现在,10.0.0.8
仍然是私有地址,只是在不同的网络中。就此路由器而言,它的工作已完成。
在下一个路由器上,它充当第一个路由器所在 LAN 的网关,10.0.0.8:22334
并映射到其自己的公共接口上的另一个地址:端口对203.0.113.5:12345
。
最终目标主机认为它收到了来自 的数据包203.0.113.5:12345
。它和整个公共互联网都不知道这里涉及的任何10.0.0.0/8
或192.168.0.0/16
子网。它将向该地址发送响应,该响应必须由每个路由器依次转换回来。
Different address:port pairs for
thesame endpoint in one connection!
+------------------------+ -----------------------------------
|Host |
|192.168.1.2 |
+------------------------+ 192.168.1.2:11223 <--- Host sees
this pair
+------------------------+ 192.168.1.2:11223 <--- Router 1 sees
|Router 1 | req from this
|internal 192.168.1.1/24 |
|external 10.0.0.8 |
+------------------------+ 10.0.0.8:22334 <------ Router 1 sends
req from this
+------------------------+ 10.0.0.8:22334 <------ Router 2 sees
|Router 2 | req from this
|internal 10.0.0.1/24 |
|external 203.0.113.5 |
+------------------------+ 203.0.113.5:12345 <--- Router 2 sends
req from this
+------------------------+ 203.0.113.5:12345 <--- Public internet
|Public internet | sees this pair
+------------------------+
CGN(“ISP NAT”)的工作方式大致相同。唯一的区别是它不会为其内部主机提供 RFC1918 私有地址,因为这可能会与业务网络发生冲突。相反,100.64.0.0/10
上图中的“路由器 2”会分配范围 (RFC6598) 中的地址。就客户自己的路由器而言,其“公共”地址来自该范围 - 但实际上无法在公共互联网上访问!
答案2
据我所知,NAT 的工作方式如下:计算机 A 和 B 获得内部 IP internal1 和 internal2。然后 NAT 为它们提供相同 IP 上的端口,这样它们在公开时位于 someIP:1 和 someIP:2 后面。
端口号不是主机地址的一部分——无论是否使用 NAT,IP 层都没有端口。主机的 IP 地址始终是只是地址;它没有“二级”端口,也没有“一级”端口。[1]
相反,端口属于每个单独的 TCP/UDP联系主机在 IP 之上创建的端口。(严格来说,它们是每个数据包的一部分,并且同一连接中的所有数据包都使用相同的端口。)
因此,当您看到写为的地址时12.34.56.78:123
,整个过程就是不是主机的 IP 地址 – 这是端口 123 的 TCP 连接端点在一个主机的 IP 地址仍然很简单12.34.56.78
。
这些端口未添加通过 NAT 实现 - 它们一直存在;每个 TCP 或 UDP 数据包都有两个端口(一个“源”端口和一个“目标”端口)。执行 NAT 的路由器只是将它们转换为不同的值。无论您有多少级 NAT,该数据包仍然会有两个端口。
[1]这意味着,当两个主机通过 NAT 连接到同一个公共地址时,IP 层实际上无法区分它们——当外部 IP 数据包发送到someIP
它时,它无法指定它想要哪个主机;NAT 路由器必须从 TCP 层推断这一点。这就是为什么您必须配置“端口转发”规则才能接收入站连接。