目标是让客户机与主机位于同一网络上(使用与主机相同的 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
在主机上的 Wireshark 中br0我看到了所有试图从客户机到网络和从网络到客户的数据包(我尝试从客户机 ping/连接到外部服务器,并从该外部服务器 ping/连接到客户机)。但连接没有接通,客户机无法与网络的其余部分通信。
这看起来像是主机桥的问题。桥出了什么问题?
答案1
好的,需要在 iptables 中允许转发。脚本 /etc/NetworkManager/dispatcher.d/br0.sh:
#!/bin/bash
if [ "$1" == br0 ]; then
case "$2" in
up)
/sbin/iptables -A FORWARD -i br0 -j ACCEPT
;;
down)
/sbin/iptables -D FORWARD -i br0 -j ACCEPT
;;
esac
fi
还可以添加virsh net-destroy br0
并virsh net-start br0
重新启动 KVM 部分。