我重新安装了一台计算机,由于我需要几台类似的计算机,所以我用 dd 复制了硬盘。在目标系统上,我进行了/etc/hosts
相应的/etc/hostname
调整/etc/network/interfaces.d/*
。
因此我得到了具有不同主机名和不同 IP 地址的不同机器。
但是虽然硬件接口也有不同的 MAC 地址,但桥接接口在所有目标系统上都有相同的 MAC 地址。显然它是被复制过来的。
这座桥的“经典”定义是/etc/network/interfaces.d/bridge
:
iface br0 inet static
bridge_ports enp0s31f6
address 192.168.1.20
broadcast 192.168.1.255
network 192.168.1.0
netmask 255.255.255.0
gateway 192.168.1.1
(不用说,我在每台机器上单独设置了地址。)
作为试验,我更改了文件,删除了桥接接口,将 IP 地址直接分配给以太网接口,重新启动(有效:桥接消失并且硬件接口具有正确的 IP 地址)并重新编辑桥接。
从此,这座桥又恢复了原来的地址……
多谢您的支持!
答案1
总体行为是由systemd, 即使systemd未配置为管理系统的网络。
Linux 上的桥接接口有两种 MAC 地址“模式”:
隐含模式
当创建桥接接口而不指定其 MAC 地址时,它会获得一个临时的随机 MAC 地址(设置了私有位)。当将另一个接口设置为桥接端口时,桥接将继承此接口的 MAC 地址以替换临时 MAC 地址。我没有定义添加第二个接口时会发生什么,因为行为可能会根据内核版本而改变。此模式在具有最新内核的系统上不再存在systemd跑步。
显式模式
当创建桥(
ip link add ...
)或改变它(ip link set dev ...
)时,可以指定address xx:xx:xx:xx:xx:xx
,改变桥的行为:它不会继承任何东西,它的初始操作状态将是向下在管理上设置时(因为它还没有连接),而不是未知以及一些类似的事情。例如,间接影响是,此类网桥不会创建链接本地 IPv6 地址,因为它处于关闭状态,直到它使用添加的网桥端口本身实现实际连接。
systemd
最新版本systemd 选择始终明确分配 MAC 地址未指定地址而创建的虚拟接口(systemd跟踪此情况。可以通过运行跟踪它所做的事情ip monitor link
,并看到未声明 MAC 地址而创建的接口的 MAC 地址立即被更改(通过systemd))。systemd不关心(至少默认情况下)是否应该管理接口。
这会影响网桥。因为选择 MAC 地址的算法取决于系统的机器编号UUID(和接口名称),如果系统克隆操作不会改变机器编号,两个系统将在其具有相同名称的虚拟接口上保留相同的 MAC 地址,例如br0
。这两个系统将无法再通过其 LAN 正常通信,因为以太网 LAN 上不能有相同的 MAC 地址(这可能会导致路径中的某些交换机发出抱怨并记录抖动错误)。
这systemd行为在主机初始网络命名空间中可见,但在其他网络命名空间中不可见(除非它们具有systemd也像在 LXC 管理的系统容器中一样在其上运行),因为systemd不会跟踪其他网络命名空间。
解决方案
作为systemd看起来它不会很快消失,最好的办法就是遵守它的做法:拥有独特的机器编号在每个克隆系统上进行配置。例如,解释了更改每个克隆的设置的方法(并且不特定于 Debian,而是使用systemd或其子组件之一):
机器 ID 和克隆系统,生成新的机器 ID
克隆机器时,经常会忘记更改机器 ID。可以通过以下方式生成新的机器 ID:
rm -f /etc/machine-id /var/lib/dbus/machine-id dbus-uuidgen --ensure=/etc/machine-id dbus-uuidgen --ensure
创建
/etc/machine-id
一个 0 字节文件被认为是清除它的规范方法,而不是实际删除它,因为如果 systemd 在完全只读的根文件系统上运行,它有代码在 tmpfs 上创建一个机器 ID 并将其绑定挂载在空文件的顶部。
因此,要么执行上面的 3 个命令,要么找到一种自动化的方法(例如:使用ansible可以与默认存在的部署 ID 进行比较),或者直接删除文件并创建一个空的/etc/machine-id
希望systemd将会进行一些随机化(如果不是 R/O,不知道后面的方法如何表现)。
当然,手动分配 MAC 地址不会被以下情况覆盖:systemd。因此,只要每个系统上的值不同,就可以在创建接口时设置地址。安装了ifupdown
软件包和bridge-utils
(因为它为提供了附加功能ifupdown
,而不是过时的brctl
命令),您可以使用该函数bridge_hw
在桥节中。
您可以复制真实接口的 MAC:
bridge_hw enp0s31f6
因此,例如没有 DUID 的 DHCP 的行为与没有桥接配置的行为相同,并且作为额外的好处,将唯一的 MAC 地址的选择推迟到硬件(即:NIC 制造商或虚拟系统的虚拟机管理程序)。
或者您可以在每个系统上选择不同的 MAC 地址:
bridge_hw 12:34:56:78:9a:bc
有关此“功能”的更多详细信息和可重现的示例systemd以及它如何影响桥梁和其他虚拟接口,请参阅这个 UL SE Q/A,我在其中做出了回答: