EDIT: WIP: Der Hauptgrund für die unten erläuterten Fehler liegt darin, dass ich die Host-TAP-Schnittstellen nicht zum richtigen Zeitpunkt aufgerufen habe. Wenn ich QEMU die Erstellung der Tap-Geräte überlasse, funktioniert alles wie erwartet. Ich werde den Fehler genauer untersuchen und eine klarere Erklärung des Problems liefern, wenn ich sie habe. Danke @anx für die Tipps!
Ziel: Führen Sie dnsmasq
innerhalb eines Hosts eine QEMU-VM aus, die Netboots von einer anderen, auf dem Host laufenden QEMU-VM bedient.
Ich möchte, dass sich die dnsmasq-VM wie ein Gateway verhält, mit einer Netzwerkkarte als Upstream-WAN-Schnittstelle, mit einem Upstream-DHCP-Server und der anderen Schnittstelle als privater LAN-Schnittstelle, an die andere VMs „angeschlossen“ werden und die einen Netboot vom dnsmasq ausführen, der auf dieser privaten LAN-Schnittstelle lauscht.
Damit die VMs miteinander kommunizieren können, erstelle ich zunächst meine eigene Brücke auf dem Host.
ip link add name vivianbr0 type bridge
ip link set vivianbr0 up
Damit die VMs über die Host-Bridge miteinander kommunizieren können, benötige ich zwei Tap-Geräte, eines für die private LAN-Schnittstelle der Gateway-VM und ein weiteres für die einzelne Netzwerkschnittstelle der privaten VM.
ip tuntap add mode tap tap0 user cturner
ip tuntap add mode tap tap1 user cturner
ip link set tap0 up
ip link set tap1 up
ip link set tap0 master vivianbr0
ip link set tap1 master vivianbr0
Für die Gateway-VM verwende ich zu Testzwecken ein Arch Linux ISO. Die VM wird mit zwei Netzwerkkarten gebootet.
qemu-system-x86_64 \
-drive file=arch-disk.qcow2,if=none,id=nvm \
-device nvme,serial=deadbeef,drive=nvm \
-cdrom archlinux-2021.09.01-x86_64.iso \
-boot d \
-device virtio-net-pci,romfile=,netdev=net0,mac="DE:AD:BE:EF:00:11" \
-device virtio-net-pci,romfile=,netdev=net1,mac="DE:AD:BE:EF:00:12" \
`# Simulate the plugged in "upstream" cable with user-mode networking` \
-netdev user,id=net0,hostfwd=tcp::60022-:22,hostfwd=tcp::8080-:80,hostfwd=tcp::8081-:8000,hostfwd=tcp::2375-:2375 \
`# And now the unplugged one with, with TAP networks` \
-netdev tap,id=net1,ifname=tap0,script=no,downscript=no \
-net bridge,br=vivianbr0 \
-m 4G \
-enable-kvm
Sobald diese Maschine gebootet ist, sehe ich Folgendes in der Bridge-Konfiguration,
brctl show vivianbr0
bridge name bridge id STP enabled interfaces
vivianbr0 8000.46954a1ad851 no tap0
tap1
tap2
Ich nehme an, tap2
es wurde von QEMU erstellt ...
Innerhalb dieser VM gibt es zwei ifaces. ens4
mit MAC DE:AD:BE:EF:00:11 und ens5
mit MAC DE:AD:BE:EF:00:12. Innerhalb dieser VM starte ich dnsmasq
,
ip addr add 10.42.0.1/24 dev ens5
dnsmasq -d --dhcp-range=10.42.0.10,10.42.0.100 --dhcp-script=/bin/echo --enable-tftp=ens5 --interface=ens5
Dies startet ohne Fehler.
Jetzt versuche ich, eine andere VM per Netboot zu starten, die auf dem Host wie folgt gestartet wurde:
qemu-system-x86_64 \
-machine pc-q35-6.0,accel=kvm \
-m 1024 -smp 2,sockets=2,cores=1,threads=1 \
-netdev tap,id=net0,ifname=tap1,script=no,downscript=no \
-device virtio-net-pci,netdev=net0,bootindex=1,mac=DE:AD:BE:EF:00:13 \
-net bridge,br=vivianbr0 \
-enable-kvm \
-vga virtio
Aber es bootet nicht. Ich überwache die vivianbr0
Nutzung tcpdump
und kann die DHCP-Anfragen sehen, aber es gibt keine Antworten, nichts erreicht den dnsmasq, der in der ersten VM läuft,
tcpdump -i vivianbr0 -nN
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on vivianbr0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
12:21:39.585229 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:21:40.587741 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:21:40.700038 IP6 fe80::6ce2:2aff:fe94:ba48.5353 > ff02::fb.5353: 0 [7q] PTR (QM)? _nfs._tcp.local. PTR (QM)? _ftp._tcp.local. PTR (QM)? _webdav._tcp.local. PTR (QM)? _webdavs._tcp.local. PTR (QM)? _sftp-ssh._tcp.local. PTR (QM)? _smb._tcp.local. PTR (QM)? _afpovertcp._tcp.local. (118)
12:21:42.619968 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:21:46.684448 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:13, length 397
12:22:30.609555 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:12, length 289
12:23:33.796148 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:12, length 289
12:24:38.673364 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from de:ad:be:ef:00:12, length 289
Seltsamerweise sehe ich BOOTP-Anfragen von de:ad:be:ef:00:13
(der MAC-Adresse der Netboot-VMs)und von de:ad:be:ef:00:12
(die private Netzwerkkarte der Gateway-VM), was darauf hinweist, dass eine Konfiguration schwerwiegend ist.
Wie kann ich das zum Laufen bringen?
Antwort1
Ihre Schritte für zwei Gäste sind in Ordnung, ich habe gerade Ihr Setup repliziertbis zum Zeitpunkt des Adressen-Leasings. Ich könnte IPs von einer VM, auf der DNSMASQ läuft, an eine VM verteilen, auf der ein DHCP-Client läuft.
Überprüfen Sie Folgendes:
- nicht verbundene Tap-Geräte können nicht aufgerufen werden
- sichtbar am
DOWN
Status in derip a l
Ausgabe des Hosts (sollteUNKNOWN
oder lautenUP
)- Wenn Sie QEMU das Tap-Gerät erstellen lassen,
qemu-bridge-helper
wird es angezeigt - Wenn Sie ein Skript verwenden, rufen Sie das Gerät dort auf
- andernfalls müssen Sie
ip link set tapN up
einige Zeit nach dem Start der VM
- Wenn Sie QEMU das Tap-Gerät erstellen lassen,
- sichtbar am
- MAC-Adressen müssen eindeutig sein
- sichtbar in
ether
Adresse inip a l
in den Gästen - Liste gelernter (nicht-Host-)Macs, z. B.
brctl showmacs br0
solltezweiEinträge mit einem Alterungstimer ungleich Null
- sichtbar in
- Pakete über iptables löschen
- prüfen
/proc/sys/net/bridge/bridge-nf-call*
, obbr_netfilter
das Modul geladen ist - Fügen Sie eine Protokollierungsregel hinzu, für IPv4 etwa
iptables -A FORWARD -j LOG --log-prefix "forward dropped"
vor dem Löschen oder vor einer DROP-Richtlinie für die FORWARD-Tabelle - ignorieren
/sys/class/net/br*/bridge/nf_call_*
(ich weiß nicht, warum diesedürfenausgeschaltet sein, wenn die Filterung eingeschaltet ist)
- prüfen
Andere bemerkenswerte Dinge, die ich beim Testen gefunden habe:
- Qemu hat die
vnet_hdr
Option auf meinen Tap-Geräten hinzugefügt. Das erscheint sinnvoll und hätte bei Bedarf über die Qemu-Befehlszeile deaktiviert werden können. - Manchmal ging meine (Scope-Link) Route für die Brücke verloren. Ich muss noch herausfinden, wie das überhaupt passieren konnte.
Zu Ihrem Versuch, das Testen durch die Bindung an das Tap-Gerät zu vereinfachen...
dnsmasq wird in einer QEMU-VM ausgeführt
Soweit ich weiß, sind Persistent-Tap-Geräte unbrauchbar, bis sie tatsächlich angeschlossen sind. Sie können also nur das vollständige Setup sinnvoll testen:
- Möchten Sie dnsmasq auf dem Host ausführen?
- Schließen Sie es dann an das Bridge-Gerät an.
- oder möchten Sie dnsmasq in einer VM ausführen?
- dann an die entsprechende Netzwerkschnittstelle anschließeninnendiese VM
--interface=tap0
Hinweis: Verwenden Sie --bind-interfaces
diese Option, um dnsmasq anzuweisen, nicht mehr nur den Datenverkehr von anderen Schnittstellen zu verwerfen, sondern tatsächlich eine Bindung herzustellen, und sich daher beim Start mit unbrauchbaren Einstellungen ausführlich zu beenden.