Ubuntu-KVM-Host konfigurieren (Root-Server)

Gestern habe ich meinen langjährigen Root-Server durch ein neues Modell ersetzt — jetzt standardmäßig mit 16 GByte RAM anstelle von nur 2! Ein wenig trickreich ist allerdings die Netzwerkkonfiguration, damit alle zusätzlichen IP-Adressen für KVM genutzt werden können.

Zusammen mit dem Root-Server habe ich vier IP-Adressen gemietet. (Diese und alle weiteren Konfigurationsdaten haben natürlich nur Beispielcharakter und stimmen nicht mit meiner tatsächlichen Konfiguration überein!)

Root-Server: 211.222.233.82   (Gateway: 211.222.233.65, Mask: 255.255.255.224)
Zusatz-IPs: 211.222.233.90-93 (Gateway: 211.222.233.65, Mask: 255.255.255.224)

Ziel der weiteren Konfiguration ist es, jede der vier Zusatz-IPs für eine virtuelle Maschine zu verwenden. Bei einer »gewöhnlichen« Brücken-Konfiguration für ein ganzes Netzwerksegment gehen zwei Adressen als Netzwerk- und Gateway-Adresse verloren. Bei einem großen Netzwerksegment ist das akzeptabel, aber je kleiner der verfügbare IP-Adressraum ist, desto mehr lohnt der sparsame Umgang mit den kostbaren IP4-Adressen!

Hinweis: Diese Anleitung gilt für einen Root-Server von Hetzner, sollte in leicht abgewandelter Form aber auch für andere Hosting-Provider gelten.

Host-Konfiguration (Ubuntu 12.04)

Anfänglich sieht die Netzwerkkonfiguration auf dem Root-Server mit Ubuntu 12.04 so aus:

# /etc/network/interfaces
auto lo
iface lo inet loopback

auto  eth0
iface eth0 inet static
  address     211.222.233.82
  broadcast   211.222.233.95
  netmask     255.255.255.224
  gateway     211.222.233.65
  # default route to access subnet
  up route add -net 211.222.233.64 netmask 255.255.255.224 gw 211.222.233.65 eth0

Nun geht es darum, die Schnittstelle eth0 über die Brücke br0 anzusprechen. Dazu ersetzen Sie in der Grundkonfiguration dreimal eth0 durch br0. Außerdem kommen diverse Bridge-Parameter hinzu. Der Clou an der Konfiguration sind aber die Routing-Kommandos für die einzelnen Zusatz-IP-Adressen.

# /etc/network/interfaces auf dem Root-Server = KVM-Host
auto lo
iface lo inet loopback

auto  br0
iface br0 inet static
  address     211.222.233.82
  broadcast   211.222.233.95
  netmask     255.255.255.224
  gateway     211.222.233.65
  # Brücken-Parameter
  bridge_ports   eth0
  bridge_stp     off
  bridge_fd      0
  bridge_maxwait 0
  # zusätzliche IPs für KVM
  up route add -host 211.222.233.90 dev br0
  up route add -host 211.222.233.91 dev br0
  up route add -host 211.222.233.92 dev br0
  up route add -host 211.222.233.93 dev br0
  # Default-Route für das Subnetz
  up route add -net 211.222.233.64 netmask 255.255.255.224 gw 211.222.233.65 br0

Damit die Änderungen wirksam werden, müssen Sie /etc/init.d/networking restart ausführen oder den Root-Rechner neu starten. Passen Sie auf, dass Sie in der Konfiguration keine Fehler machen — sonst ist Ihr Root-Server im Netzwerk nicht mehr erreichbar und Sie müssen die Reparaturarbeiten in einem Rescue-System durchführen!

Außerdem müssen auf dem Root-Server noch zwei Kernel-Parameter verändert werden: Zum einen muss das IP-Forwarding aktiviert werden, zum anderen sollte für die Brücke br0 das Versenden von ICMP-Redirect-Nachrichten deaktiviert werden. Dazu tragen Sie in die Datei /etc/sysctl.conf die folgenden zwei Zeilen ein und aktivieren die Änderungen mit dem Kommando sysctl -p.

# in /etc/sysctl.conf
...
net.ipv4.ip_forward=1
net.ipv4.conf.br0.send_redirects=0
net.ipv4.conf.all.send_redirects=0

Kurz noch eine Erklärung zu send_redirects=0: Standardmäßig glaubt der KVM-Host bei der Weiterleitung von IP-Paketen der KVM-Gäste, dass die virtuellen Maschinen ihre IP-Pakete direkt an das Gateway des KVM-Hosts leiten könnten (also in diesem Beispiel an 211.222.233.65). Deswegen sendet der KVM-Host an die KVM-Gäste ICMP-Redirect-Nachrichten. Tatsächlich ist der Zwischenstopp über dem KVM-Host aber unumgänglich, weil die MAC-Adressen der virtuellen Maschinen den Routern des Hosting-Providern nicht bekannt sind und die Pakete deswegen dort verworfen würden. send_redirects=0 verhindert das Versenden der irreführenden ICMP-Redirect-Nachrichten.

Update 5.9.2012: Eigentlich sollte net.ipv4.conf.br0.send_redirects=0 ausreichen, es hat sich aber gezeigt, dass die ping-redirects erst verschwinden, wenn send_redirects für alle Schnittstellen auf 0 gestellt wird. Also: net.ipv4.conf.all.send_redirects=0

Gast-Konfiguration in der virtuellen Maschine (Debian/Ubuntu)

Die statische Netzwerkkonfiguration in einer virtuellen Debian- oder Ubuntu-Maschine sieht so aus. Die einzige Besonderheit ist das Schlüsselwort pointopoint. Es bewirkt, dass die eth0-Schnittstelle als direkter Link (als direkte Route) zum KVM-Host genutzt werden soll.

# /etc/network/interfaces im KVM-Gast (also in der virtuellen Maschine)
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
  address         211.222.233.90
  netmask         255.255.255.224
  gateway         211.222.233.82
  pointopoint     211.222.233.82
  dns-nameservers 213.133.98.98 213.133.99.99 213.133.100.100

Gast-Konfiguration in der virtuellen Maschine (Fedora/RHEL/CentOS)

Wenn es sich bei der virtuellen Maschine um Fedora, RHEL, CentOS etc. handelt, verteilt sich die Konfiguration über drei Dateien. Die einzige Abweichung von einer gewöhnlichen statischen Netzwerkkonfiguration ist die Datei route-eth0, die für das Routing zum KVM-Host verantwortlich ist.

# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="52:54:00:11:22:33"
NM_CONTROLLED="no"
ONBOOT="yes"
IPADDR=211.222.233.91
NETMASK=255.255.255.224
GATEWAY=211.222.233.82
# /etc/sysconfig/network-scripts/route-eth0
211.222.233.82 dev eth0 scope link
default via 211.222.233.82 
# /etc/resolv.conf
nameserver 213.133.98.98
nameserver 213.133.99.99
nameserver 213.133.100.100

Quellen