Linux 如何确定桥接设备的默认 MAC 地址?

Linux 如何确定桥接设备的默认 MAC 地址?

Linux 如何确定桥接设备的默认 MAC 地址?我知道它与 中的“桥接 ID”相同brctl show,但它是如何计算的?当网络接口添加到桥接器时,MAC 地址是否应该自动更改?

答案1

过去的行为可能根据内核版本的不同而发生变化,但目前(此处:内核 5.17.x)看起来是:

  • 如果网桥没有手动指定 MAC 地址,则

    • 它最初获得一个带有私有位设置的自动生成的随机 MAC 地址(即:MAC 地址第一个字节中的第二位数字始终为 2、6、a 或 e)。
    • 直到第一次将接口设置为桥接端口时,当管理上 UP 时,它会获得一个 LOWER_UP 标志,并且其操作状态为 UNKNOWN,这使其具有 UP 般的好处(例如systl -w net.ipv4.conf.br0.ignore_routes_with_linkdown=1,路由正在运行并且没有该linkdown属性)。
    • 一旦至少一个接口被用作桥接端口:
      • 每次添加或删除桥接端口时,桥接接口都会动态继承其所有桥接端口的 MAC 地址中最低的 MAC 地址。
      • 如果它丢失了所有接口,其 MAC 地址将变为 00:00:00:00:00:00,直到重新添加端口
      • 如果它在管理上处于 UP 状态,并且至少有一个桥接端口的运行状态为 UP,则其运行状态为 UP(通常为:管理上处于 UP 状态且具有运营商,即:不具有 NO-CARRIER 属性)
      • 如果管理上处于 UP 状态但其所有端口的操作状态均为 DOWN(通常为:管理上处于 DOWN 状态或具有 NO-CARRIER 属性),则桥接接口将获得 NO-CARRIER 属性并且其操作状态为 DOWN(例如,使用ignore_routes_with_linkdown=1,路由将具有dead/linkdown属性)。
  • 如果桥的 MAC 地址是手动设置的(如果在创建时未设置,则使用与当前自动生成或继承的地址不同的值)

    • 添加或删除网桥端口时,网桥的 MAC 地址不会改变

    • 当管理上设置为 UP 时,如果尚未添加任何桥接端口,则操作状态不是 UNKNOWN:而是 DOWN。

    • 并遵循前面描述的关于其操作状态和端口操作状态的行为:当至少有一个桥接端口的操作状态为 UP 时,为 UP,否则为 DOWN。


我找不到任何文档来解释这些与在 Linux 上是否在网桥上设置 MAC 地址相关的不同行为的原因。这可能与如何评估网桥 ID 存在历史关系。

为了避免任何意外,只需设置 MAC 地址。

桥的示例名为br0

ip link set dev br0 address 12:34:56:78:9a:bc

或在创建时:

ip link add name br0 address 12:34:56:78:9a:bc up type bridge

我们仍然可以将其设置为一些预先存在的(物理)接口的 MAC 地址,以便于例如在请求 IP 地址时避免更改 DHCP 行为。br0无需使用 DUID。它应该在奴役接口之前设置,因为之后设置它实际上可能没有效果,如上所述(将桥接接口的 MAC 地址设置为其相同的当前值没有效果,并且不会切换到第二种行为)。

例如eth0在创建时复制 的 MAC 地址br0以保持 DHCP 行为一致(与eth0打算从属于br0DHCP 服务器端的一致),借助 JSON 输出和命令jq

ip link add name br0 address "$(ip -json link show dev eth0 | jq -r .[].address)" up type bridge

然后才奴役界面:

ip link set dev eth0 up master br0

我们只能希望现有的网络配置工具能够正确地做到这一点。


注意:就像Linux 上的ifconfig或一样,是一个过时的命令。它仍然使用较旧的内核 API。它已被plus取代,后者使用较新的routebrctlip linkbridge(返回)网络链接接口提供新功能(例如:),但输出可能不太易于理解。

命令示例:

ip -details link show type bridge
bridge -details link show

相关内容