塔南鲍姆关于 NAPT 的书中可能出现错字

网络工程 路由 IPv4 纳特 IP地址 脱氧核糖核酸
2022-02-16 11:33:41

根据我从多个来源(网络和其他书籍)中了解的关于NAPT(在 Linux 环境中也称为NAT 过载IP 伪装)的概念,如果存在类似以下的场景:

NAT盒子的放置和操作。

当一个数据包从 ISP 到达 NAT 框时,它是 TCP 标头中的DESTINATION PORT(而不是传入数据包SOURCE PORT),它被提取并用作 NAT 框映射表的索引,以定位正确的该表中的条目。

但是在 Tanenbaum 的书(计算机网络第 5 版)第 454 页第 5 章中,据说它是从传入数据包的 TCP 标头中提取的源端口,但这对我来说毫无意义,因为源端口传入数据包是传出数据包的目标端口,因此 NAT 表中没有与之匹配的条目。

在此处输入图像描述

这两个方案是在网络上找到的一些资源,它们帮助我研究了 NAPT:

在此处输入图像描述

在此处输入图像描述

根据我的理解,当数据包返回时遵循上述方案,它将在源端口字段 110 和目标端口字段 14500 中具有。然后从 TCP 标头中提取目标的值 14500 并用于定位NAT 表中的第一个条目。

2个回答

你说对了一部分,但塔南鲍姆并没有错。也许混淆的一部分是传出数据包的源端口(有内部和外部)的含义。

传入数据包的源端口和目标端口都被使用

当您从网络内部启动到外部目标的连接时,例如,端口 80 上的 Web 服务器,您的源端口和源 IP 地址是 SP1 和 SIP1,目标 IP 地址是 DIP 和目标端口 80。但是发送时,NAPT 将使用外部 IP 地址 SIP 作为源,通过端口,例如 P1。所以 NAPT 会添加一个类似的条目

SIP:P1 ; DIP:80 <==> SIP1:SP1

如果内部网络中的另一台机器使用 SP2 和 SIP2 发起到同一个 Web 服务器的连接,则来自 NAPT 的传出源 IP 地址将是相同的 (SIP),但具有不同的源端口 (P2),然后我们现在有桌子

SIP:P1 ; DIP:80 <==> SIP1:SP1

SIP:P2 ; DIP:80 <==> SIP2:SP2

假设您打开与另一台机器的连接,DIPx 和端口 P1x,您的 IP 地址仍然是 SIP1,但这次来自源端口 SPx,那么 NAPT 表变为

SIP:P1 ; DIP:80 <==> SIP1:SP1

SIP:P2 ; DIP:80 <==> SIP2:SP2

SIP:PX ; DIPx:P1x <==> SIP1:SPx

所以你可以看到,如果有来自外部的数据包,NAPT想要查看源IP地址和端口。这将是 DIP 和端口 80。此外,目标端口将是 P1(如果它响应第一台机器)或 P2(如果它响应第二台机器)。然后,源端口目标端口一起为表提供所需的索引。因此,如果我们有源 DIP:80 和目标端口 P1,那么表中有一个条目,我们在其中获得内部 IP 地址和端口的 SIP1:SP1。请注意 P1 和 SP1 的不同之处(这可能是您困惑的根源)

实际上,NAPT 的 NAT 表(TCP、UDP 和 ICMP 各一个)比您似乎理解的要复杂一些。表条目基于源地址和目标地址,包括 TCP 和 UDP 的端口号,以及 ICMP 查询 ID。

当一个数据包从 ISP 到达 NAT 框时,是 TCP 标头中的 DESTINATION PORT(而不是传入数据包的 SOURCE PORT),它被提取并用作 NAT 框映射表的索引,以定位正确的条目那张桌子。

对于从内部发起的连接创建的动态表条目的 NAPT 而言,这并非真的如此,因为您可能在内部有多个主机正在使用该 TCP 端口号进行连接,如果您声称是真的,那么所有主机都会返回流量只会转到使用该端口号的主机之一。通过为索引使用更多值,您可以通过使用相同端口号的 NAPT 框获得任意数量的 TCP 连接。

我认为您可能需要为外部发起的流量设置永久表条目(端口转发)这一事实感到困惑。在这种情况下,只有目标端口是事​​先知道的,所以这是用来确定内部目标地址的。