具有相同 IP 子网和相同 IP 地址的 NAT VLAN

网络工程 思科 VLAN 纳特 路线
2021-07-13 14:00:44

我想做一些与具有相同 IP 子网的 NAT VLans非常相似的事情, 但它足够不同,我不知道如何将它应用到我的应用程序中。

我确实发现了NAT Overlapping,但它会将具有相同 IP 的单个 PC 连接到它们自己的路由器。如果我将该拓扑应用于我的应用程序,我需要为每对路由器(至少 6 个路由器)加上一个交换机(至少 5 个交换机)。也许它可以用 L3 交换机来完成,但对于我的应用程序来说,这仍然是太多的硬件。“ip nat external source list”可能会提供答案,但我需要研究文档。

这是一个测试和开发实验室应用程序,其中要求在网络上同时运行多个相同的设备对。在我的应用程序中,我有多达 10 对设备。一对中的每个设备都有不同的 IP 地址。每对具有与下一对相同的 IP 地址。所有 IP 地址都适合在 /24 子网中。

在 LAN 中,我希望能够从外部对每个设备进行寻址,就好像它具有唯一的 IP 地址一样。所有外部地址必须在同一个子网 /24 内。不需要一对设备与任何其他设备对进行通信。每个设备只需要在 LAN 中可见。

我购买了 Cisco 路由器和 L2 交换机以配置为棒上的路由器。原则上,我想将外部 IP 地址设置为 VLans 和 NAT 到相关的内部设备。从外面看,每个单独的设备似乎都有一个唯一的 IP 地址。图中说明了这一点。我所有的阅读都告诉我路由器会反对,因为 VLans 将共享相同的子网。

我怎样才能达到要求?我可以将路由器表中的外部 IP 地址 NAT 到相应的 VLans 吗?有没有办法解决 VLans 共享子网的问题?

简化的网络图

2个回答

NAT 发生在可以执行 NAT 的设备上,例如路由器(即使是第 3 层交换机也不能进行 NAT,但 65xx 系列除外)。外部和内部寻址位于 NAT 设备的不同接口上。您需要在路由器和主机之间的每个 VLAN 上放置一个路由器,或者您的主机本身可以在物理接口和虚拟接口之间进行 NAT,但这在这里是题外话(您可以尝试询问在服务器故障)。

更大的问题是 VLAN 寻址。您的路由器需要每个接口 (VLAN) 位于不同的网络中。您不能在不同接口上使用相同或重叠的网络配置路由器。此外,您试图在固有的二进制数(IP 地址)中使用 VLAN 地址的基数 10 地址分隔,但效果不佳。这意味着每个 VLAN 的最短前缀与您拥有的寻址一样/29,为您提供八个(六个可用)主机地址。一个网络/28将有 16 个(14 个可用)主机地址,这比您拥有的 10 个主机地址的间隔要长,从而导致 VLAN 上的网络重叠。

使用/31寻址是可行的,并且可以在 Cisco 路由器上进行配置,但是某些主机操作系统(例如 Windows)不支持它。它看起来像这样:

  • VLAN 10是172.30.21.100/31,这是172.30.21.100172.30.21.101
  • VLAN 11 172.30.21.110/31,这是172.30.21.110172.30.21.111
  • VLAN 12是172.30.21.120/31,这是172.30.21.120172.30.21.121
  • VLAN 13 172.30.21.130/31,这是172.30.21.130172.30.21.131

使用/30寻址对您选择的 VLAN 地址有一些问题:

  • VLAN 10 is 172.30.21.100/30,它是172.30.21.100to 172.30.21.103,但是172.30.21.100是网络地址,不能用作主机地址
  • VLAN 11 is 172.30.21.108/30,即172.30.21.108to 172.30.21.111,但是172.30.21.111是广播地址,不能用作主机地址
  • VLAN 12是172.30.21.120/30,这是172.30.21.120172.30.21.123的,但172.30.21.120是网络地址,无法用作主机地址
  • VLAN 13是172.30.21.128/30,这是172.30.21.128172.30.21.131的,但172.30.21.131是网络地址,无法用作主机地址

