HowTo: online.net´s IPv6 via dhclient6 auf Proxmox einrichten

Ich schreibe diese Anleitung aus aktuellem Anlass, ich entschloss mich IPv6 auf meiner Proxmox Instanz einzurichten und plante etwa 4 Stunden ein nachdem ich die ersten Anleitungen gesichtet hatte, daraus wurden jetzt 7 Tage.

Um euch diese mühe zu ersparen, habe ich mich entschieden meinen ersten Beitrag hier in der IT-Kitchen zu verfassen.

Was wir erreichen möchten:

  1. Dualstack Betrieb von IPv4 und IPv6 auf dem Proxmox Host.
  2. Dualstack Betrieb von IPv4 und IPv6 auf KVM´s und LXC Containern.
  3. IPv4 oder IPv6 only Betrieb von KVM´s oder LXC Containern.

Hinweis

Solltet ihr bereits andere Tutorials probiert haben, so entfernt bitte alle Änderungen die ihr durch diese gemacht habt.

Diese Anleitung bezieht sich auf ein Proxmox Host mit Kernel 4.4.21-1-pve, gehostet bei online.net und mit ihrer Standard Konfiguration.
Das Standard Netzwerk Interface ist vmbr0 das auf eth0 bridged.

Wir verwenden hierbei den von online.net zugewiesenen /48 Block bzw. den davon abgeleiteten /56

In dieser Anleitung verwenden wir folgenden IPv6-Block:

2001:bc8:2782:100::/56

Noch bevor wir am Host arbeiten können müssen wir uns, falls noch nicht geschehen ein IPv6 Block kostenfrei ordern und davon ein /56 Subnet. Wie? Hierzu verweise ich auf das online.net Wiki.

1. Einrichtung des Proxmox Hosts

  1. Zunächst prüfen wir ob IPv6 aktiviert ist und aktivieren es ggf.

     nano /etc/modprobe.d/local.conf
    

Hier muss folgender Wert stehen:

    options ipv6 disable=0
  1. Jetzt folgen einige Konfigrationen zwecks Forwarding und Router advertisement. Diese Einstellungen fügt ihr am Ende der

     /etc/sysctl.conf
    

ein:

     # IPv6
     net.ipv6.conf.all.forwarding=1
     # ONLINE IPv6
     net.ipv6.conf.all.accept_ra = 2
     net.ipv6.conf.all.accept_ra_defrtr = 1
     net.ipv6.conf.all.accept_ra_from_local = 0
     net.ipv6.conf.all.accept_ra_min_hop_limit = 1
     net.ipv6.conf.all.accept_ra_mtu = 1
     net.ipv6.conf.all.accept_ra_pinfo = 1
     net.ipv6.conf.all.accept_ra_rt_info_max_plen = 0
     net.ipv6.conf.all.accept_ra_rtr_pref = 1
     #My stuff:
     net.ipv6.bindv6only = 1

Da ich es bei der Fehlersuche, in den Tutorials die ich zu dem Thema immer die vollständigen Dateiinhalte vermisst habe werde ich diese nun hier veröffentlichen:
pastebin.com

  1. Nun müssen wir die Konfiguration von dhclient vornehmen. Hierzu müssen wir folgende Datei erstellen:

     /etc/dhcp/dhclient6.conf
    

Folgendes müsst ihr dort eintragen wobei DUID, mit der DUID eures /56 Subnetzes zu ersetzen ist, diese findet ihr unter Network in der online.net Console.

    interface "vmbr0" {
       send dhcp6.client-id DUID;
    }
  1. Konfigurations Test
    Zunächst solltet ihr euren Proxmox Host einmal neustarten damit alle Änderungen einmal sauber geladen werden.

Nach dem Neustart führen wir manuell einmal alle Befehle aus die notwendig sind um IPv6 auf dem Host zu erhalten.

    dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v vmbr0

    /sbin/ifconfig vmbr0 inet6 add 2001:bc8:2782:100::/56

Selbstverständlich ist bei diesem Befehl die IP Adresse auf die eures /56 Subnetz anzupassen. Jetzt sollten wir in der Lage sein via IPv6 zu kommunizieren. Dies testen wir folgendermaßen:

    ping6 ipv6.google.com

