Benutzer-Werkzeuge

Webseiten-Werkzeuge


virtuelle_netzwerke_konfigurieren

Virtuelle Netzwerke

QEMU und die Kernel-based Virtual Machine unterstützen Netzwerkverbindungen zwischen dem Gast- und dem Host-System. Laufen mehrere Instanzen, sind auch Netzwerkverbindungen zwischen den Gast-Systemen möglich.

Netzwerkkarten

Eine virtuelle Netzwerkkarte (Network Interface Card) wird mit der Option -net nic konfiguriert.

Host ~$ qemu Platte.img -net nic

Im QEMU-Monitor informiert der Befehl info network über VLANs (Virtual Local Area Network) der Instanz und die zugehörigen Devices. In diesem Beispiel ist die Instanz mit einem virtuellen Netzwerk (VLAN 0) verbunden. Dazu wird eine virtuelle Netzwerkkarte (NE2000 PCI) mit der MAC-Adresse 52:54:00:12:34:56 zur Verfügung gestellt.

(qemu) info network
VLAN 0 devices:
user.0: net=10.0.2.0, restricted=n
e1000.0: model=e1000,macaddr=52:54:00:12:34:56

Die Option -net nic ist per Default aktiviert und kann daher weggelassen werden.

Host ~$ qemu Platte.img

Im QEMU-Monitor wird mit dem Befehl set_link das virtuelle Netzwerkkabel für die angegebene Netzwerkkarte entfernt (off) oder verbunden (on). Der folgende Befehl zieht das virtuelle Netzwerkkabel heraus.

(qemu) set_link e1000.0 off

Die Verbindung wird wieder hergestellt.

(qemu) set_link e1000.0 on

Soll keine Netzwerkkarte emuliert werden, ist die Option -net none anzuwenden.

Host ~$ qemu Platte.img -net none

Die Syntax für die Option -net nic lautet wie folgt:

-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]

Der Parameter vlan=n ist bei der Verwendung von mehreren Netzwerkkarten anzugeben und definiert das VLAN. Der Default-Wert ist gleich 0. Mit dem Parameter model lassen sich Netzwerkkarten einstellen. Je nach Prozessor-Architektur werden unterschiedliche Netzwerkkarten emuliert. Alle verfügbaren Netzwerkkarten werden mit -net nic,model=? aufgelistet.

Host ~$ qemu -net nic,model=?
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

In diesem Beispiel wird die Karte RTL8139 emuliert.

Host ~$ qemu Platte.img -net nic,model=rtl8139

Der Parameter macaddr gibt eine MAC-Adresse (Media Access Control) vor, die zur eindeutigen Identifikation des Geräts im Netzwerk dient.

Host ~$ qemu Platte.img -net nic,macaddr=00:80:AD:3B:3E:4F

Einige Betriebssysteme verwalten Tabellen in denen MAC-Adressen den Netzwerk-Schnittstellen zugeordnet werden. Wird eine MAC-Adresse geändert, funktioniert die zugeordnete Netzwerkkarte nicht mehr. Dann ist die Zuordnungstabelle zu aktualisieren. Unter Ubuntu sind die MAC-Adressen in der Datei /etc/udev/rules.d/70-persistent-net.rules und unter SuSE in der Datei /etc/udev/rules.d/30-net_persistent_names.rules anzupassen. Ältere Ubuntu-Versionen speichern die MAC-Adressen in der Datei /etc/iftab. Diese Datei kann gelöscht werden.

Die Netzwerkkarte kann zur besseren Adressierung mit dem Parameter name=str benannt werden. Im QEMU-Monitor wird mit info network dieser Name angezeigt.

Host ~$ qemu Platte.img -net nic,name=nic1
(qemu) info network
VLAN 0 devices:
nic1: model=ne2k_pci,macaddr=52:54:00:12:34:56

Mit den Parametern addr=str und vectors=v lassen sich bei PCI-Netzwerkkarten die PCI-Device-Adresse und deren Anzahl von MSI-X-Vektoren (Message Signaled Interrupts) festlegen. Diese Vorgabe hat zur Zeit keinen Effekt bei virtio-Karten. Mit vectors=0 wird MSI-X deaktiviert.

Neben einer oder mehreren virtuellen Netzwerkkarten benötigt man eine virtuelle Netzwerk-Struktur (Kabel, Hubs, Switche, Bridges, Router, Firewalls, Netzwerkdienste,…).

User Mode Network Stack

Ein virtuelles Netzwerk, welches ohne Administrator-Rechte im Usermode des Host-Rechners realisiert wird, ist einfach zu konfigurieren. Wird QEMU oder die Kernel-based Virtual Machine ohne Angabe einer Netzwerkoption beziehungsweise mit den Default-Optionen -net nic -net user aufgerufen, wird ein virtuelles Netzwerk (10.0.2.0) mit Firewall und DHCP-Server (10.0.2.2) erzeugt. Der DHCP-Server weist dem Gast-System automatisch eine IP-Adresse ab 10.0.2.15 zu. Auch wird das Routing über das von QEMU bereitgestellte Gateway (10.0.2.2) definiert. Eine Netzwerkkonfiguration ist daher bei den meisten Betriebssystemen nicht notwendig und ein Zugang vom Gast-System nach außen ist sofort verfügbar. Das heißt, wenn das Host-System Zugang zum Internet hat, hat auch das Gast-System automatisch Zugang zum Internet.

Host ~$ qemu Platte.img -net nic -net user

Wenn weder für -net nic noch für -net user zusätzliche Parameter notwendig sind, können diese weggelassen werden, da diese Optionen per Default aktiviert sind.