使用/29寻址有几个问题。

  • VLAN 10是172.30.21.100/29,这是172.30.21.96172.30.21.103
  • VLAN 11 is 172.30.21.104/29,即172.30.21.104to 172.30.21.111,但是172.30.21.111是广播地址,不能用作主机地址
  • VLAN 12是172.30.21.120/29,这是172.30.21.120172.30.21.127的,但172.30.21.120是网络地址,无法用作主机地址
  • VLAN 13 172.30.21.128/29,这是172.30.21.128172.30.21.135

如果您可以将路由器上的 VLAN 寻址调整为其他内容,并且您的主机可以在内部进行 NAT,那么您可以在不将 NAT 设备放置在 VLAN 上的情况下执行此操作,否则您需要在每个 VLAN 上进行 NAT,每个 VLAN 需要一个 NAT 设备.

需求 本方案旨在解决连接成对主机的问题。这对主机的每个 IP 地址都是不同的。所有对共享相同的两个 IP 地址。对的IP是:

172.30.21.50

172.30.21.60

这里的用例用于测试和开发系统。只需要平均网络速度。有一个连接到网络的其余部分。该解决方案必须在空间、能源使用和成本方面高效。

Cisco“解决方案” 有很多问题在寻求解决重叠子网的各种问题的方法。我学得越多,就越不可能实现纯粹而实用的思科解决方案。思科提供的解决方案范围非常狭窄。

如果可以在交换机端口对 IP 进行 NAT,则可以解决很多问题。根据定义,L2 交换机不能这样做。L3 交换机不会这样做。这就是路由器的工作。如果在 2 个网络之间放置一个 Cisco 路由器是个好主意,那么在每个交换机端口上放置一个 Cisco 路由器来解决我的问题就不是了。

我提出的解决方案是使用配备 2 个 USB 到 LAN 适配器的 Raspberry Pi 实现交换机端口路由器。它们将被配置为启用 NAT 的路由器。一个连接到 1 个交换机端口的 RasPi 然后可以路由到一对服务器。对于我的应用程序(SSH 和文件传输),不需要高性能网络,并且带有 USB/LAN 适配器的 Raspi 不会提供它。与 Cisco 路由器相比,Raspberry Pi 使用更少的空间、更少的功率和成本。该概念如图所示。使用路由器对 IP 流量进行 NAT 应该使 VLAN 易于设置。

如果需要性能,那么将使用合适的路由器,加上一个机架来安装它们。Cisco 1841 路由器只有两个端口,因此我需要在每个交换机端口上安装一个路由器。需要双倍的 Raspi's 数量。

VLAN 的全部意义在于能够在软件中创建虚拟网络。必须将硬件中的 NAT IP 加倍以解决交换机的编程软件限制并不好。

我得出的结论是,基于 Cisco 的解决方案太复杂,需要的设备太多。这是一个糟糕的解决方案。

具有重叠子网的网络

我认为基于层的解决方案是错误的方法。我开始研究下图所示的 IP 管道。第一个路由器将外部可见地址对 NAT 到另一个子网,专门用于分隔 VLAN 子网范围,以便交换机可以接受它们。然后 VLAN 将流量定向到特定的交换机端口。然后路由器将中间地址 NAT 转换为服务器的实际地址。

IP 管道说明

IPTables 解决方案

确定基于 Cisco 的解决方案无法满足设计要求后,我开始寻找替代方案。很快就找到了 IP 表。IPTables(几乎)忽略层。它专门设计用于处理 IP 管道。

我想出的解决方案如下:

我的网络有一个基于 Linux IPtables 的防火墙/路由器。

