我正在使用调制解调器路由器,在某些情况下也在 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
这是不可能的,因为端口没有二级端口。
那么这是如何工作的呢?
让我们尝试一个简单的例子。
在“正常”的 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
。它将向该地址发回一个响应,该地址必须依次由每个路由器转换回来。CGN(“ISP NAT”)的工作方式大致相同。唯一的区别是它不为其内部主机提供 RFC1918 私有地址,因为这可能会与业务网络发生冲突。相反,
100.64.0.0/10
范围 (RFC6598) 中的地址由上图中的“路由器 2”分发。就客户自己的路由器而言,其“公共”地址来自该范围 - 但实际上无法在公共互联网上访问!不。端口不是主机地址的一部分——在 IP 层没有端口这样的东西,无论是否使用 NAT。主机的 IP 地址始终只是地址;它没有“二级”端口,也没有“一级”端口。[1]
相反,端口属于主机在 IP 之上建立的每个单独的 TCP/UDP连接。(好吧,严格来说它们是每个数据包的一部分,同一连接中的所有数据包都使用相同的端口。)
因此,当您看到一个写为 的地址时
12.34.56.78:123
,整件事并不是主机的 IP 地址——那是IP 地址仍然是 的主机上端口 123的TCP 连接端点12.34.56.78
。这些端口不是由 NAT 添加的——它们一直都在那里;每个 TCP 或 UDP 数据包都有两个端口(一个“源”端口和一个“目标”端口)。执行 NAT 的路由器只是将它们转换为不同的值。无论您拥有多少层 NAT,该数据包仍将具有两个端口。
[1]这意味着当你有两个主机在一个公共地址后面进行 NAT 转换时,IP 层实际上无法区分它们——当一个来自外部的 IP 数据包被发送到
someIP
它时,它无法指定它想要哪个主机;NAT 路由器必须从 TCP 层推断这一点。这就是为什么您必须配置“端口转发”规则才能接收入站连接。