Цель состоит в том, чтобы гость находился в той же сети, что и хост (использовать тот же 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 я вижу все пакеты, которые пытаются перейти из гостевой в сеть и из сети в гостевую (я пытаюсь выполнить эхо-запрос / подключиться к внешнему серверу из гостя и / подключиться с этого внешнего сервера к гостю). Но соединения не проходят, гость не может общаться с остальной частью сети.
Похоже, проблема с мостом хоста. Что не так с мостом?
Хорошо, нужно разрешить пересылку в 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
Can также может добавить к нему virsh net-destroy br0
и virsh net-start br0
для повторного запуска KVM. часть.