April 27, 2013

Hetzner-libvirt-IPv6

Hetzner-libvirt-IPv6

Einleitung

In diesem Artikel befasse ich mich mit der Einrichtung von libvirt und IPv6 auf einem Rootserver meines Hosters Hetzner. Seit kurzem hat Hetzner sein IPv6 Netzrouting umgestellt, was vieles bei der Einrichtung vereinfacht hat. Im Laufe der nächsten Zeilen werden wir ein IPv6 Netzwerk in libvirt definieren und unseren Maschinen zur Verfügung stellen. Ausserdem gehe ich auf einige der Schwierigkeiten ein, denen man im Jahre 2013 eigentlich nicht mehr begegnen sollte, schließlich ist IPv6 seit 1999 im Regelbetrieb.

Libvirt

Beispielansicht der verfügbaren Subnetze im Hetzner Robot
Beispielansicht der verfügbaren Subnetze im Hetzner Robot

Im Hetzner Robot kann man sehen, welche Netze momentan einem Server zugeordnet sind. Neu bestellte Rootserver erhalten bei Hetzner automatisch ein 64er IPv6 Subnetz, das sind genug Adressen für mehr als 18000000000000000000 Netzteilnehmer.
Zum Spaß könnten Sie die Adresse eines Hosts jede Mikrosekunde ändern und hätten nach 570000 Jahren noch immer nicht alle Adressen verbraucht.
Inwiefern diese Adressverschwendung sinnvoll ist kann der geneigte Leser an dieser Stelle gerne für sich selbst beantworten. Fakt ist, dass wir auf Hosts, die Dienste im Internet anbieten sollen, mindestens eine feste Adresse benötigen, die auch über DNS auflösbar ist.

Netzdefinition.xml

Erstellen Sie die Datei „IPv6_Network.xml“ mit folgendem Inhalt, ersetzen Sie dabei in jedem Fall den Namen sowie die IPv6-Adresse gegen eine gültige Adresse ihres Netzes:

<network>
  <name>IPv6_Network</name>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <ip address='192.168.1.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.1.50' end='192.168.1.150' />
    </dhcp>
  </ip>
  <ip family='ipv6' address='2a01:4f8:a0:6ffe::2' prefix='64'>
  </ip>
</network>

Sie fragen sich nun eventuell. warum ich den Modus „Network Address Translation“ gewählt habe und ob das notwendig ist. Momentan ist das wirklich notwendig, es sei denn, sie sind der glückliche Besitzer mehrerer IPv4 Adressen im Hetzner Netzwerk (z.B. gekauftes v4-Subnetz), dann wollen Sie den Hosts eine dieser Adressen zuordnen und Natting ist unnötig. Ansonsten erfahren Sie unter „Fallstricke und Teergruben„, warum Sie NAT betreiben wollen.

Definieren Sie nun das Netzwerk über das virsh Kommando

virsh net-define /pfad/zur/IPv6_Network.xml

Lassen Sie es automatisch beim Start des Hostsystems starten

virsh net-autostart IPv6_Network

Starten Sie das Netz nun

virsh net-start IPv6_Network

Fertig!

Fallstricke und Teergruben

Die folgenden Zeilen schreibe ich in Trauer und Wut, weil diese Zeilen im Jahre 2013, also fast 15 Jahre nach der offiziellen Einführung von IPv6, geschrieben werden müssen. Meine Hoffnungen, ein reines v6 Netz betreiben zu können, wurden bereits nach kurzer Zeit zerstört. Dabei beziehe ich mich gar nicht darauf, dass Millionen von Clientsystemen noch nicht über IPv6 ans Internet angeschlossen sind, sondern eher auf Dienste, die IPv6 nicht verstehen oder einfach nicht v6-ready gemacht werden.

So ist es nicht möglich Ubuntus Security Repositories über v6 anzusprechen, in diversen Systemen wie z.B. owncloud hagelt es Fehlermeldungen im Admin Interface, weil die Gegenstellen, die hier gepulled werden, ebenfalls nicht per v6 zu erreichen sind. Rhodecode, ein ansonsten schickes Interface zu Mercurial Repositories, bietet gar nicht erst die Möglichkeit sich an eine v6 Adresse zu binden. Kommentar des Entwicklers: Einen Apache Server davorschalten!

Für den Weg von Ihrer virtuellen Maschine zu Netzdiensten ist es daher angebracht, dass der Gast über NAT mit IPv4 Systemen kommunizieren kann. Ja, das ist traurig!

Für die Richtung vom Client zu Ihrem Gast muss ebenfalls bedacht werden, dass auch die Mehrzahl der Provider bis heute nicht in der Lage sind, Kunden über einen Dualstack anzubinden. Ja, auch das ist traurig!

Die derzeit beste Möglichkeit ist es tatsächlich, auf dem Host System einen Apache als Proxy zu verwenden und über VirtualHosts entsprechend zu routen, sollte man mehrere Domains auf unterschiedlichen virtuellen Maschinen nutzen.

Eine andere Möglichkeit ist, NAT zu verwenden und auf die privaten IP-Adressen umzuleiten, oder man bedient sich Tools wie socat (Anleitung). Dies ist natürlich unschön, wenn man gleiche Dienste auf unterschiedlichen virtuellen Maschinen anbieten will, denn wird ein Port an eine bestimmte Adresse weitergeleitet kann man diesen Port natürlich nicht mehr für die andere Adresse verwenden.

Fazit

IPv6 bietet zunächst fast unbegrenzte Resourcen, stellt aber auch im Jahre 2013 keine Alternative zum etablierten IPv4 dar. Auch wenn viele Provider wie UnityMedia bei neu abgeschlossenen Verträgen mittlerweile einen Dualstack (lite) einrichtet, das Hauptproblem sind noch immer ignorante Anbieter von Diensten, die keinen Grund darin sehen, diese Dienste IPv6-ready zu machen. Sehr traurig!