桥接接口的 IPv6 SLAAC 配置

桥接接口的 IPv6 SLAAC 配置

我家里的双栈网络使用路由器通告进行 IPv6 配置,并带有来自 ISP 的(大部分是固定的)委派 /56 前缀。因此,我的所有机器都有一个可预测的全球 IPv6 地址,这些地址是通过路由器通告获得的,其中一些在前缀更改时会在 DNS 上发布。一切正常。

最近,我更改了一台机器的配置,并桥接了主 eth0 接口,以便我可以在此桥上启动 LXD 容器,并且它们的网络也将以相同的方式配置(也获得全局 IPv6 地址)。

通过此配置,不再配置 SLAAC 的是我的 eth0 接口,而是 br0 网桥。当容器启动时,添加到网桥的 veth 接口会更改其设置,并且用于 IPv6 地址分配的 MAC 地址并不总是我的 eth0 的 MAC 地址,因此主机的可预测全局 IPv6 有时会消失......

我可以强制容器接口的 MAC 地址(允许帽子容器使用可预测的公共 IPv6),但添加到网桥的那个是该对的另一侧,如果我理解的话,它的 MAC 地址是由内核随机生成的正确。我还考虑过强制 eth0 的 MAC 地址为“低编号”,因为桥接器似乎会选择“最低”MAC,但我不确定这是否会起作用,并且选择的 MAC 地址始终是低于内核生成的......

如何才能在那台计算机上保留一个全局 IPv6 地址?

请注意,机器运行的是 Alpine Linux,因此任何 systemd-networkd 解决方案都无济于事。

答案1

您可以手动强制桥接器的 MAC 地址,就像大多数其他类似虚拟以太网的接口一样。一旦手动设置,MAC 地址将不再更改:取决于设置为桥接端口的接口的动态更改将不再发生。

在底层,这可以在创建时完成:

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

或稍后:

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

较旧的内核可能需要先关闭接口才能更改其 MAC 地址。

我想如果您想保持兼容的设置,您可以重复使用物理接口的 MAC 地址,但在这种情况下您应该:

  • 去做环境以太网0作为桥接端口

    或者这不会被视为已手动设置 MAC 地址(并​​将保持动态模式),因为该命令实际上不会更改 MAC 地址,因为它与(动态)继承的地址相同。详细信息请参见我的 SU Q/A 回答:Linux 如何确定桥接设备的默认 MAC 地址?

    更新:正如OP发现的那样如果向上向下接受(取决于其确切变体)关键字bridge-hwbridge_hw用于此类用途的关键字,并且应该正确处理操作顺序以避免桥保持动态/继承模式。

    如果没有这样的专用选项,pre-up可能会使用,但pre-up如果该pre-up阶段中不存在此虚拟接口,则可能需要首先创建桥接的命令。必须验证顺序,以便在将物理接口设置为桥接端口之前在桥接器上设置 MAC 地址。|| true在此类条目的末尾添加一些pre-up以使效果幂等可能是一个好主意。

  • 强制禁用 IPv6以太网0界面 - 现在是桥港不再是一个独立的接口:

    systemctl -w net.ipv6.conf.eth0.disable_ipv6=1
    

    确保系统的任何部分都不会被混淆。

附加说明:在最近运行的系统上不会发生取决于接口 MAC 地址的动态行为系统因为系统每当检测到虚拟接口的创建(无论创建它的命令是什么)时,都会在所有虚拟接口上动态分配一个“随机稳定”MAC 地址,包括网桥,将网桥的行为切换为手动模式。详细信息在我的回答中有描述:如何让Linux为不同PC上的不同桥接设备生成不同的MAC地址?。如果 Alpine 运行 OpenRC,那么依赖于接口的默认动态行为仍然应该发生(因此需要通过手动分配覆盖,环境以太网0作为桥接端口(如果其自己的 MAC 地址被重用)。

相关内容