Nächste: Netzwerk-Routing anschalten in libvirt, Nach oben: Virtuelle Maschinen [Inhalt][Index]
In der Voreinstellung wird der QEMU-Netzwerkstapel auf dem Wirtssystem als
normaler Nutzer ausgeführt („User-Mode Host Network Back-end“), was den
Vorteil hat, dass man nichts weiter konfigurieren muss. Unglücklicherweise
kann man damit nicht alles machen. In diesem Modus bekommt die
Gast-VM (virtuelle Maschine) Zugriff auf das Netzwerk auf dieselbe
Weise wie das Wirtssystem, aber vom Wirt aus kann man keine Verbindung zum
Gast zustande bringen. Außerdem können, weil in QEMU das User-Mode-Netzwerk
über ICMP läuft, keine ICMP-basierten Netzwerkprogramme wie
ping
funktionieren. Daher ist es oft ratsam, eine Netzwerkbrücke
zu konfigurieren, über die das Gastsystem vollständig am Netzwerk
teilhat. So kann man auf dem Gast auch einen Server betreiben.
Es gibt viele Möglichkeiten, wie man eine Netzwerkbrücke herstellen
kann. Wenn die Betriebssystemdeklaration Ihres Systems auf einer der
Vorlagen für Desktop-Rechner basiert, läuft darauf NetworkManager. Mit
folgendem Befehl kann man NetworkManager über dessen befehlszeilenbasiertes
Programm nmcli
(„Command Line Interface“, CLI) anweisen, eine
Netzwerkbrücke aufzubauen:
# nmcli con add type bridge con-name br0 ifname br0
Um diese Brücke zu Ihrem Netzwerk hinzuzufügen, müssen Sie Ihre Netzwerkbrücke der Ethernet-Schnittstelle zuordnen, über die Sie sich mit dem Netzwerk verbinden. Wenn Ihre Schnittstelle z.B. die Bezeichnung ‘enp2s0’ hat, dann wird die Zuordnung mit folgendem Befehl hergestellt:
# nmcli con add type bridge-slave ifname enp2s0 master br0
Wichtig: Zu einer Brücke können nur Ethernet-Schnittstellen hinzugefügt werden. Wenn Sie ein Drahtlosnetzwerk benutzen, richten Sie wohl besser Routing für Ihr Netzwerk ein, beschrieben in Netzwerk-Routing anschalten in libvirt.
In der Voreinstellung ermöglicht es die Netzwerkbrücke den Gastsystemen, ihre IP-Adressen mittels DHCP zu beziehen, wenn DHCP auf Ihrem lokalen Netzwerk zur Verfügung gestellt wird. Weil das einfach ist, werden wir es hier benutzen. Um Gastmaschinen im Netzwerk zu finden, können Sie die Gäste so konfigurieren, dass diese ihre Rechnernamen über mDNS mitteilen.
Zu QEMU gehört ein Hilfsprogramm, mit dem eine Netzwerkbrücken-Schnittstelle
zur Verwendung durch „unprivilegierte“ Nutzer ohne besondere Berechtigungen
einfach eingerichtet wird (siehe Network options in QEMU-Dokumentation. Das Programm muss setuid-root gesetzt sein, damit es
funktioniert. Dazu fügen Sie es zum privileged-programs
-Feld Ihrer
Betriebssystemkonfiguration (auf dem Wirtssystem) hinzu, so wie hier:
(privileged-programs (cons (privileged-program (program (file-append qemu "/libexec/qemu-bridge-helper")) (setuid? #t)) %default-privileged-programs))
Zudem muss in der Datei /etc/qemu/bridge.conf eine Erlaubnis für die
Netzwerkbrücken-Schnittstelle eingetragen werden, denn nach Voreinstellung
wird alles blockiert. Fügen Sie dazu folgenden Dienst zu Ihrer
services
-Liste hinzu:
(extra-special-file "/etc/qemu/host.conf" "allow br0\n")
Wenn Sie QEMU aufrufen, müssen Sie die folgenden Optionen angeben, damit die Netzwerkbrücke benutzt wird, nachdem Sie eine einzigartige MAC-Adresse für den Gast vorgeben.
Wichtig: Nach Voreinstellung wird dieselbe MAC-Adresse für alle Gastsysteme benutzt, wenn Sie keine angeben. Wenn sich die MAC-Adressen mehrerer virtueller Maschinen aber nicht unterscheiden, kommt es zu Netzwerkfehlern, wenn Sie die Netzwerkbrücke benutzen.
$ qemu-system-x86_64 […] \ -device virtio-net-pci,netdev=user0,mac=XX:XX:XX:XX:XX:XX \ -netdev bridge,id=user0,br=br0 \ […]
Um MAC-Adressen mit dem für QEMU registrierten Präfix zu erzeugen, können Sie folgendes Code-Schnipsel eintippen:
mac_address="52:54:00:$(dd if=/dev/urandom bs=512 count=1 2>/dev/null \ | md5sum \ | sed -E 's/^(..)(..)(..).*$/\1:\2:\3/')" echo $mac_address
Wenn Sie auf Ihrer Maschine Docker einsetzen, kann es zu
Verbindungsproblemen kommen, wenn Sie eine Netzwerkbrücke zu benutzen
versuchen. Der Grund ist, dass auch Docker Netzwerkbrücken mitbringt und
seine eigenen Netzwerkregeln einrichtet. Die Lösung liegt im Hinzufügen des
folgenden iptables
-Schnipsels in Ihre Betriebssystemdeklaration:
(service iptables-service-type (iptables-configuration (ipv4-rules (plain-file "iptables.rules" "\ *filter :INPUT ACCEPT [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A FORWARD -i br0 -o br0 -j ACCEPT COMMIT "))
Nächste: Netzwerk-Routing anschalten in libvirt, Nach oben: Virtuelle Maschinen [Inhalt][Index]