Host ~$ qemu Platte.img

Sollen mehrere Netzwerkkarten mit jeweils einem Netzwerk verbunden werden, ist mit dem Parameter -net nic,vlan=n das VLAN für die Netzwerkkarte und den User Mode Network Stack anzugeben. Hier ein Beispiel mit zwei Netzwerkkarten und zwei VLANs.

Host ~$ qemu Platte.img \
-net nic,vlan=0 -net user,vlan=0 \
-net nic,vlan=1 -net user,vlan=1

Im QEMU-Monitor informiert der Befehl info network über VLANs der Instanz und die zugehörigen Devices.

(qemu) info network VLAN 0 devices:
user.0: net=10.0.2.0, restricted=n
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56
VLAN 1 devices:
user.1: net=10.0.2.0, restricted=n
ne2k_pci.1: model=ne2k_pci,macaddr=52:54:00:12:34:57

Im QEMU-Monitor lassen sich VLANs mit dem Befehl host_net_remove entfernen. In diesem Beispiel soll das VLAN 1 entfernt werden.

(qemu) host_net_remove 1 user.1

(qemu) info network VLAN 0 devices:
user.0: net=10.0.2.0, restricted=n
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56
VLAN 1 devices:
ne2k_pci.1: model=ne2k_pci,macaddr=52:54:00:12:34:57

Mit dem Befehl host_net_add user lassen sich VLANs hinzufügen.

(qemu) host_net_add user vlan=1

(qemu) info network VLAN 0 devices:
user.0: net=10.0.2.0, restricted=n
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56
VLAN 1 devices:
ne2k_pci.1: model=ne2k_pci,macaddr=52:54:00:12:34:57
user.1: net=10.0.2.0, restricted=n\\

Zur besseren Unterscheidung lassen sich VLANs benennen. In diesem Beispiel werden die VLANs nicht user.0 und user.1 sondern VLANextern und VLANintern benannt.

Host ~$ qemu Platte.img \
-net nic,vlan=0 -net user,vlan=0,name=VLANextern \
-net nic,vlan=1 -net user,vlan=1,name=VLANintern

Im QEMU-Monitor werden diese Namen mit dem Befehl info network angezeigt.

(qemu) info network VLAN 0 devices:
VLANextern: net=10.0.2.0, restricted=n
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56
VLAN 1 devices:
VLANintern: net=10.0.2.0, restricted=n
ne2k_pci.1: model=ne2k_pci,macaddr=52:54:00:12:34:57\\

Per Default wird dem Gast-System das Netzwerk-Segment 10.0.2.0/8 zur Verfügung gestellt. Mit -net user,net=addr[/mask] kann die Netzwerk-Adresse und optional die Netzwerk-Maske angepasst werden. In diesem Beispiel wird dem Gast-System das Netzwerk-Segment 192.168.1.0/24 vorgegeben. Per DHCP erhält das Gast-System die IP-Adresse 192.168.1.15.

Host ~$ qemu Platte.img -net nic -net user,net=192.168.1.0/24

(qemu) info network VLAN 0 devices:
user.0: net=192.168.1.0, restricted=n
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56

Das Host-System ist für das Gast-System über die zweite IP-Adresse (x.x.x.2) im Gast-Netzwerk ansprechbar. Im Default-Netzwerk-Segment (10.0.2.0) ist dies die IP-Adresse 10.0.2.2. Diese IP-Adresse kann mit ping getestet werden. Weiterhin kann man sich auf das Host-System über diese IP-Adresse einloggen. Mit der Option -net user,host=addr lässt sich die IP-Adresse des Host-Systems anpassen.

Host ~$ qemu Platte.img -net nic -net user,host=10.0.2.7

Die Firewall der Instanz blockt alle eingehenden Verbindungen in dieses virtuelle Netzwerk ab. Daher kann nicht von außen auf die virtuelle Maschine zugegriffen werden. Das Gast-System ist damit geschützt. Übrigens blockiert QEMU das Internet Control Message Protocol (ICMP) auch nach außen. Das heißt, ein Ping vom Gast-System zum Internet funktioniert nicht. Soll das Gast-System komplett isoliert werden, ist die Option -net user,restrict=y anzuwenden. Ein Einloggen in das Host-Systems über die interne IP-Adresse ist nicht möglich.

Host ~$ qemu Platte.img -net nic -net user,restrict=y

Im QEMU-Monitor zeigt der Befehl info network an, ob restrict aktiviert ist.

(qemu) info network VLAN 0 devices:
user.0: net=10.0.2.0, restricted=y
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56

Die Option -net user,restrict=y beeinträchtigt nicht die nachfolgend beschriebenen Forward-Regeln (-net user,hostfwd und -net user,guestfwd). Weitere Parameter der Option -net user werden im Abschnitt Netzwerkdienste beschrieben.

Port-Redirects vom Host-System (hostfwd)

Da das VLAN durch die integrierte Firewall geschützt ist, ist das Gast-System von außen nicht erreichbar. Um auf bestimmte Dienste des Gast-Systems zugreifen zu können, müssen die entsprechenden Ports in der Firewall geöffnet werden. Dies kann im Usermode Network Stack durch Port-Redirects mit der Option -net user,hostfwd=… konfiguriert werden. Dabei wird jeweils ein Port des Gast-Systems auf einen Port des Host-Systems abgebildet. Das bedeutet, dass auf dem Host-System ein Port geöffnet wird, der ein Port des Gast-Systems ist. Die Verwendung von privilegierten Ports (0 - 1024) des Host-System ist nur durch den Benutzer root möglich. Das folgende Beispiel lässt über den Port 12345 des Host-Systems eine SSH-Verbindung (Port 22) auf das Gast-System zu. Dazu muss natürlich auf dem Gast-System ein SSH-Server laufen.

