运行 Rocky 9.3,尝试获取用于虚拟机的公共 IP 范围的桥接器。
同样的硬件用于运行 Centos 7.8 机器,一切正常,现在我尝试用 Rocky 9.3 进行同样的设置
# /etc/sysconfig/network-scripts/ifcfg-brpub0 (pointopoint, Hetzner Standard)
DEVICE=brpub0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=xxx.yyy.89.1
NETMASK=255.255.255.240
STP=off
DELAY=0
给出
3: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 6a:1f:e1:44:ec:b8 brd ff:ff:ff:ff:ff:ff
inet xxx.yyy.89.1/28 brd xxx.yyy.89.15 scope global noprefixroute br0
valid_lft forever preferred_lft forever
我按照以前的方式安装了 vagrant 和 Virtualbox,虽然我可以 ping 通网桥,但xxx.yyy.89.1
我无法 ping 通分配给虚拟机的公共 IP 地址。
作为参考,在另一台仍使用 centos 7 的机器上,等效于
3: brpub0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 5e:ce:35:cf:d2:90 brd ff:ff:ff:ff:ff:ff
inet aa.bb.207.145/28 brd aa.bb.207.159 scope global brpub0
valid_lft forever preferred_lft forever
inet6 fe80::5**e:35**:f**f:d290/64 scope link
valid_lft forever preferred_lft forever
为什么我的桥关闭了?无论我执行什么操作nmcli
以及链接/设备命令,它都处于关闭状态。我该如何启动它?
- - 编辑 - -
根据@larsks的要求,ip link show master brpub0
在工作机器上 - 没有输出
[root@prod-vmhost-114 ~]# ip link show master brpub0
[root@prod-vmhost-114 ~]#
答案1
CentOS 7 和 Rocky Linux 9 之间发生了什么?一个较新的systemd版本。
与老年人systemd,systemd没有窥视桥梁,它们在创建时是独立的。随着新版本的systemd,systemd监控虚拟接口的创建,并在检测到创建后立即为其分配一个“稳定的随机”MAC 地址,而不是保留默认设置的(完全)随机 MAC 地址。这会产生一个副作用,即立即设置网桥的运行状态(又称操作状态) 到DOWN
,因为这已经改变了它的默认操作模式并且它没有桥接端口(目前)。
因此,如果您在 CentOS 7 上创建两次桥接,则可以预期它的 MAC 地址会发生变化,类似于:
# ip link add name testbr0 up type bridge
# ip link show dev testbr0
3: testbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether de:6b:22:95:cf:76 brd ff:ff:ff:ff:ff:ff
# ip link del dev testbr0
# ip link add name testbr0 up type bridge
# ip link show testbr0
4: testbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 02:75:85:6b:a8:d4 brd ff:ff:ff:ff:ff:ff
在此示例中:第一次 de:6b:22:95:cf:76 第二次 02:75:85:6b:a8:d4
注意上面的例子如何展示桥梁操作状态是UNKNOWN
。
现在,如果在网桥上设置了 MAC 地址:
# ip link set dev testbr0 address b6:00:00:00:00:01
# ip link show dev testbr0
3: testbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether b6:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff
这会将网桥的模式从“未分配 MAC 地址”更改为“已分配 MAC 地址”。
注意桥梁操作状态当从UNKNOWN
到DOWN
。
现在,在任何运行较新版本的 Linux 系统中systemd,包括 Rocky Linux 9,这个任务是系统地完成的(这可以通过留下运行来验证ip monitor link
)。
# ip link add name testbr0 up type bridge
# ip link show dev testbr0
21: testbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 92:45:24:9e:58:8e brd ff:ff:ff:ff:ff:ff
# ip link del dev testbr0
# ip link add name testbr0 up type bridge
# ip link show testbr0
22: testbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 92:45:24:9e:58:8e brd ff:ff:ff:ff:ff:ff
请注意,本应随机的 MAC 地址是两倍相同的:systemd,无论使用哪种网络管理器,一旦检测到它是在未分配地址的情况下创建的,就会为其分配两次相同的 MAC 地址。
如上所述,这使得操作状态 DOWN
而不是UNKNOWN
。而操作状态是UNKNOWN
,它暂时被视为UP
,直到第一个桥接端口被分配给它。然后行为将变得相同。
由于桥梁操作状态 DOWN
,它不会设置链路本地 IPv6 地址,如本问答中所示:强制使用 mac 地址时,linux ipv6 桥接地址不起作用就像我们在OP的例子中看到的那样。
对于 IPv6 来说,可能会出现问题;对于 IPv4,我不确定是否存在明显的问题,除非出现如下接口标志ignore_routes_with_linkdown
已在此接口上启用。
如果希望桥梁始终处于操作状态 UP
,为了获得一致的行为,请添加一个桥接端口UP
。如果您不想使用任何端口,仍可添加一个虚拟端口。继续上面的例子:
# ip link add name testbr0p0 up master testbr0 type dummy
# ip link show testbr0
22: testbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 92:45:24:9e:58:8e brd ff:ff:ff:ff:ff:ff
桥接接口的操作状态现已 UP。
有关更多信息systemd的行为变化以及明确分配或未分配 MAC 地址时网桥的行为变化可以在这些 UL SE、SF 和 SU Q/A 中看到,我在其中做出了回答:
答案2
在发表评论后,我意识到您正在使用 VirtualBox,而我正在使用虚拟器. 这两个工具以根本不同的方式处理网络桥接。
Libvirt 和 Linux 桥接设备
Libvirt 使用 Linux 桥接设备进行操作。当您创建“网络”时,libvirt 会创建一个 Linux 桥接设备。开箱即用,您通常会有一个名为“default”的网络与名为 的桥接设备相关联virbr0
。如果没有连接到桥接器的接口,它看起来如下所示:
$ ip link show virbr0
6: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether e6:ff:5f:32:ed:d7 brd ff:ff:ff:ff:ff:ff
启动虚拟机后,我们会看到连接到网桥的新接口:
$ ip link show master virbr0
7: veth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr0 state UP mode DEFAULT group default qlen 1000
link/ether 2e:b6:db:05:a0:e1 brd ff:ff:ff:ff:ff:ff
桥接接口现在已完全启动:
$ ip link show virbr0
6: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether e6:ff:5f:32:ed:d7 brd ff:ff:ff:ff:ff:ff
VirtualBox 和桥接适配器
以上所有内容都是完全学术性的,因为 VirtualBox“桥接适配器”具有与 Linux 桥接设备无关。当您将 VirtualBox 接口连接到“桥接适配器”时,VirtualBox 会创建自己的桥接设备模拟,以将虚拟接口连接到选定的托管接口。
换句话说,如果你有eth2
一个公共网络上的接口,并且想要将 VirtualBox 机器连接到该网络,你不要创建一个 Linux 桥接设备,添加eth2
到桥接器,然后将您的虚拟机连接到桥接器。
相反,您选择它eth2
作为 VirtualBox 中桥接适配器的目标。
等效的 Vagrant 配置看起来像这样:
Vagrant.configure("2") do |config|
config.vm.box = "generic/rocky9"
config.vm.network "public_network", bridge: "eth2"
end
如果我们在运行时观察内核日志vagrant up
,我们会看到类似这样的内容:
Feb 07 09:36:28 fizzgig kernel: vboxdrv: 00000000a064d924 VBoxDDR0.r0
Feb 07 09:36:28 fizzgig kernel: VBoxNetFlt: attached to 'eth2' / 60:7d:09:44:3e:a9
Feb 07 09:36:28 fizzgig kernel: r8152 2-1:1.0 eth2: entered promiscuous mode
Feb 07 09:36:28 fizzgig kernel: r8152 2-1:1.0 eth2: Promiscuous mode enabled
此时,虚拟机应该可以访问公共网络了。