NAT 如何针对非标准或不常见的协议(或原始协议)发挥作用

NAT 如何针对非标准或不常见的协议(或原始协议)发挥作用

对于 TCP 和 UDP NAT 用户端口信息。对于其他协议(如 ICMP),它可以使用协议特定的技巧。如果使用不适用或无法识别的 IP 协议会发生什么?

这样的数据包能离开目标接口吗?如果能,会发生什么?源 IP 会改变吗?返回途中会发生什么?返回数据包有可能发往错误的 IP 吗?甚至全部ips 可用吗?

答案1

对于 TCP 和 UDP NAT 用户端口信息。对于其他协议(如 ICMP),它可以使用协议特定的技巧。

嗯,同样的 TCP 和 UDP也被称为“协议特定的技巧”——它们实际上与 ICMP Echo“请求 ID”或 IPsec“SPI”没有什么不同。(NAT 本身就是一种“技巧”。)

这样的数据包能离开目标接口吗?如果能,会发生什么?源 IP 会改变吗?

通常情况下是的。大多数 NAT 都会通过此类数据包,即使它们无法识别内部协议,因为与“丢弃所有内容”相比,它仍然有更大的成功几率。

回来的路上又发生什么事呢?

取决于 NAT 是否实际跟踪了传出的数据包。(情况有所不同。)

即使 NAT 不知道如何从内部协议中提取端口或 ID,它仍然可以跟踪协议类型,在某些情况下这可能就足够了。(每个 IP 数据包都有一个协议类型字段,因此所谓的“原始 IP”仅仅是“未知 IP 协议类型”的一种情况。)

例如,TCP 连接(IP 协议 6)和 ICMP Ping(IP 协议 1,ICMP 类型 8)将被跟踪为:

  • host 192.168.1.2 (as 42.0.2.1) → 62.205.132.12,,proto 6port 21445 → 80
  • host 192.168.1.2 (as 42.0.2.1) → 62.205.132.12,,proto 1type 8 code 0 id 1227

与此同时,一个无法识别的协议,比如6合4隧道将被跟踪为:

  • host 192.168.1.2 (as 42.0.2.1) → 62.205.132.12,,proto 41

所以,全部传入的协议 41 数据包将被转发回192.168.1.2。这意味着一台计算机仍可以使用该协议,但两台计算机同时使用可能就不行了。(与 UDP 非常相似,一些NAT 也会检查源 IP 地址,但许多只关心协议和端口。)

虽然我在上面的例子中使用了 6in4,但同样的事情也会发生在全部NAT 无法理解的协议,即使它们有端口(例如 UDP-Lite 或 SCTP)。

  • 另外:如果您的路由器恰好运行 Linux,您可以运行conntrack -Lcat /proc/net/nf_conntrack查看当前正在跟踪的所有状态。有些路由器甚至会在其 Web UI 中显示此信息。

最后,如果 NAT没有保持任何状态,则假定该数据包的目的地是路由器本身(与任何其他未跟踪的传入数据包相同),并且通常会被丢弃在地板上。

返回数据包有可能发往错误的ip吗?

最简单的情况是,不会。NAT 可以将返回数据包与某个已知状态相关联,或者不能,但它惯于随意制造垃圾。(通常如此。)

然而,如果 LAN 后面的两台计算机尝试使用相同的协议与同一个远程主机通信,那么它们的状态冲突。哪一方获胜可能会有所不同 - 要么使用最旧的状态直到它过期(因此两台计算机的回复都会继续使用第一台计算机),要么每隔几分钟它们就会互相覆盖(即它在两者之间反复切换)。动态 NAT 绝对不是为这种情况而设计的......

也许所有 IP 都可用?

不。理论上是可行的——例如,有些人使用静态端口转发配置来实现局域网唤醒——但默认这样做没什么用。如果有的话,它会使您的局域网更容易受到欺骗数据包的攻击。

(但事实上,以太网交换实际上是这样工作的——未知 MAC 的数据包会通过所有物理端口泛滥。)


顺便说一句,这实际上并不特定于 IPv4 NAT。状态跟踪是状态防火墙,IPv4 和 IPv6 均使用。即使没有 NAT/PAT,状态跟踪也允许防火墙自动接受所有已知数据包并拒绝未知的数据包。

因此,当人们声称“NAT增加了安全性”时,他们实际上是在谈论通常随附的防火墙配置(并且即使没有NAT也可以同样好地使用)。

答案2

NAT 是一个有趣的话题。

NAT 有三种类型:

  • 静止的
  • 动态的

大多数消费级路由器都使用 PAT,所以我们就选择它吧。

想象一下我家里有这样的布局:

Router   192.168.0.1
PC 1     192.168.0.2
PC 2     192.168.0.3
External IP 1.1.1.1 (Lets assume I have that one)

我的两台计算机都想要连接到 IP 为 151.101.65.69 的 www.superuser.com。

我在 PC1 上打开浏览器并输入 www.superuser.com,然后发生以下情况:

  • 我的计算机要求 DNS 服务器将 www.superuser.com 解析为 IP
  • DNS 服务器返回 151.101.65.69
  • 我的计算机打开一个随机源端口号,在本例中假设为 40000。
  • 我的电脑从源 192.168.0.2 向 151.101.65.69 发送一个数据包,并在其上放置序列号 1。
  • 路由器拦截该数据包,并将源从 192.168.0.2 更改为我们的 1.1.1.1,并记录它来自 192.168.0.2:40000。
  • 超级用户获取数据包,并向 1.1.1.1 发送响应
  • 路由器收到响应,查看序列号并说“啊哈,这是 192.168.0.2 的,我最好通过端口 40000 将其发送给他,他希望收到它。

同时,PC 2 可以进入相同的进程,但很可能会选择一个单独的端口。路由器会记录这些端口号,并根据需要将流量转移到正确的目的地。

路由器会保存一个如下的表:

Source              Destination
192.168.0.2:40000   151.101.65.69:80
192.168.0.3:56944   151.101.65:69:80

现在你会问:“但是 Lister,如果你选择的随机端口号已经被使用,会发生什么?你已经破坏了系统 Lister!”这完全没问题,路由器会将列表中的端口号增加到下一个可用的端口号,但会记得将正确端口的信息发送回 PC。

答案3

我在这个后期阶段添加了一个答案,因为这个问题在谷歌上仍然排名很高,而且实际上并没有提供详细的答案。

对于受支持的协议(如 TCP 和 UDP),NAT 设备将首先映射 IP 层中的地址,然后映射端口(如果需要),然后非常重要的是,如果更高级别的协议具有某种校验和或 HMAC 等,它将重新计算它(例如,UDP 校验和包括带有源/目标地址的虚拟头)。

它还会对 ICMP 响应主体执行相同的操作。因此,如果您通过 NAT 设备发送 UDP 数据包,而最终消费者使用 ICMP 响应将其反弹,则失败的 UDP 数据包的标头将被复制到 ICMP 数据块中。NAT 设备应该会发现这一点,并将地址和端口重新映射回发起者期望的地址和端口(通常不需要处理校验和,因为它只是 ICMP 数据中的标头)。

对于 NAT 设备无法识别的协议,例如 SCTP 或 UDPLITE,它将很好地映射地址,但由于它不了解更高级别的协议,因此它不知道重新计算校验和或 HMAC 等。

为了验证这一点,如果你在接收主机上运行像 tcpdump 这样的数据包嗅探器,你可能会看到到达的数据包具有正确的 IP 地址,但校验和是错误的,因此它们通常会被操作系统丢弃而不是传递给应用程序。

相关内容