为什么 NAT 会转换源端口?

网络工程 纳特 第4层
2021-07-18 23:52:44

我开始了解 nat,我想知道为什么 NAT 会转换源端口?端口不代表请求服务的应用程序吗?那为什么一定要翻译呢?此外,如果 NAT 假设没有转换源端口并且同一网络上的两台不同的机器发送了一条消息但具有相同的源端口,会发生什么?会不会有什么不好的事情发生?

4个回答

首先,我假设您专注于 TCP。UDP 有一些差异,我在这方面不太了解。

我开始了解 nat,我想知道为什么 NAT 会转换源端口?

你问这个问题是对的,坦率地说,它并不总是需要。但是,有时需要这种翻译。鉴于有时需要这样做,并且考虑到 NAT 系统因此需要跟踪某些流量的源端口,并且由于每次都以相同的方式执行某些操作会提高效率,因此大多数 NAT 实现不会努力重用NATted 连接上的原始源端口。

许多(大多数?)协议不依赖于 TCP 连接的源端口,所以这是最简单的方法,而且很少受到伤害。

端口不代表请求服务的应用程序吗?

它确实如此,但通常源端口不是由应用程序指定的。相反,它是(有点)随机分配的。这实际上很好,因为在此之前,通过预测源端口号(使用 ICMP DESTINATION UNREACHABLE 数据包的“unreach”攻击)来破坏现有连接太容易了。

那为什么一定要翻译呢?此外,如果 NAT 假设没有转换源端口并且同一网络上的两台不同的机器发送了一条消息但具有相同的源端口,会发生什么?

你的第一个问题的答案在第二个问题的答案中,所以我会尝试第二个问题,如果它没有回答第一个,你就分享一下。

首先,假设您的 NAT 主机只有一个 IP 地址 (N) 要转换为。其次,假设您实际上有一个额外的巧合,即内部主机 A 和 B 都尝试通过端口 80 与源端口 17835 上的外部主机 X 进行通信。

  • A 的数据包(生成时,在 NAT 之前)看起来像:src: A:17835, dst: X:80。
  • B 的数据包(生成时,在 NAT 之前)看起来像:src: B:17835, dst: X:80。

NAT 后,假设源端口没有转换:

  • A 的数据包(经过 NAT)看起来像:src: N:17835, dst: X:80。
  • B 的数据包(在 NAT 之后)看起来像:src: N:17835, dst: X:80。

哎呀。他们看起来一样。它们对于远程主机 X 来说尤其相似。很可能会丢弃与第二次连接尝试相关的数据包,因为序列号将是错误的。

您在 NAT 主机上也有问题,因为它也无法区分两者之间的区别。它只能在每个源端口的 80 端口上与远程主机 X 保持一个“连接”记录。它必须保留此记录,以便在收到入站数据包时知道要转换回哪个内部主机。如果记录对应的是第一个连接的主机,那么你会有A(第一台主机)没有问题,B无法连接的体验。

更有趣的是,如果在为 A 建立连接后 B 在 NAT 中的记录覆盖 A 的记录,那么 NAT 系统将永远不会将 X 的响应转发给 A(它只有 B 的记录),并且 X 永远不会响应 B(错误的序列号) / 连接状态)并且没有人获胜(通信)。

说实话。NAT 是一个黑客。这是一个丑陋的黑客,我们要么很幸运它有效(因为我们还没有普遍推出 IPv6)或它成功的受害者(因为它运行良好,人们不坚持 IPv6 支持)。

可能是最简单的答案:

想象一下,两个 LAN 客户端访问同一个外部 Web 服务器,并且巧合地都使用相同的源端口。

如果 NAT 路由器现在对两个会话使用相同的外部源端口,并且外部目标 IP 和端口也相同,那么它应该如何找出返回的数据要去哪里?

此外,外部 Web 服务器可能会与来自单个 IP/端口组合的两个混合会话混淆。

NAT(网络地址转换)实际上并不转换端口。您很可能指的是 PAT(端口地址转换)。

更具体地说,您可能指的是动态 PAT——这是一种允许任意数量的内部主机共享一个或多个公共 IP 地址的转换类型:

动态 PAT 出站说明 - pracnet.net/nat

在上图中,请注意所有三个主机都发起了到 Internet 上目标的连接。所有三台主机(A、B 和 C)都随机选择自己的源端口(分别为 2222、3333 和 3333)。当它们的数据包穿过转换设备时,路由器会选择新的源端口(分别为 7777、8888、9999)。

这是至关重要的,因为重写源端口是允许返回流量转发回正确的发起主机的原因

动态 PAT 入站说明 - pracnet.net/nat

路由器记录了初始源端口和翻译后源端口之间的映射,并使用它来将响应流量正确返回到正确的主机。

如果路由器没有重写源端口,主机 B 和主机 C 的返回数据包都将到达相同的目标端口:

动态 PAT - 无需重新随机化源端口 - pracnet.net/nat

当这些数据包返回路由器时,路由器将无法知道哪个数据包应该到达主机 B,哪个数据包应该到达主机 C。

因此,动态 PAT 设备也必须重写源端口,以确保返回流量可以成功返回到原始主机。

要了解更多关于动态PAT的行动中,检查出的动态PAT文章网络地址转换的系列文章

我假设您指的是 NATNAPT版本。NAPT 转换 IPv4 地址和传输地址(TCP 端口、UDP 端口或 ICMP 标识符)。原因是可能有多个主机使用 NAT,这些主机可能使用具有相同传输地址(端口或标识符)的相同协议。