我刚刚将两台服务器从Debian 10 (Buster) 升级到Debian 11 (Bullseye)。之后,我再也无法通过网络联系到他们中的任何一个。经过一番调查,发现了以下问题:
两台机器都配置了桥接设备。显然,Debian 为桥接设备分配 MAC 地址的算法已经从 10 版本更改为 11 版本。升级后,第一台服务器上的桥接设备与第二台服务器上的桥接设备具有相同的 MAC 地址,这可以肯定以前不是这样。
那里的答案之一声称网桥是纯粹的内部设备,因此网桥的 MAC 地址无关紧要。然而,这显然是错误的。至少在我的情况下,来自两台机器的数据包都是以硬件源地址作为网桥的 MAC 地址发出的,并且两台机器上的网络端口只有在它们以网桥的 MAC 地址为目的地时才处理传入的数据包。
由于两台机器上的 MAC 地址相同,因此网络变得无法使用,这是完全合乎逻辑且可以理解的。
如何让 Debian 为不同机器上的网桥设备生成不同的 MAC 地址(甚至在同一台机器上,但这不是我的问题)?
在 Internet 中浏览时,我在systemd-udev上发现了这个与 Debian 11 桥相关的错误报告: systemd-udev 干扰了它不应该执行的接口的 MAC 地址 #21185:
如您所见,网桥是使用低级命令创建的,但它们始终继承相同的 MAC 地址值:
systemd
组件会干扰并设置 MAC 地址。可以使用以下方法看到这一点ip monitor link
:您可以看到最初随机的 MAC 地址是如何被覆盖为固定地址的,对于给定的网桥名称,它是相同值的两倍。
另一个副作用是,当接口设置为UP时,网桥运行状态最初变为 DOWN 而不是 UNKNOWN (请参阅我在 SU 和 SF 上的这些答案,提到有关 DOWN 和 UNKNOWN 的行为:Linux 如何确定默认 MAC网桥设备的地址?,强制mac地址时linux ipv6网桥地址不起作用)。无论如何,一旦连接了它的第一个桥接端口,这不再重要了。
在不干扰的网络命名空间内(例如:在两次运行上述命令之前)进行
ip add netns experiment
相同的实验将显示每次具有不同随机地址的通常行为。ip netns exec experiment bash -l
systemd-udevd
这是systemd生态系统的影响,不会发生在未运行 systemd 的系统(或旧版本的 systemd)上。一种建议的解决方法是使用:
但似乎真正的解决方法是更改参与生成此“稳定随机”值的文件,如下所述:https ://wiki.debian.org/MachineId
每台机器都应该有不同的值。这对于从基本模板克隆的 VM 尤其重要。在实施了(相当破坏性的)更改的补丁中
machine-id
提到了桥“稳定”MAC地址之间的关系和生成方式:也有人提到这会产生影响,但对此不以为然。
这不仅限于bridge类型的接口,而是任何会生成随机 MAC地址的接口:例如 types
veth
,macvlan
tuntap
也会受到影响。在执行 Debian 链接中描述的操作后,我可以验证相同的网桥名称是否会获得不同的“稳定随机”值:
现在在以前
ip monitor
为相同的网桥名称提供一个新的 MAC 地址: 32:ee:c8:92:9f:e8 在删除和重新创建时而不是 1a:d0:fc:63:c1:71brtest0
。结论:
由于现在手动设置了网桥 MAC 地址,因此网桥将不再继承设置为网桥端口的其他接口的 MAC 地址之一,包括通常的永久(物理或虚拟机)接口,这些接口预计每个接口都有不同的 MAC 地址。两个系统使用相同
machine-id
且相同的网桥名称(例如:)br0
,并且此类网桥参与路由(即:网桥上配置了 IP 地址,但即使没有,网桥也可以根据其设置发出与桥接相关的其他帧)在同一个 LAN 上将发出具有相同源 MAC 地址(网桥)的帧,可能会破坏路径中的交换机,并且无论如何都会忽略来自对等方的相同源 MAC 地址。bridge_hw
您可以使用指令告诉 Debian 克隆 MAC 地址。例如我的
/etc/network/interfaces
文件:现在两者都
enp2s0
具有br0
相同的地址。首先,AB的答案显示了正确的解决方案。如果您遇到同样的问题,请按照 AB 的答案以正确的方式解决它。
但是,为了完整起见,我想展示一个替代(低得多的)解决方案。我压力很大,没想到这么快就得到了正确的答案。因此,我通过稍微改变暂时自己解决了这个问题
/etc/network/interfaces
:最后一行是重点。它使操作系统将指示的 MAC 地址分配给网桥。显示的 MAC 地址是来自半官方私有 MAC 地址范围的地址。我已验证,当您将设备移除或添加到网桥时,此 MAC 地址保持不变。
当然,你必须给每个网桥一个不同的 MAC 地址,不管网桥是否在同一台机器上。
同样,上述方法只解决了桥MAC地址问题。我相信如果在不同的机器上有相同的机器 ID,更多的可能会出错。AB 的回答提到了如何创建新的机器 ID,并且快速测试表明,以这种方式创建的每个机器 ID 都不同于以这种方式创建的所有其他机器 ID。