这将连接到具有许多 PCI 插槽的 PC。为比特币挖矿而制作的 MoBo 是理想的候选者。Quad Gb NIC 现在很容易获得。我将其称为交换机主机。使用 24 Gb LAN 端口组装 PC 相对便宜且容易。比新的思科设备便宜很多。

IPtables 进程管道如下图所示。

步骤 1. 在防火墙上编写 IPtables 规则,将 IP 地址块发送到交换机主机上的特定端口。172.30.21.50 到 99 > 172.30.21.100 块是映射到 IP 对的 IP 地址。端口 172.30.21.100 连接到安装了许多网卡(quad PCI 1Gb NICs)的交换机主机。

步骤 2. 交换机主机上的 IPtable 规则将块的每个 IP 地址定向到特定 LAN 端口。这些相同的规则对地址进行 NAT 以匹配 IP 对之一

172.30.21.50 > NAT 172.30.21.50 > eth1

172.30.21.51 > NAT 172.30.21.60 > eth0

172.30.21.52 > NAT 172.30.21.50 > eth2

172.30.21.53 > NAT 172.30.21.60 > eth3

应用的解决方案 在经过一系列迭代之后,从基于 Cisco 的方法开始,我最终得到了下面概述的解决方案。

我没有使用 IPTables,而是使用了 nft,它的现代替代品,在单个 Linux 机器上运行。这里的规则不允许发布脚本,所以我将描述所做的事情。图中显示的解决方案有几个部分。 设计

A 部分 我设置了一个过滤器,以便只允许连接设备 IP 范围内的流量进入。

B 部分 nft 设置为将特定 IP 地址定向到特定端口。它们的作用类似于 VLAN,但它们不是,因为所有 IP 地址都在同一个域中。数据包经过 DNAT 处理以正确路由它们。来自网络的数据包被发送到正确的端口,目标 IP 被更改以匹配主机。

C 部分C部分需要区分到一对主机的邻居的流量,或到网络其余部分的流量。

请注意,不需要跨不同主机对进行通信。组成一对的两台主机之间只需要通信。下面的设置将允许主机对之间的通信。

设置 nft 以便任何具有其邻居的目标 IP 的流量都被引导到正确的 eth 端口,反之亦然。例如,如果来自主机 172.30.21.50(源)的数据包来自 eth0,并且目标 IP 为 172.30.21.60(其邻居),则 nft 通过端口 eth1 将其发送出去。不需要NATing。

如果一个数据包从目标 IP 为 172.30.22.010 的网络传入,那么它会被 DNATed 到 172.30.21.50,源不受影响(ip xxx.xxx.xxx.xxx),并从 eth0 端口发送出去。

在 eth0 端口返回的那个数据包的回复具有 xxx.xxx.xxx.xxx 的目标 IP 和 172.30.21.50 的来源。这是 SNAT 到 172.30.22.010 并发送到网络。网络认为它正在与 IP 172.30.22.010 上的主机通信。

C 部分区分外部流量和线对之间的流量。从外面看,每台主机看起来都有自己的 IP 地址。每个主机都可以与其邻居通信,而无需知道有多对主机具有相同的 IP 地址。所有这些都是通过一个 Linux 机器完成的,每个主机有一个以太网端口。

比特币交换机 此解决方案受 Linux 机器上可用端口数量的限制。解决方法是使用专为比特币挖掘设计的机器。它们比标准的 MoBo 具有更多的 pci-express 连接器。每个连接器可以带一个 4 路网卡。不难找到具有超过 15 个 pci-e 接口的主板。这使得具有 60 个或更多端口的单个 Linux 机器成为一个实用的解决方案。

基于比特币 MoBo 的单个 Linux 机器的吞吐量与专门构建的 Cisco 交换机/路由器不匹配,但它适用于实验室测试环境(我的应用程序)。就以下方面而言,它是一种低成本且高效的解决方案:

  • 能源消耗,
  • 空间,
  • 单盒解决方案,
  • $$ 成本。

这是一个比 Cisco 所能提供的更好的解决方案。