Host ~$ qemu Platte.img -net nic -net user,hostfwd=tcp::12345-:22

Mit einem SSH-Client loggt man sich hier am Port 12345 des Host-Systems ein. Die Option -p definiert den Port. Es ist auch ein Einloggen von einem anderen Computer des Netzwerkes in dieses Gast-System möglich. Es muss dann statt localhost die IP-Adresse oder der Rechnername des Host-Systems angegeben werden. Unter Microsoft Windows ist ein Einloggen mit putty oder mit Cygwin möglich. Die Cygwin-Befehle lauten wie ihre Gegenstücke unter Unix/Linux.

Host ~$ ssh -p 12345 root@localhost

Mit SCP unter Unix und Linux beziehungsweise WinSCP unter Microsoft Windows werden Dateien mit dem Gast-System ausgetauscht. Im folgenden Beispiel wird die Datei /etc/fstab des Gast-Systems (Linux) auf das Host-System (Linux) mit scp kopiert.

Host ~$ scp -P 12345 root@localhost:/etc/fstab .

Um sich per Remote Desktop Protocol (siehe http://qemu-buch.de/d/Anhang/_Nützliche_Tools#Remote_Desktop_Protocol) auf ein Gast-System mit Microsoft Windows einloggen zu können, ist jeweils das Port 3389 freizuschalten.

Host ~$ qemu Platte.img -net nic -net user,hostfwd=tcp::3389-:3389

Mit rdesktop oder einem anderem RDP-Client verbindet man sich zu dem Gast-System.

Host ~$ rdesktop -g 800×600 -k de localhost

Es können mehrere Port-Redirects konfiguriert werden. Möchte man zum Beispiel die Protokolle HTTP (Port 80) und HTTPs (Port 443) eines auf dem Gast-System laufenden Webservers zur Verfügung stellen, bewerkstelligen dies folgende Optionen. Auf dem Host-System kann im Web-Browser über die URL http://localhost:8080 der HTTP-Port und über die URL https://localhost:8081 der HTTPS-Port des Gast-Systems erreicht werden.

Host ~$ qemu Platte.img -net nic \
-net user,hostfwd=tcp::8080-:80,hostfwd=tcp::8081-:443

Im QEMU-Monitor informiert der Befehl info usernet über die definierten Forward-Regeln.

(qemu) info usernet VLAN 0 (user.0):
Protocol[State] FD Source Address Port Dest.Address Port RecvQ SendQ
TCP[HOST_FORWARD] 6 * 8080 10.0.2.15 80 0 0
TCP[HOST_FORWARD] 5 * 8081 10.0.2.15 443 0 0

Weiterhin können im QEMU-Monitor neue Forward-Regeln mit dem Befehl hostfwd_add hinzugefügt werden. Das folgende Beispiel lässt über den Port 12345 des Host-Systems eine SSH-Verbindung (Port 22) auf das Gast-System zu.

(qemu) hostfwd_add tcp::12345-:22

Mit dem Befehl hostfwd_remove werden Forward-Regeln gelöscht.

(qemu) hostfwd_remove tcp::12345

Die allgemeine Syntax für das Port-Redirect per Option -net user,hostfwd lautet wie folgt.

-net user,hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport

Wird weder tcp noch udp als Verbindungstyp angegeben, wird das TCP-Protokoll verwendet. Durch Angabe von hostaddr kann die Forward-Regel an ein definiertes Netzwerk-Interface im Host gebunden werden. Wird guestaddr nicht vorgegeben, wird dessen Wert mit der ersten vom internen DHCP-Server vorgegebenen IP-Adresse belegt (x.x.x.15).

Die allgemeine Syntax für den Befehl hostfwd_add im QEMU-Monitor lautet wie folgt. Zusätzlich zu den Parametern von -net user,hostfw kann hier VLAN-ID angegeben werden. Dies ist bei mehreren virtuellen Netzwerkkarten notwendig (siehe -net nic,vlan=n).

(qemu) hostfwd_add [vlan_id name] \
[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport

Die allgemeine Syntax für den Befehl hostfwd_remove ist:

(qemu) hostfwd_remove [vlan_id name] [tcp|udp]:[hostaddr]:hostport

Bei älteren QEMU-Versionen ist für das Port-Redirect die Option -redir zu verwenden.

Redirects vom Gast-System (guestfwd)

Mit der Option -net user,guestfwd=[tcp]:server:port-dev wird eine TCP-Verbindung vom Gast-System zu der IP-Adresse (server) und dem Port (port) auf das Character-Device (dev) des Host-Systems weitergeleitet. Diese Option kann mehrfach angegeben werden. Im folgenden Beispiel wird eine TCP-Verbindung vom Gast-System zu der IP-Adresse 10.0.2.1 und dem Port 80 auf stdio umgeleitet. Wird im Gast-System ein HTTP-Request an die IP-Adresse gesendet, erscheint diese Anfrage auf stdio.

Host ~$ qemu Platte.img \
-net nic -net user,guestfwd=tcp:10.0.2.1:80-stdio

GET / HTTP/1.0
User-Agent: Wget/1.11.4
Accept: */*
Host: 10.0.2.1
Connection: Keep-Alive

TUN/TAP-Network-Interfaces

Der Usermode Network Stack hat einige Einschränkungen. Da sich das Gast-System in einem anderen Netzwerk als das Host-System und hinter einer Firewall befindet, ist ein vollständiger Zugriff auf das Gast-System nicht möglich. Damit Host- und Gast-System ein gemeinsames Netzwerk haben, wird ein zusätzliches Netzwerk-Interface im Host-System benötigt. Dieses zusätzliche Netzwerk-Interface wird durch einen TUN/TAP-Adapter ermöglicht. TUN und TAP sind virtuelle Netzwerk-Kerneltreiber, die Netzwerkgeräte über Software simulieren. TUN simuliert ein Point-to-Point-Netzwerkgerät, während TAP ein Ethernet-Gerät darstellt. Erst durch den TUN/TAP-Adapter des Host-Systems erhält das Gast-System eine vollständige TCP/IP-Anbindung. Der Linuxkernel bietet ab Version 2.1.60 TUN/TAP-Support. Es muss sichergestellt werden, dass das Device /dev/net/tun für den Benutzer, unter dem QEMU läuft, zugänglich ist.

Host ~$ sudo chmod go+rw /dev/net/tun

Notwendig ist das Skript /etc/qemu-ifup, das beim Aufruf von QEMU mit der Option -net tap den TUN/TAP-Adapter eine IP-Adresse zuweist. Diese Datei hat zum Beispiel folgenden Inhalt:

#!/bin/sh
sudo -p „Password for $0:“ /sbin/ifconfig $1 10.0.2.100

Die im Skript angegebene IP-Adresse muss sich im gleichen Netzwerksegment wie die IP-Adresse des Gast-Systems befinden, darf aber nicht mit einer vorhandenen IP-Adresse übereinstimmen. Konfiguriert wird ein Netzwerk-Interface mit ifconfig. Dazu sind root-Rechte erforderlich, die im Skript mit dem Befehl sudo vergeben werden. Weiterhin ist das Skript /etc/qemu-ifdown notwendig. Man legt es mit folgenden Inhalt an:

#!/bin/sh
sudo -p „Password for $0:“ /sbin/ifconfig $1 down

QEMU wird mit den Optionen -net nic und -net tap und deren Parameter gestartet.

Host ~$ qemu -hda Platte.img -net nic,vlan=0 -net tap,vlan=0,ifname=tap0
Password for /etc/qemu-ifup: *****

Das Host-System erhält ein TAP-Device mit der IP-Adresse 10.0.2.100.

Host ~$ ifconfig tap0 tap0 Protokoll:Ethernet …
inet Adresse:10.0.2.100 …

Im QEMU-Monitor listet der Befehl info network diese Konfiguration auf.

(qemu) info network VLAN 0 devices:
tap.0: ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56

Im QEMU-Monitor wird mit dem Befehl host_net_remove dieses Interface entfernt.

(qemu) host_net_remove 0 tap.0
Password for /etc/qemu-ifdown: *****

(qemu) info network VLAN 0 devices:
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56

Zum Aktivieren eines TUN/TAP-Network-Interface kann im QEMU-Monitor der Befehl host_net_add tap angewendet werden. Nach diesem Befehl sind die Parameter wie bei -net tap anzugeben.

(qemu) host_net_add tap vlan=0,ifname=tap0
Password for /etc/qemu-ifup: *****

(qemu) info network VLAN 0 devices:
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56
tap.0: ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown

Dies ist die vollständige Syntax für die Option -net tap:

-net tap[,vlan=n][,name=name][,fd=h][,ifname=name] \ [,script=file][,downscript=dfile][,sndbuf=nbytes][,vnet_hdr=on|off] \ [,vhost=on|off][,vhostfd=h][,vhostforce=on|off]

Dabei wird das TAP-Netzwerk-Interface des Host-Systems mit dem VLAN n verbunden. Es wird das Skript file (Default = /etc/qemu-ifup) für die Aktivierung und das Skript dfile (Default = /etc/qemu-ifdown) für die Deaktivierung verwendet. Soll die Ausführung der Skripte unterbunden werden, ist script=no beziehungsweise downscript=no zu setzen. Mit fd kann ein Handle eines bestehenden TAP-Netzwerk-Interface angegeben werden. Mit der Option sndbuf wird die Größe des Sende-Puffers begrenzt. Der Default-Wert von sndbuf=1048576 lässt sich mit sndbuf=0 deaktivieren. Wird die Option vnet_hdr=off gesetzt, wird das TUN/TAP-Flag IFF_VNET_HDR deaktiviert. Dieses Flag erlaubt das Senden und Empfangen von großen Paketen beziehungsweise Paketen mit Teil-Checksummen. Bei schlechten Support für IFF_VNET_HDR sollte diese Option deaktiviert werden. Wird die Option vnet_hdr=off gesetzt, wird das TUN/TAP-Flag IFF_VNET_HDR deaktiviert. Dieses Flag erlaubt das Senden und Empfangen von großen Paketen beziehungsweise Paketen mit Teil-Checksummen. Bei schlechten Support für IFF_VNET_HDR sollte diese Option deaktiviert werden. vhost=on aktiviert den experimentellen Kernel-Beschleuniger. vhostfd=h stellt eine Verbindung zu einem bereits geöffneten Netzwerk-Device h her. vhostforce=on erzwingt die Aktivierung des Kernel-Beschleunigers (vhost=on) für Gast-Systeme mit virtio-Treiber ohne MSI-X-Support. MSI-X ist eine Erweiterung des Message Signaled Interrupts ab PCI 3.0.

Unter Linux ist es möglich mit dem Programm tunctl auch manuell TAP-Interfaces zu erzeugen. Dies ist notwendig, um virtuelle Maschinen anderer Virtualisierungslösungen vernetzten zu können. Dazu wird das Paket uml-utilities benötigt.

Host ~$ sudo apt-get install uml-utilities

Folgender Befehl legt das TAP-Interface tap0 an und macht den Nutzer hans zum Eigentümer.

Host ~$ sudo tunctl -t tap0 -u hans

Der Befehl ifconfig listet dieses Interface auf.

Host ~$ ifconfig tap0

Microsoft Windows-Versionen bieten keinen TUN/TAP-Support. Dieser wird erst durch die Installation der TUN/TAP-Adapter von OpenVPN eingerichtet. Eine Anleitung dazu befindet sich unter der URL http://qemu-buch.de/d/QEMU_unter_Microsoft_Windows.

Mehrere Instanzen mit Sockets vernetzen

Mit der Option -net socket ist es möglich, mehrere Instanzen untereinander zu verbinden. Ist auch eine Verbindung nach außen gewünscht, kann eine virtuelle Maschine als Router konfiguriert werden. Die Kommunikation erfolgt über Sockets. Ein Socket ist eine bidirektionale Software-Schnittstelle zur Interprozess- oder Netzwerkkommunikation.

TCP-Socket

Eine Variante, um mehrere Gast-Systeme miteinander kommunizieren zu lassen, ist die Verbindung über einen TCP-Socket (Transmission Control Protocol). Die Konfiguration ist ähnlich der Konfiguration beim UDP-Multicastsocket. Wird für eine Instanz mit -net socket mit dem Parameter listen angegeben, wartet die Instanz auf eingehende Verbindungen auf dem angegebenen Port. Auf der zweiten Instanz verbindet man sich mit connect mit der ersten Instanz. Hier ein Beispiel für eine auf Verbindung wartende Instanz.

Host ~$ qemu Platte-01.img -net nic,macaddr=52:54:00:12:34:56 \
-net socket,listen=:1234

Das zweite Beispiel stellt eine Instanz dar, die eine Verbindung zur ersten Instanz herstellt.

Host ~$ qemu Platte-02.img -net nic,macaddr=52:54:00:12:34:57 \
-net socket,connect=127.0.0.1:1234

Auf beiden Instanzen kann jeweils im QEMU-Monitor mit dem Befehl info network die Verfügbarkeit des Sockets getestet werden. Auf der Instanz mit listen erscheint folgende Ausgabe:

(qemu) info network
VLAN 0 devices:
ne2000 pci macaddr=52:54:00:12:34:56
socket: connection from 127.0.0.1:1472

Auf der Instanz mit connect wird diese Information angezeigt.

(qemu) info network VLAN 0 devices:
socket: connect to 127.0.0.1:1234
ne2000 pci macaddr=52:54:00:12:34:57

Jetzt werden die IP-Adressen in den Gast-Systemen konfiguriert. In diesen Beispielen ist jeweils Linux das Gast-System. Das erste Gast-System erhält hier die IP-Adresse 10.0.2.16. Diese wird mit dem Befehl ifconfig definiert.

Gast 1 ~# ifconfig eth0 10.0.2.16

Das zweite Gast-System erhält die IP-Adresse 10.0.2.17.

Gast 2 ~# ifconfig eth0 10.0.2.17

Hier die vollständige Syntax zur Generierung eines TCP-Socket:

-net socket[,vlan=n][,name=name][,fd=h] \ [,listen=[host]:port][,connect=host:port]

Mit diesen Optionen verbindet man das VLAN n mit einem anderen VLAN über eine TCP-Socket-Verbindung. Ist listen angegeben, wartet die Instanz auf eingehende Verbindungen auf dem angegebenen Port (host ist optional). Auf der zweiten Instanz verbindet man sich mit connect zur ersten Instanz. Mit fd kann ein Handle eines bereits bestehenden TCP-Sockets angegeben werden.

UDP-Multicastsocket

Eine weitere Variante, um mehrere Gast-Systeme untereinander zu verbinden, ist ein VLAN über UDP-Multicastsocket. Über Multicast werden in TCP/IP-Netzwerken Daten an viele Empfänger zur gleichen Zeit gesandt. Dies erfolgt über eine spezielle Multicast-Adresse im Bereich 224.0.0.0 bis 239.255.255.255. Das verwendete Protokoll ist UDP (User Datagram Protocol). Es ist ein minimales, verbindungsloses Netzwerkprotokoll, das zur Transportschicht der Internetprotokollfamilie gehört. Um Instanzen mit einem UDP-Multicastsocket zu verbinden, sind jeweils die Startoptionen -net nic mit Angabe der MAC-Adresse der virtuellen Netzwerkkarte und -net socket mit Angabe der gemeinsamen Multicast-Adresse und einem Port anzuwenden. In diesem Beispiel wird die Multicast-Adresse 230.0.0.1 mit dem Port 1234 angesprochen.

Host ~$ qemu Platte-01.img -net nic,macaddr=52:54:00:12:34:56 \
-net socket,mcast=230.0.0.1:1234

Die zweite Instanz wird mit einer anderen MAC-Adresse gestartet.

Host ~$ qemu Platte-02.img -net nic,macaddr=52:54:00:12:34:57 \
-net socket,mcast=230.0.0.1:1234

Es können weitere Instanzen aufgerufen werden.

Host ~$ qemu Platte-03.img -net nic,macaddr=52:54:00:12:34:58 \
-net socket,mcast=230.0.0.1:1234

In den Instanzen zeigt jeweils im QEMU-Monitor der Befehl info network den verwendeten Socket an. Hier als Beispiel die erste Instanz:

(qemu) info network VLAN 0 devices:
socket.0: socket: mcast=230.0.0.1:1234
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56

Jetzt werden die IP-Adressen in den Gast-Systemen konfiguriert. In diesen Beispielen ist jeweils Linux das Gast-System. Das erste Gast-System erhält die IP-Adresse 10.0.2.16. Diese wird mit dem Befehl ifconfig definiert.

Gast 1 ~# ifconfig eth0 10.0.2.16

Das zweite Gast-System erhält die IP-Adresse 10.0.2.17.

Gast 2 ~# ifconfig eth0 10.0.2.17

Das dritte Gast-System erhält die IP-Adresse 10.0.2.18.

Gast 3 ~# ifconfig eth0 10.0.2.18

In der laufenden Instanz lässt sich mit dem Befehl host_net_remove ein Socket entfernen.

(qemu) host_net_remove 0 socket.0
(qemu) info network VLAN 0 devices:
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56

Mit dem Befehl host_net_add socket generiert man einen Socket. Die Parameter entsprechen denen von -net socket zur Generierung eines UDP-Multicastsocket.

(qemu) host_net_add socket mcast=230.0.0.1:1234
(qemu) info network VLAN 0 devices:
ne2k_pci.0: model=ne2k_pci,macaddr=52:54:00:12:34:56
socket.0: socket: mcast=230.0.0.1:1234

Hier die vollständige Syntax zur Generierung eines UDP-Multicastsocket:

-net socket[,vlan=n][,name=name][,fd=h] \ [,mcast=maddr:port[,localaddr=addr]]

Damit generiert man das VLAN n, das zusammen mit anderen Instanzen mit der gleichen Multicast-Adresse maddr und Port port genutzt werden kann. Mehrere Instanzen können auf unterschiedlichen Hosts laufen und den gleichen Bus nutzen. Der Multicast-Supportt ist kompatibel zum User Mode Linux (ethN=mcast). Mit fd kann ein Handle eines bestehenden UDP-Multicast-Sockets angegeben werden. Mit localaddr=addr wird die IP-Adresse des Hosts vorgegeben, von dem die Pakete versendet werden sollen. In diesem Beispiel wird 1.2.3.4 als Absender-Adresse vorgegeben:

Host ~$ qemu linux.img -net nic,macaddr=52:54:00:12:34:56 \ -net socket,mcast=239.192.168.1:1102,localaddr=1.2.3.4

Bridging und Switching

Bridging bezeichnet eine Technik zur Koppelung von zwei Netzwerken, meist LAN-Segmenten, auf dem Layer 2 des OSI-Modells. Diese Technik kann genutzt werden, um virtuelle Maschinen zu vernetzen. Damit ist es möglich, den virtuellen Maschinen einen uneingeschränkten Netzwerkzugang zur Verfügung zu stellen. Auf die virtuellen Maschinen kann auch von außerhalb des Host-Systems zugegriffen werden. Beim Switching wird das eingehende Ethernet-Frame analysiert. Dabei werden die MAC-Adressen des Senders und Empfängers in der MAC-Tabelle gespeichert. Dadurch werden die Pakete schneller an den Switch-Port, an dem der Empfänger hängt, weitergeleitet. Da die Verkabelung der Ports verändert werden kann, werden alte Einträge in der MAC-Tabelle regelmäßig gelöscht. Es gibt Layer-2- und Layer-3-Switches. Letztere verfügen in der Regel über Management-Funktionen. Switches werden auch als intelligente Hubs bezeichnet und deren Funktionsweise ist der einer Bridge sehr ähnlich. Bridges haben aber meist nur zwei Ports. Switches hingegen besitzen zwischen vier, 12 bis maximal 48 Ports. Switches beherrschen mehr Funktionen als Bridges. Vereinfacht gesagt: Jeder Switch ist eine Bridge, aber nicht jede Bridge ist ein Switch. Es gibt aber Bridges, die auch Protokolle wie Token Ring und Ethernet (MAC-Bridge oder LLC-Bridge) verbinden können. Dies ist mit Switches nicht möglich.

bridge-utils

Virtuelle Bridges werden unter Unix/Linux mit dem Paket bridge-utils realisiert. Das Bridging mit dem Paket bridge-utils funktioniert aber nicht mit WLAN-Devices. Bei WLAN-Devices ist das Proxy-ARP-Bridging mit parprouted anzuwenden (siehe unten). Die Installation des Paketes bridge-utils erfolgt unter Debian/Ubuntu mit folgender Befehlszeile:

Host ~$ sudo apt-get install bridge-utils

Um vorhandene Bridges und dessen Konfiguration anzuzeigen, dient der Befehl brctl show.

Host ~$ sudo -i
Host ~# brctl show
bridge name bridge id STP enabled interfaces
pan0 8000.000000000000 no

Eine Bridge löscht man mit dem Befehl brctl delbr.

Host ~# brctl delbr pan0

Zum Anlegen einer neuen Bridge ist die Option addbr anzuwenden. Im folgenden Beispiel erhält die angelegte Bridge den Namen bri0.

Host ~# brctl addbr bri0

Mit brctl show überprüft man, ob die Bridge angelegt wurde.

Host ~# brctl show
bridge name bridge id STP enabled interfaces
bri0 8000.000000000000 no

Da hier nur eine Bridge verwendet wird, ist das Spanning Tree Protocol (STP) nicht notwendig und zu deaktivieren. Das Spanning Tree Protocol dient zur Vermeidung redundanter Netzpfade (Schleifen) im LAN.

Host ~# brctl stp bri0 off
Host ~# exit
Host ~$

Im diesem Beispiel werden die TUN/TAP-Network-Interfaces zweier virtueller Maschinen an die angelegte Bridge angeschlossen. Damit können die virtuellen Maschinen mit dem Netzwerk des Host-Rechners verbunden werden. Die Adresse dieses Netzwerkes ist hier 192.168.1.0. Zunächst sind zwei Instanzen mit TUN/TAP-Network-Interfaces zu starten. Zur eindeutigen Adressierung müssen die MAC-Adressen unterschiedlich sein. Ansonsten kommt es zu Aussetzern.

Host ~$ qemu Platte1.img -net nic,macaddr=52:54:00:12:34:56 -net tap
Password for /etc/qemu-ifup: *****

Host ~$ qemu Platte2.img -net nic,macaddr=52:54:00:12:34:57 -net tap
Password for /etc/qemu-ifup: *****

Im Host-System wurden die virtuellen Netzwerk-Schnittstellen tap0 und tap1 angelegt. Dies kann mit dem Befehl ifconfig überprüft werden. Die IP-Adressen dieser virtuellen Netzwerk-Schnittstellen müssen gelöscht werden.

Host ~$ sudo ifconfig tap0 0.0.0.0 up
Host ~$ sudo ifconfig tap1 0.0.0.0 up

Die virtuellen Netzwerk-Schnittstellen werden anschließend der Bridge bri0 zugeordnet.

Host ~$ sudo brctl addif bri0 tap0
Host ~$ sudo brctl addif bri0 tap1

Diese Zuordnung ist mit dem Befehl brctl show zu kontrollieren.

Host ~$ sudo brctl show
bridge name bridge id STP enabled interfaces
bri0 8000.76674ec80764 no tap0
tap1

Die Bridge erhält eine freie IP-Adresse im Netzwerk des Host-Systems.

Host ~$ sudo ifconfig bri0 192.168.1.220 up

Die Verfügbarkeit dieser IP-Adresse wird von einem anderen Rechner in diesem Netzwerk mit ping getestet.

Host 2 ~# ping 192.168.1.220

Den virtuellen Maschinen können freie IP-Adressen des Host-Netzwerkes zugeordnet werden. Läuft auf den Gast-Systemen Linux, können folgende Befehle angewendet werden.

Gast 1 ~# ifconfig eth0 192.168.1.221 netmask 255.255.255.0 up
Gast 2 ~# ifconfig eth0 192.168.1.222 netmask 255.255.255.0 up

Damit auch die Netzwerkkarte des Host-Systems an die Bridge angeschlossen werden kann, ist auch dessen IP-Adresse zu löschen und anschließend der Bridge zuzuordnen. Der Host ist danach nicht mehr unter der alten IP-Adresse erreichbar.

Host ~$ sudo ifconfig eth0 0.0.0.0 up && brctl addif bri0 eth0

Damit die Bridge auch nach einem Neustart zur Verfügung steht, ist die entsprechende Netzwerk-Konfigurationsdatei anzupassen. Bei Debian/Ubuntu ist dies die Datei /etc/network/interfaces. In diesem Beispiel müssen die bisherigen Einträge zu eth0 gelöscht werden. Die Bridge und damit der Rechner sind in diesem Beispiel über die IP-Adresse 192.168.1.220 erreichbar.

auto eth0
iface eth0 inet manual
auto bri0
iface bri0 inet static
       address 192.168.1.220
       network 192.168.1.0
       netmask 255.255.255.0
       broadcast 192.168.1.255
       gateway 192.168.1.10
       bridge_ports eth0
       bridge_fd 9
       bridge_hello 2
       bridge_maxage 12
       bridge_stp off

Falls per DHCP-Server eine Adresse zugewiesen werden soll, ist diese Konfiguration anzuwenden:

auto eth0
iface eth0 inet manual
auto bri0
iface bri0 inet dhcp
       bridge_ports eth0
       bridge_fd 9
       bridge_hello 2
       bridge_maxage 12
       bridge_stp off

Anschließend ist der Netzwerkdienst neu zu starten.

Host ~$ sudo /etc/init.d/networking restart

Bei vielen Desktop-Distributionen erfolgt die Netzwerk-Konfiguration per Netzwerk-Manager. Für die hier dargestellte Konfiguration ist dieser zu entfernen. Unter Debian/Ubuntu ist dies mit einer Zeile erledigt.

Host ~$ sudo apt-get remove network-manager

Unter Fedora sind mehrere Schritte zur Deinstallation des Netzwerk-Managers notwendig:

Host ~$ su -
Host ~# yum remove NetworkManager
Host ~# chkconfig network on
Host ~# echo „DEVICE=eth0“ > /etc/sysconfig/network-scripts/ifcfg-eth0
Host ~# echo „ONBOOT=yes“ » /etc/sysconfig/network-scripts/ifcfg-eth0

Proxy-ARP-Bridging mit parprouted

Eine weitere Möglichkeit ist die Verwendung des Proxy-ARP-Bridging. Im Gegensatz zum Standard-Bridging erlaubt das Proxy-ARP-Bridging auch Verbindung über eine WLAN-Verbindung. Benötigt wird dazu das Paket parprouted.

Host ~$ sudo apt-get install parprouted

Um eine Bridge zwischen den Interfaces eth0 und tap0 anzulegen, dient der folgende Befehl.

Host ~$ sudo parprouted eth0 tap0

VDE Switch

VDE Switch (Virtual Distributed Ethernet) unterstützt den Aufbau aufwendiger virtueller Netzwerkverbindungen. Dazu ist das Paket vde2 notwendig.

Host ~$ sudo apt-get install vde2

Dieses Paket enthält das Programm vde_switch zum Anlegen von virtuellen Switches. Nach dessen Aufruf und einem weiteren Betätigen der Return-Taste erhält man einen Prompt. Der Befehl help zeigt alle Befehle an. Der Befehl shutdown beendet den virtuellen Switch.

Host ~$ sudo vde_switch
[Return]
vde$ help vde$ shutdown

Mit der Option –daemon wird vde_switch als Daemon gestartet. Die Option –sock definiert den Socket und mit der Option –mgmt wird die Verbindung zum Management des virtuellen Switches eingerichtet.

Host ~$ sudo vde_switch –daemon –sock /tmp/myswitch \
–mgmt /tmp/myvde.mgmt
Mit dem Programm unixterm lässt sich der Switch managen. Der vde-Befehl port/print listet die aktiven Ports auf. Mit der Tastenkombination [Strg]+[d] loggt man sich aus.

Host ~$ sudo unixterm /tmp/myvde.mgmt
vde$ port/print
0000 DATA END WITH '.'
.
1000 Success
vde$ [Strg]+[d]
Host ~$

Wurde QEMU mit der Unterstützung für VDE kompiliert, steht die Option -net vde zur Verfügung. Mit folgenden Befehl wird die Instanz mit dem angelegten virtuellen Switch verbunden.

Host ~$ qemu Platte.img -net nic -net vde,sock=/tmp/myswitch

Wurde QEMU ohne Unterstützung für VDE kompiliert, kann das im Paket vde2 enthaltene Programm vdeq verwendet werden. Es ist vor dem Befehl qemu einzugeben.

Host ~$ vdeq qemu Platte.img -net nic -net vde,sock=/tmp/myswitch

Zur Kontrolle lässt man sich die aktiven Ports des virtuellen Switches auflisten. In diesem Beispiel wurde eine virtuelle Maschine an den Switch angeschlossen.

Host ~$ sudo unixterm /tmp/myvde.mgmt
vde$ port/print
0000 DATA END WITH '.'
Port 0001 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
IN: pkts 75 bytes 7103
OUT: pkts 0 bytes 0
– endpoint ID 0003 module unix prog : QEMU user=knut PID=1740
SOCK=/tmp/myswitch/.01740-00000

Im Gast-System, hier Linux, wird eine IP-Adresse konfiguriert.

Gast ~# ifconfig eth0 10.0.0.16 netmask 255.255.255.0 up

Ein virtueller Router kann zusätzlich mit slirpvde eingerichtet werden. slirpvde ist auch Bestandteil des Paketes vde2 und benötigt keine Administrationsrechte. Falls noch nicht geschehen, ist zuvor ein virtueller Switch anzulegen.

Host ~$ sudo vde_switch –daemon –sock /tmp/myswitch \
–mgmt /tmp/myvde.mgmt

Jetzt wird slirpvde aufgerufen. Mit der Option -dhcp wird ein DHCP-Server aktiviert. Damit erhalten die virtuellen Maschinen am virtuellen Switch einen Zugang nach außen.

Host ~$ sudo slirpvde –daemon –sock /tmp/myswitch -dhcp

Es kann eine virtuelle Maschine gestartet und an den virtuellen Switch angeschlossen werden. Host ~$ qemu Platte.img -net nic -net vde,sock=/tmp/myswitch

Soll eine zweite Instanz an dem virtuellen Switch angeschlossen werden, ist sicherzustellen, dass diese ein andere Mac-Adresse verwendet.

Host ~$ qemu Platte-zwei.img \
-net nic,macaddr=00:80:AD:3B:3E:4F -net vde,sock=/tmp/myswitch

Zur Kontrolle listet man die aktiven Ports des virtuellen Switches auf.

Host ~$ sudo unixterm /tmp/myvde.mgmt
vde$ port/print

Hier die vollständige Syntax für die Option -net vde.

-net vde[,vlan=n][,name=name][,sock=socketpath] \ [,port=n][,group=groupname][,mode=octalmode]

Das VLAN n wird mit dem Port n eines VDE Switches verbunden. Dieser virtuelle Switch ist auf dem Host-System installiert und wartet auf eingehende Verbindungen auf dem Socket socketpath. Mit der Gruppe groupname und dem Modus octalmode ist es möglich, die Eigentümer- und Zugriffsrechte anzupassen.

netdev

Mit QEMU 0.12.0 wurde die Option -netdev zur Definition von virtuellen Netzwerken eingeführt. Je nach Art des virtuellen Netzwerkes (user, tap, vde, socket) sind bestimmte Parameter anzuwenden. Dabei muss mit id eine Zeichenkette zur eindeutigen Identifizierung zugeordnet werden. In diesem Beispiel wird mit der Option -net nic eine Netzwerkkarte (e1000) und mit -netdev der User Mode Network Stack definiert.

Host ~$ qemu Platte.img \
-net nic,model=e1000,netdev=net0 -netdev user,id=net0

Die Definition der Netzwerkkarte kann auch mit der Option -device erfolgen.

Host ~$ qemu Platte.img \
-device e1000,netdev=net0 -netdev user,id=net0

Hier die vollständige Syntax von -netdev:

-netdev [user|tap|vde|socket],id=str[,option][,option][,…]

Im QEMU-Monitor fügt der Befehl netdev_add ein Netzwerk-Device zur Laufzeit der virtuellen Maschine hinzu. Die Optionen entsprechen denen der Option -netdev.

(qemu) netdev_add user,id=net0

Ein Netzwerk-Device wird mit dem Befehl netdev_del entfernt. Dazu ist die id des Devices anzugeben.

(qemu) netdev_del net0

Löscht ein Netzwerk-Device.

virtuelle_netzwerke_konfigurieren.txt · Zuletzt geändert: von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki