有没有办法用具有相同 MAC 地址的设备构建功能(子)网络?

网络工程 路由 转变 VLAN UDP 苹果电脑
2021-08-01 00:36:51

我有一系列运行 Linux 风格的模块(类似于 RPi),每个模块都有一个以太网 NIC。我有其中的 4 个,我想将它们连接到交换机,以便能够从连接到同一交换机的主机向每个单独发送 UDP 数据包。每个人在 192.168.1.0 子网中都有自己的 IP 地址。让它工作似乎很简单,问题是它们都具有相同的 MAC 地址(主机除外)。这当然会在向模块发送数据包时导致交换机出现问题。发送到主机的数据包可以正常接收。

我无法更改他们的 MAC 地址,只能更改 IP 地址,尽管鉴于交换机基于 MAC 条目工作,这不会有太大帮助。

通过这种设置,确保 UDP 数据包每次都真正到达模块的唯一方法是在整个子网中广播它们。这种方法的问题在于他们不能很好地处理不断被最初不适合他们的数据包淹没的事实。处理数据包所花费的时间会导致系统超时,从而使该解决方案不可行。

另一种解决方案是将每个 VLAN 隔离在一个 VLAN 中,以便分隔广播域并相应地配置路由路径。这样做的问题是我没有可以用来执行此操作的备用设备,即使我有,我的网络知识在 VLAN 方面也是有限的。

在这一点上,我需要关于这个问题的建议......也许我还没有想过一个场景,我可以用尽可能少的额外硬件来让它工作?

先感谢您!

3个回答

将每个设备放在不同的 VLAN 中:

device 1: vlan 11,
device 2: vlan 12,
...

为每个设备放置不同的 IP 网络:

device 1: 192.168.1.11/24
device 2: 192.168.2.11/24
...

然后将您的主机与所有 vlan 放在一个主干中。在您的 PC 上为每个 vlan 设置一个接口即可解决问题:

int eth0.11: ip address 192.168.1.1/24
int eth0.12: ip address 192.168.2.1/24
...

注意:我使用了 /24 网络,但您完全可以使用 /31(或 IPv6 中的 /127)。

如果您的交换机可以路由,则使用它进行路由,或者您也可以插入路由器。

可能有一种方法可以将接口配置为点对点接口,但我从未这样做过(而且会更尴尬)。

您的问题的核心(正如Ron Maupin 在他的评论中指出的那样)是,由于向每个模块广播所有内容对您不起作用,您需要更改模块 MAC 地址或将模块放在单独的以太网网络上。这是我的建议。

  1. 仔细检查以确保您确实无法更改模块Mac地址。如果它们类似于 Raspberry Pi,是否意味着它们运行的​​是 Linux?如果是这样,大多数Linux以太网驱动程序提供的能力改变MAC地址通过命令如ifconfig eth0 hw ether 02:01:02:03:04:08如果你能进入命令行,你可以试试这个。如果您不想在每次模块重新启动时手动执行此操作,您还需要弄清楚是否可以以某种方式使其永久化;上面的链接提供了一些关于此的建议。

    如果这不起作用,您将不得不使用单独的第 2 层网络,下面的下一个建议以一种或另一种方式进行。

  2. 将每个模块连接到主机上的单独以太网接口。这可以通过一个多端口 PCI 以太网卡(不是特别便宜)、几个单端口 PCI 以太网卡以及您的主机上的任何东西来完成,或者,如果您的应用程序(相对)低带宽,多个 USB 以太网接口。根据 VLAN 解决方案,每个都将是一个单独的以太网和一个单独的 IP 网络。

  3. 按照Xavier Nicollet 的回答中所述使用 VLAN 这并不像乍看起来那样昂贵。五端口 VLAN 交换机,例如NetGear GS105Ev2(也是第二来源的TL-SG105E),价格远低于 50 美元。

上面的一些建议假设您在(非模块)主机上运行 Linux;如果你不是,你可以通过在主主机和模块之间放置一个 Linux 主机来解决这个问题,如果不是特别方便的话。(如果你想避免额外的硬件,你可以使用虚拟机)。下次,指定您正在使用的确切设备和软件将大有帮助。

除了已经存在的以网络为中心的答案之外,您还应该能够使用以下方法更改 Linux 中的 MAC 地址ifconfig

# ifconfig eth0 down
# ifconfig eth0 hw ether 02:80:48:BA:d1:30
# ifconfig eth0 up
# ifconfig eth0 |grep HWaddr

http://www.aboutlinux.info/2005/09/how-to-change-mac-address-of-your.html

这需要包含在启动过程中,它不会在重新启动后继续存在。

为避免任何可能的重复,您应该使用本地管理的 MAC (LAA),其中第一个八位字节的位 1 设置为 1,即第一个八位字节需要被二整除,但不能被四整除(x2、x6、xa、xe)。

处理该问题的另一种方法是始终使用 L2 广播 - 这是一个丑陋的黑客,因此应该在这些设备的单独网段上完成。

在源(或连接这些设备的路由器)上,为每个设备设置一个静态 ARP 条目,并将其 IP 地址映射到ff:ff:ff:ff:ff:ff- 这样,交换机就像集线器一样使用,每个数据包都会发送到每个设备。每个数据包都会被每个设备接收,但除非目标 IP 匹配,否则它会再次被丢弃。在设备上,必须禁用路由以避免它们尝试转发非本地数据包。