需求
本方案旨在解决连接成对主机的问题。这对主机的每个 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 转换为服务器的实际地址。

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 所能提供的更好的解决方案。