结合 NAT 和隧道

网络工程 路由器 ip IPv4 纳特 隧道
2022-03-04 17:01:42

我正在阅读一篇文章,我想到了一个疑问。假设路由器中有一个实现 NAT 的接口。同样的接口是隧道的极端。如果我要通过所述隧道发送消息,则内部 IP 标头的原始地址将相同,或者它会相应地转换为公共地址?

我将举一个例子来说明这一点。

PC1 想向另一个网络中的 PC2 发送数据报。两个网络都通过一个隧道连接,该隧道在路由器 R1 的接口中具有极端性。这个相同的接口实现了 NAT(网络地址转换)。

到 R1 到达数据报

IP源地址:10.10.10.1

IP目标地址:192.168.0.1

具有外部和内部报头的新数据报将离开 R1。外面的那个将具有对应于隧道极端的地址。对于内部标题,我不知道其中哪一个适用

选项1。

IP源地址:100.0.0.1(10.10.10.1的NAT转换)

IP目标地址:192.168.0.1

选项 2。

IP源地址:10.10.10.1

IP目标地址:192.168.0.1

提前谢谢大家,任何帮助将不胜感激!:)

3个回答

通常,您可以将 NAT 和隧道视为两个不同的过程。隧道是内核中的东西,但防火墙/NAT 通常与接口相关联。NAT 处理接口上的真实数据包,这是最常见的情况。它可以是 BSD、Cisco 或其他任何东西 - 数据包处理几乎相同:

  1. 数据包到达内核并被防火墙分析。防火墙将其传递给内核。
  2. 内核接收数据包并分析路由表以传递它。在您的情况下,路由表会将数据包传递到隧道接口,此操作将发起新数据包(具有外部隧道地址)。
  3. 新数据包将再次针对路由表进行处理以找到下一跳。
  4. 内核将尝试通过特定接口发送数据包。
  5. 防火墙将在接口发送之前分析数据包,如果它匹配 NAT 规则,则应用 NAT。

因此,如果您的 NAT 规则绑定到出站接口并包含类似 10.10.10.0/24 -> 100.0.0.1 的内容,它将不会匹配对某人来说已经是 100.0.0.1 的隧道数据包。这也意味着您的选项 2 将发生在这个封装的数据包中。

为什么要猜测我们是否可以检查并看看会发生什么?

我已经准备了一个拓扑,代表我们将用于实验的场景。

拓扑-1

请注意,隧道不会神奇地工作,它们需要正确配置底层网络。对于底层网络配置,我在路由器之间设置了 eBGP 会话以使其启动和运行。这个问题无关紧要,所以让我们专注于 NAT 和隧道。

第 1 阶段。没有 NAT,没有隧道。让我们看看数据包在没有 NAT 或隧道的情况下“正常”传输时的样子,如 和 之间的链接cumulus6所示cumulus5

阶段1

没什么好看的吧?到目前为止,正如人们所期望的那样。

第 2 阶段。添加 NAT。然后让我们配置 NAT 规则。请注意,要设置 NAT,我们需要有两个接口:insideoutside对于我们的拓扑结构cumulus6内部swp2外部swp1

拓扑-2

这是Dynamic NAT使用 Cumulus VX 进行配置的方法。

net add nat dynamic snat icmp source-ip 10.0.0.0/24 out-interface swp1 translate 100.0.0.1-100.0.0.1

它基本上说我们需要根据源地址和出站接口动态转换swp1为地址100.0.0.1请注意协议是如何设置的icmp——这是为了简单起见。ICMP 如何与 NAT 一起工作这是另一个讨论的主题,但基本上与它对 UDP 和 TCP 的工作方式相同不过,这对我们的问题无关紧要。

现在让我们看看现在如何在 PC 之间看到相同的 ping!

第二阶段

好的!现在我们翻译了我们的地址。我们的主机 PC 现在看起来像是连接cumulus6到其他设备的线路。

最后阶段。NAT 和隧道。现在我们准备建造隧道看看!如前所述,隧道依赖于底层网络进行传输。我已经配置了 GRE 隧道,其 IP 端点地址为10.99.99.1oncumulus610.99.99.2oncumulus4拓扑的另一侧和100.0.0.1/200.0.0.1用于底层传输。

拓扑-3

我还添加了一个静态路由来强制流量192.168.0.2进入隧道接口,在这里你有它。

第三阶段

如您所见,外部 IP 标头提供 和 之间的cumulus6传输cumulus4

答案。现在,我们已准备好对您的问题做出明智的回答。内部 IP 数据包没有转换源 IP 地址10.0.0.2给定 NAT 定义,您甚至可以直观地知道——当我们创建 NAT 转换规则时,我们必须指定出站接口。NAT 仅在我们使用该接口作为流量的出站时才适用(swp1在我们的例子中),但是,我们的数据包被路由到隧道接口,所以它不适用!

希望这有帮助!至少玩起来很有趣:)

我认为您的意思是 NAPT 版本的 NAT,它允许 NAPT 设备后面的许多设备共享外部地址。

请记住,到达执行 NAPT 的接口且不在 NAT 表中的任何数据包都以 NAT 设备本身为目的地。这意味着路由器将识别出以隧道接口为目的地的流量被发送到路由器的隧道接口。这在RFC 3022,传统 IP 网络地址转换器(传统 NAT)中进行了解释:

在 NAPT 设置中,注册的 IP 地址与存根路由器 WAN 接口的 IP 地址相同,路由器必须确保区分源自自身的 TCP、UDP 或 ICMP 查询会话与源自上节点的会话本地网络。假设所有入站会话(包括 TCP、UDP 和 ICMP 查询会话)都定向到作为端节点的 NAT 路由器,除非目标服务端口静态映射到本地网络中的不同节点。

TCP、UDP 和 ICMP 查询类型以外的会话根本不允许来自本地节点,由 NAPT 路由器提供服务。