为什么将接口添加到网桥会断开该接口(永久)?

为什么将接口添加到网桥会断开该接口(永久)?

我正在使用 vagrant-libvirt,并希望将我的虚拟机桥接到我的 LAN,以便它们获得 DHCP 租约并且可以从网络访问。由于 vagrant-libvirt 显然不会为您创建桥梁,因此我创建了一个:

brctl addbr br0

并向其中添加 enp10s0 :

brctl addif br0 enp10s0

并学到了一个Linux 网络中的重要一课:

注意:将接口添加到网桥将导致该接口丢失其现有 IP 地址。如果您通过要添加到网桥的接口进行远程连接,您将失去连接。可以通过编写在系统启动时创建的桥的脚本来解决此问题。

我可以理解它丢失了地址,因为内核可能正在重新初始化接口,但为什么它没有恢复? enp10s0 的网络上有一个 dhcp 服务器,所以我天真地期望它会回来(我习惯使用 Hyper-V 的虚拟交换机,您可以在其中创建和删除它们,而无需切断与主机的连接)。

是因为我在连接enp10s0之前没有为网桥分配IP地址吗?还是因为桥还没有架起来?或两者?

答案1

我不知道为什么bridge-utils 有这个已知的限制来困扰你。尽管有些人可能更喜欢熟悉的 brctl 工具,但至少在您的情况下,我建议尝试同一文档中记录的较新的 iproute2 工具拱门维基页面你链接到。在你的情况下:

ip link add name br0 type bridge
ip link set br0 up
ip link set enp10s0 up
ip link set enp10s0 master br0

我没有更深入的知识,但相信至少有一些 iproute2 工具使用比 Bridge-utils 等旧工具更新的内核接口。如果上述方法适用于 brctl 失败的情况,我怀疑这就是原因。

答案2

TLDR:将桥接接口视为以太网交换机。您的所有[虚拟]主机都连接到交换机,物理端口是另一台交换机的上行链路。尝试将计算机和上行链路电缆插入交换机上的同一端口是没有意义的,这就是为什么您不能继续为主机使用该物理端口。


当您向系统添加网桥时,您会更改物理端口的性质。通常情况下,物理端口的MAC地址和IP地址是一一对应的。这就是 ARP 协议所期望的 - 这样它就可以确定将数据包发送到哪个以太网地址以到达某个主机。这就是通常所说的主机接口。

当你添加一座桥时,你想要改变这一切。通常,您打算在该计算机上拥有多个主机(可能是虚拟机或容器),并且 ARP 需要为每台真实机或虚拟机提供单独的 MAC 地址。因此,您创建了一个网桥,它捕获物理端口。然后,当您添加虚拟机时,它们会将自己的 MAC 地址添加到该网桥,创建虚拟端口,然后以太网网络就可以工作了。该桥还处理内部虚拟端口/机器之间的以太网交换。

允许题外话……你可以理论上,也可以将多个 MAC 地址分配给单个主机端口,但如果您希望同一物理端口上的两台计算机能够相互通信,这会导致问题。所以很少这样做。同样,你可以将多个物理端口添加到网桥,然后您可以允许它在端口之间切换或将它们组合成链路聚合组 - 这些链路聚合组是多个链路(电缆)作为单个虚拟链路协同使用以获得容量或可靠性。

最后,您可以通过将主机添加到您创建的网桥来完成您想要做的事情。以下是来自服务器的 /etc/netplan/01-netcfg.yaml 文件的示例,该文件在服务器启动时为要连接的虚拟机以及主机本身设置桥接。

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp9s0: {}
  wifis: {}
  bridges:
    br0:
      dhcp4: true
      interfaces:
      - enp9s0

这将设置一个与 enp9s0 关联的网桥,并且还会向该网桥添加一个 MAC 地址,以便主机与 IPv4(和 IPv6 SLAAC)一起使用。实例化此 netplan 时,您应该看到类似以下内容:

user@server:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 70:cd:60:aa:1b:29 brd ff:ff:ff:ff:ff:ff
3: enp10s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 70:cd:60:aa:4e:cf brd ff:ff:ff:ff:ff:ff
4: wls5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 04:0c:ce:1d:61:07 brd ff:ff:ff:ff:ff:ff
    altname wlp13s0
16: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d6:34:90:36:5e:c2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.95/24 brd 192.168.1.255 scope global dynamic noprefixroute br0
       valid_lft 82942sec preferred_lft 82942sec
    inet6 1024:2048:4096:6530:f468:8db5:f14c:fa4d/64 scope global temporary dynamic 
       valid_lft 3439sec preferred_lft 3439sec
    inet6 1024:2048:4096:6530:d434:90ff:fe36:5ec2/64 scope global dynamic mngtmpaddr 
       valid_lft 3439sec preferred_lft 3439sec
    inet6 fe80::d434:90ff:fe36:5ec2/64 scope link 
       valid_lft forever preferred_lft forever
17: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:39:55:a0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe39:55a0/64 scope link 
       valid_lft forever preferred_lft forever

此输出显示物理网桥接口(接口 2,enp9s0)以及网桥本身(接口 16,br0)。在此设置中,主机具有地址为 192.168.1.95 的 IP 连接,并且 qemu-kvm 虚拟机通过(接口 17,vnet2)连接到网桥。 VM 的 MAC 地址以 55:a0 结尾,Linux 服务器不知道 VM 在该接口上租用了哪个 IP 地址,除非它执行 ARP 来了解它。在这种安排中,主机和虚拟机可以连接到 LAN 并相互连接。具有桥接接口的其他虚拟机看起来类似于接口 17、vnet2,并且通常 qemu-kvm 会在虚拟机启动时根据需要创建虚拟接口。

您还可以通过将其他未使用的以太网端口 (enp10s0) 或 wlan 端口 (wls5) 添加到网桥来获得更奇特的效果,但这显示了基础知识,并且实际上是我在主机上使用的。

相关内容