Sollte der Ping nicht erfolgreich sein, solltest du die bisher vorgenommenen Einstellungen überprüfen, eventuell ist irgendwo ein Tippfehler, ich hatte bspw. ein Leerzeichen vor meiner DUID und es dauerte ewig dies zu bemerken.

  1. Finale Konfiguration des Hosts
    Jetzt da wir uns sicher sind das unsere bisherigen Konfigurationen korrekt sind, kümmern wir uns darum das diese auch automatisch beim Systemstart angewendet werden, desweiteren fügen wir nun alle Interfaces hinzu die für die VMs benötigt werden.

Zunächst fügen wir dem Interface 'vmbr0' eine Konfiguration für IPv6 hinzu. Dies geschieht wie folgt:

    nano /etc/network/interfaces

Dort fügen wir unter der Konfiguration von 'iface vmbr0 inet static' folgenden eintrag hinzu:

    iface vmbr0 inet6 auto
    
    auto vmbr1
    iface vmbr1 inet6 static
        address  2001:bc8:2782:100:1::
        netmask  64
        bridge_ports none
        bridge_stp off
        bridge_fd 0

Aufgrund eines Bugs der Kernel 4.4.13-1-pve und scheinbar auch aufwärts, muss vmbr0 auf auto eingestellt werden und mit einem Workaround via Script konfiguriert werden nachdem alle Systemkomponenten geladen haben.
Das zweite Interface vmbr1 nutzen wir einzig und alleine für IPv6. Hierbei müsst ihr natürlich die Adresse an euer /56 Subnetz anpassen, 1c:1ab1:: könntet ihr lassen oder anpassen, dies ist rein zufällig gewählt und muss nur innerhalb von **:0000:0000:: - :ffff:ffff:: liegen.

Meine vollständige /etc/network/interfaces

Um dhclient auszuführen und dem Interface vmbr0 zur richtigen Zeit eine Adresse zu geben, erstellen wir ein Script "/etc/init.d/ipv6" mit folgendem Inhalt, die IPv6 Adressen müssen natürlich auf euer /56 Subnetz angepasst werden. Dieses machen wir dann zunächst ausfürbar und fügen es dann mit den passenden Parametern zum Autostart hinzu.

    chmod +x /etc/init.d/ipv6
    update-rc.d ipv6 defaults 99

Dies sollten jetzt alle notwendigen Konfigurationen am Host gewesen sein.

Jetzt sollte der Host noch einmal neugestartet werden, nach dem Neustart sollte der Output von ifconfig -a in etwa so aussehen:

http://pastebin.com/Wmt35tYZ

Wichtig ist hierbei das vmbr0 zwei inet6 einträge besitzt einmal mit Scope: Global und einmal mit Scope: Link

ping6 ipv6.google.com

Sollte dies nicht der Fall sein, dann spring zum Ende der Anleitung dort gibt es noch Tipps zur Fehlersuche.

Konfiguration einer VM

IPv4 + IPv6:

Zunächst müssen wir der VM zwei Netzwerkkarten hinzufügen, eine sollte ja Standard sein.
net0/eth0 nutzen wir um die IPv4 Adresse mit Hilfe der MAC Adresse von online.net zu beziehen deshalb muss dieses Interface auf vmbr0 verweisen damit diese MAC Adresse auch erkannt werden kann.

net1/eth1 wird benutzt um der VM IPv6 zu geben, wir nutzen hierzu getrennte Interfaces da wir bei IPv6 Only virtuelle MAC Adressen nutzen die online.net nicht bekannt sind und somit verworfen werden würden oder eventuell dazu führen das der Server Port (Netzwerkinterface) heruntergefahren wird, dies umgehen wir durch das Routing auf dem Host. Deshalb muss net1 auf vmbr1 verweisen.

Auf dem Gast also in der VM müssen wir noch folgende einstellungen in den Interfaces vornehmen.

auto eth1
iface eth1 inet6 static
address 2001:bc8:2782:100:1::1
netmask 112
gateway 2001:bc8:2782:100::
up ip -6 route add 2001:bc8:2782:100::/56 dev eth1
up ip -6 route add default via 2001:bc8:2782:100::
down ip -6 route del default via 2001:bc8:2782:100::
down ip -6 route del 2001:bc8:2782:100::/56 dev eth1

Diese Konfiguration konnte ich auch in Verbindung mit PfSense erfolgreich ans laufen bringen, desweiteren wird hierdurch die Limitierung von online.net umgangen, da wir das Routing des gesamten /56 übernehmen und somit alle darin enthaltenen /64 netze vergeben können und nicht nur die die im online.net Panel angelegt wurden.