目标是让来宾与主机在同一网络上(使用与主机相同的 DHCP 服务器)。
我已经到了主机通过外部 DHCP 配置的地步,来宾配置了静态 IP,它们可以通信,主机可以与网络的其余部分通信,但来宾不能。
我正在遵循有关使用 NetworkManager 创建网桥并在 KVM 中使用它的指南(我还从主机中删除了所有 Wi-Fi 连接,并从 KVM 中删除了默认网桥):
$ nmcli con add ifname br0 type bridge con-name br0
$ nmcli con add type bridge-slave ifname enp59s0 master br0
$ nmcli con modify br0 bridge.stp no
$ nmcli con up br0
$ nmcli c
NAME UUID TYPE DEVICE
br0 39f90a3b-6090-4b4f-a9c4-76d6b980c8c4 bridge br0
bridge-slave-enp59s0 dd58e274-8cfa-4102-b524-fd16d96516b8 ethernet enp59s0
docker0 901ac863-2d2b-4351-9b81-fbc2096e398b bridge docker0
$ brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.54bf6428c24c no enp59s0
在ip a
br0 中获取 IP,enp59s0是从接口,因此它显示没有 IP。
/tmp/br0.xml:
<network>
<name>br0</name>
<forward mode="bridge"/>
<bridge name="br0" />
</network>
设置 KVM:
$ virsh net-define /tmp/br0.xml
$ virsh net-start br0
$ virsh net-autostart br0
$ virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
br0 active yes yes
访客/etc/netplan/01-netcfg.yaml:
network:
version: 2
renderer: networkd
ethernets:
ens3:
addresses: [192.168.5.100/24]
gateway4: 192.168.5.254
dhcp4: no
dhcp6: no
当虚拟机运行时有vnet0:
$ nmcli c
NAME UUID TYPE DEVICE
br0 39f90a3b-6090-4b4f-a9c4-76d6b980c8c4 bridge br0
bridge-slave-enp59s0 dd58e274-8cfa-4102-b524-fd16d96516b8 ethernet enp59s0
docker0 901ac863-2d2b-4351-9b81-fbc2096e398b bridge docker0
vnet0 1e6cdf02-8f57-4670-b6a7-b72e15151137 tun vnet0
$ brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.54bf6428c24c no enp59s0
vnet0
在br0上的主机上的 Wireshark 中,我看到所有尝试从访客到网络以及从网络到访客的数据包(我尝试从访客 ping/连接到外部服务器并从外部服务器 ping/连接到访客)。但是连接没有通过,来宾无法与网络的其余部分进行通信。
这看起来像一个主机桥问题。桥怎么了?
好的,需要允许在 iptables 中转发。脚本 /etc/NetworkManager/dispatcher.d/br0.sh:
也可以添加
virsh net-destroy br0
和virsh net-start br0
以重新初始化 KVM 部分。