KVM Bridge на Ubuntu 20.04 на Raspberry Pi 4

Я не могу заставить сеть внутри гостевой виртуальной машины работать с KVM на Raspberry Pi 4 8GB под управлением официального образа Ubuntu 20.04. Насколько я могу судить, сеть настроена правильно. И я очень надеюсь, что кто-нибудь скажет мне, что я сделал что-то не так, и сможет указать мне на лучшую документацию. Я просмотрел документацию netplan, дюжину различных руководств по настройке KVM, и даже просмотрел некоторые документы по QEMU, связанные с настройкой CPU, потому что я обнаружил, что QEMU не так хорошо создан для aarch64, как для x86_64.

Я установил KVM тем же способом, который я нашел в дюжине руководств:

$ sudo apt install qemu qemu-kvm libvirt-clients libvirt-daemon-system virtinst bridge-utils
$ sudo systemctl enable libvirtd
$ sudo systemctl start libvirtd

Вот мой netplan:

$ cat /etc/netplan/01-netcfg.yaml 
network:
    ethernets:
        eth0:
            dhcp4: false
            dhcp6: false
            optional: true
            nameservers:
                addresses: [1.1.1.1, 1.0.0.1]
    wifis:
        wlan0:
            dhcp4: true
            dhcp6: false
            optional: true
            access-points:
                "censored":
                    password: "censored"
    bridges:
        br0:
            interfaces: [eth0]
            nameservers:
                addresses: [1.1.1.1, 1.0.0.1]
            parameters:
                stp: true
                forward-delay: 4
            dhcp4: true
            dhcp6: false
    version: 2
    renderer: networkd

И затем я определил его для домена KVM:

$ sudo mkdir -p /opt/kvm
$ sudo nano /opt/kvm/host-bridge.xml

<network>
    <name>host-bridge</name>
    <forward mode="bridge"/>
    <bridge name="br0"/>
</network>

$ virsh net-define /opt/kvm/host-bridge.xml
$ virsh net-start host-bridge
$ virsh net-autostart host-bridge

Затем я проверил, что он действительно присутствует и настроен должным образом:

$ virsh net-list --all
 Name          State      Autostart   Persistent
--------------------------------------------------
 default       inactive   no          yes
 host-bridge   active     yes         yes

После запуска создания VM я проверил, что ее vnet0 добавляется в мост должным образом:

$ sudo virt-install --name Test-VM --ram=2048 --vcpus=2 --cpu max --hvm --disk path=/opt/vhd/test-vhd,size=16 --cdrom /opt/iso/ubuntu-20.04.1-live-server-arm64.iso --network bridge=br0 --graphics vnc
$ virsh domiflist Test-VM
 Interface   Type     Source   Model    MAC
-----------------------------------------------------------
 vnet0       bridge   br0      virtio   52:54:00:64:58:9e
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.dca632b43f5b       yes             eth0
                                                        vnet0
docker0         8000.0242aa58079a       no
docker1         8000.024296884d89       no              veth239b4dd
                                                        veth76e81fc
                                                        vethdffe7c7
                                                        vethef20e5a

Однако, после всего этого, сеть внутри моего гостя, похоже, не работает. Она просто крутится и крутится, пытаясь получить IP-адрес, но так и не получает его. Может быть, я что-то упустил?

Я также проверил, действительно ли виртуальная машина использует мостовой интерфейс, и похоже, что да:

$ virsh edit Test-VM
...
    <interface type='bridge'>
      <mac address='52:54:00:64:58:9e'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
...

Вот экран просто вращающегося гостевого компьютера. Как вы можете видеть, у меня есть полные сетевые возможности через интерфейс моста на хосте для подключения к KVM через VNC. Screenshot

0
задан 9 December 2020 в 13:17

1 ответ

Ладно, единственное, что я не замечал, это мой брандмауэр. Брандмауэр не позволял моим гостям общаться через мост. Я не совсем понимаю проблему, но, по крайней мере, имею представление о том, что происходит, благодаря этому отчету об ошибке: https://bugs.launchpad.net/ubuntu/+source/ufw/+bug/ 573461

Итак, чтобы решить проблему, я сделал следующее:

$ sudo nano /etc/default/ufw

А затем изменил это

IPT_MODULES=""

на это

IPT_MODULES="bridge"

Затем я перешел к этому файлу:

$ sudo nano /etc/ufw/sysctl.conf

И добавил это в конец:

# Don't filter packets to our libvirt guests
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

]Затем перезагрузите брандмауэр:

$ sudo ufw reload

Теперь мои гости могут полностью получить доступ к моей сети, как если бы они были физическими машинами, в то время как моя хост-машина остается должным образом защищенной брандмауэром.

Если у кого-то есть «для чайников» объяснение того, что именно я здесь делаю, пожалуйста, поделитесь им. Лучшее, что я могу понять, это то, что это говорит UFW, даже если он загружается до конфигурации сети, ожидать наличия мостов и не фильтровать их.Или, по крайней мере, это то, что я думаю, что это делает.

0
ответ дан 28 December 2020 в 10:30

Другие вопросы по тегам:

Похожие вопросы: