Debian:桥接接口将其 MAC 地址存储在哪里以及如何更改它?

Debian:桥接接口将其 MAC 地址存储在哪里以及如何更改它?

我重新安装了一台计算机,由于我需要几台类似的计算机,所以我用 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,我在其中做出了回答:

如何让 Linux 为不同 PC 上的不同桥接设备生成不同的 MAC 地址?

相关内容