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
打算从属于br0
DHCP 服务器端的一致),借助 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取代,后者使用较新的route
brctl
ip link
bridge
(返回)网络链接接口提供新功能(例如:簪),但输出可能不太易于理解。
命令示例:
ip -details link show type bridge
bridge -details link show