Nächste: , Nach oben: Virtuelle Maschinen   [Inhalt][Index]


5.1 Netzwerkbrücke für QEMU

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.

5.1.1 Eine Netzwerkbrücken-Schnittstelle aufbauen

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.

5.1.2 Das QEMU-Bridge-Helper-Skript konfigurieren

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 setuid-programs-Feld Ihrer Betriebssystemkonfiguration (auf dem Wirtssystem) hinzu, so wie hier:

(setuid-programs
 (cons (file-append qemu "/libexec/qemu-bridge-helper")
       %setuid-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")

5.1.3 QEMU mit den richtigen Befehlszeilenoptionen aufrufen

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

5.1.4 Durch Docker verursachte Netzwerkprobleme

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]