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

jur*_*rez 5 linux bridge

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

A.B*_*A.B 8

根据内核版本,过去的行为可能会发生变化,但目前(此处:内核 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 且从未添加过任何桥接端口时,operstate 并不是 UNKNOWN:它处于 DOWN 状态。

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


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

为避免出现任何意外,只需设置 MAC 地址即可。

名为 的桥的示例br0

ip link set dev br0 address 12:34:56:78:9a:bc
Run Code Online (Sandbox Code Playgroud)

或在创建时:

ip link add name br0 address 12:34:56:78:9a:bc up type bridge
Run Code Online (Sandbox Code Playgroud)

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

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

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

然后才奴役接口:

ip link set dev eth0 up master br0
Run Code Online (Sandbox Code Playgroud)

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


注意:就像Linux 上的ifconfig或一样,是一个过时的命令。它仍然使用旧的内核 API。它已被plus取代,plus使用更新的(rt) netlink API提供新功能(例如:hairpin),但可以说可能具有不太人类可读的输出。routebrctlip linkbridge

命令示例:

ip -details link show type bridge
bridge -details link show
Run Code Online (Sandbox Code Playgroud)

  • 如果您给出了布局(`ip link show typebridge; ip link show typebridge_slave`,如果只有一个桥,则可以添加`-brief`选项)我想可以解释一下。 (3认同)