OpenVPN und IPv6 – Ein harter Kampf!

OpenVPN und IPv6 – Der Kampf beginnt!

Da IPv6 immer mehr Gewicht gewinnt, wollte ich mich bereits für die Zukunft vorbereiten und meine Seiten unter IPv6 erreichbar machen. Kann ja nicht so schlimm werden, dachte ich, IPv6 ist ja nun wirklich nichts neues mehr und nachdem ich S4U gänzlich den Rücken gekehrt habe, habe ich jetzt auch viel mehr Möglichkeiten 😉 

Also war meine erste Frage – Wo fange ich an? Wieso? Wenn ich eins umstelle dann muss ich auch den Rest umstellen da MySQL, Webserver Monitoring, API’s Proxy usw. dann alle IPv6 können müssen damit es auch alles funktioniert.

Aber ich schweife ab. Wir waren bei OpenVPN und IPv6. Damit habe ich auch angefangen, gestern…. (Eigentlich begann ich mit Proxmox aber das kommt später 😉 , da ich weiß dass mein Kollege von Layers Gedanken damit gerade viel Anfangen kann 🙂 )

Mein OpenVPN Setup mit IPv6

Ich wollte unbedingt ein privates IPv6 Subnetz haben für die ganzen OpenVPN Geschichten da ich so zum einen von außen nicht überall erreichbar bin und ich wenig Lust hatte 18 Millionen IPv6 Adressen manuell zu erstellen und ein geroutetes Subnetz gibt es nur gegen Aufpreis. Außerdem ist so ein wenig mehr Kontrolle gegeben und man kann mit den netten iptables Regeln nicht ganz so schnell durcheinander kommen.

Also habe ich mir das fd8b:75bb:54e8:9a87::/64 ausgesucht. Das ist für private Zwecke Analog den 192.168.0.0/24er Netzen. Der OpenVPN Server hat ein 64er public Subnetz wo er für den VPN Dienst eine Public IPv6 nutzt. 

Ich gehe hier also davon aus, dass mindestens eine public IPv6 auf dem Server bereits konfiguriert ist und einer Netzwerkkarte zugeordnet ist und das OpenVPN bereits mit einer IPv4 Konfiguration läuft (Falls nicht ist hier eine Anleitung) und der Kernel natürlich IPv6 kann.

 

Beginnen wir also.

Die OpenVPN server.conf anpassen

Hier muss gar nicht so viel angepasst werden.

Fügt einfach diese Zeilen hinzu und ersetzt ggf. mit eurem Subnetz 🙂

Die Datei liegt Default unter /etc/openvpn

server-ipv6 fd8b:75bb:54e8:9a87::/64 # Das IPv6 Subnetz
push "route-ipv6 fd8b:75bb:54e8:9a87::/64" # Route vom OpenVPN Subnetz
push "dhcp6-option DNS fd8b:75bb:54e8:9a87::1" # OpenVPN private IP und gleichzeitig der DNS
tun-ipv6 # gehört eigentlich an den Anfang der OpenVPN config
proto udp6 # gehört auch an den Anfang
client-config-dir ccd # falls nicht vorhanden bislang 

So blöd es klingt. In der server.conf war es das bereits 🙂

 

Als Nächstes aktivieren wir das IPv6 forwarding

sysctl -w net.ipv6.conf.all.forwarding=1

Dauerhaft sollte man in der /etc/sysctl.conf folgendes eintragen

net.ipv6.conf.all.forwarding=1

 

Ein paar iPtables Regeln wären auch cool fürs Maskieren

ip6tables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT
ip6tables -A INPUT -i tun+ -j ACCEPT 
ip6tables -A FORWARD -i tun+ -j ACCEPT
ip6tables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -t nat -A POSTROUTING -s fd8b:75bb:54e8:9a87::/64 -o eth0 -j MASQUERADE

Müssen natürlich an eure Ports, Netzwerkkarten und euer Subnetz angepasst werden. Eh klar 🙂

Wie man diese Regeln permanent macht sollte jeder wissen. Falls nicht würde ich an dieser Stelle ernsthaft überlegen den Server zu kündigen. Ihr könnt aber auch gern nachfragen.

Ein Hinweis aber am Rande, solltet Ihr einen virtuellen Server haben der auf Openvz Basis läuft dann könnt Ihr euch das sparen denn der Kernel der aktuell bei OpenVZ eingesetzt wird ist zu alt für IPv6 NAT. Ihr braucht entweder einen richtigen dedicated Root, KVM oder LXC (Alles was den Kernel 3.2 und höher benutzt funktioniert)

Sollte euer IPv6 Netz public sein dann braucht Ihr natürlich keinerlei NAT

Die Client config

Klar, die sollte nicht fehlen.

Fügt folgende Zeilen in eure Client config ein

tun-ipv6
proto udp6
remote 2a05:8b81:1000:14e::d7b9 1194 # Hier sollte unbedingt eure public IPv6 stehen

Das war es auch schon fast. Sollte man auf einem Windows Client den gesamten IPv4 und IPv6 durch den Tunnel jagen wollen, so muss nur die „redirect-gateway mit dem IPv6 Flag erweitert werden

redirect-gateway ipv6

Wichtig, wirklich nur das IPv6 ergänzen und nicht die Zeile zusätzlich einfügen, da der String  „redirect-gateway“ nur einmal vorkommen darf.

Statische IP vergeben da keine automatische Vergabe stattfindet

Eine Kleinigkeit die unbedingt gemacht werden muss. In eurem „ccd“ Verzeichnis, welches in der server conf angegeben wird, muss für jeden Client, der eine IPv6 erhalten soll, noch zusätzlich folgender Eintrag hinterlegt werden:

ifconfig-ipv6-push fd8b:75bb:54e8:9a87::2/64 fd8b:75bb:54e8:9a87::1/64

Die erste IPv6 ist dabei eine statische IPv6 für den Client und die zweite IPv6 das Gateway.

Einen Nachteil hat das ganze. Man muss alle Routen mittels up Script selbst anlegen. OpenVPN kann das bei IPv6 leider noch nicht.

Windows Clients müssen, zum Zeitpunkt des Beitrags, mindestens den OpenVPN-2.4-alpha2 Client haben damit es überhaupt funktioniert.

Download OpenVPN Client 64 2.4 Alpha2 64 Bit

Download OpenVPN Client 64 2.4 Alpha2 32 Bit

Das sind derzeit die aktuellsten Versionen. Updates können hier runtergeladen werden.

 

Und nun Willkommen in der IPv6 Welt!

Wenn man sich das alles mühsam zusammensuchen muss und nichts irgendwo richtig dokumentiert ist, kann man damit ohne Probleme eine ganze Nacht und den folgenden Vormittag verbringen. Nicht zu vergessen der Abend zuvor 🙂 

Hoffentlich spart Ihr euch ein paar Stunden!

Share it!Share on FacebookEmail this to someoneShare on Google+Tweet about this on Twitter
9 Kommentare

    Patrick

    Hallo,

    vielen dank für die super Beschreibung!
    Es funktioniert auf anhieb und ich habe danach länger gesucht, jetzt versuche ich das ganze über tcp6 zum laufen zu bringen, nur leider funktioniert dies nicht so einfach.

    Würde mich über eine Antwort dazu sehr freuen, danke schon mal.

    Gruss Patrick

      Andre

      Hi Patrick,
      freut mich wenn es problemlos ging.

      das ganze via TCP ist eigentlich relativ easy umzusetzen. Ich rate jedoch von TCP Verbindungen generell ab.
      Der Ansatz war schon richtig, einfach ein tcp6 anstelle des udp6 einsetzen und das natürlich am Server und client.
      Dann sollte die Verbindung auch funktionieren.

      Welche Fehlermeldung / Logs kommen denn?

        Patrick

        der Client schreibt folgendes:

        „TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)“

        Leider benötige ich das ganze in TCP da ich einen Portmapper verwenden möchte um über das Handy eine verbindung aufbauen zu können.

        Die Server Logs zeigen nichts.
        Danke

        Gruss

        Patrick

        der Client schreibt folgendes:

        „TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)“

        Leider benötige ich das ganze in TCP da ich einen Portmapper verwenden möchte um über das Handy eine verbindung aufbauen zu können.

        ich vermute es liegt an den IP6Tables

        Die Server Logs zeigen nichts.
        Danke

        Gruss

          Andre

          Hmm… wie sieht denn das gesamte Log aus?
          Von dem Ausschnitt würde ich sagen dein Client kann entweder den Host nicht auflösen oder wird tatsächlich via iPtables geblockt.

          Kannst du mal nen normales TCP probieren ohne die v6? Klappt diese Verbindung? Bekommst du da eine IPv6 im Client zugewiesen?

            Patrick

            Also mittlerweile habe ich es geschafft es richtig einzurichten. Ich war auf einem Port welcher belegt war durch ein anderes Programm. Danke für die Hilfe, ich werde den Artikel gerne mal weitersagen auf meiner Website.

            Andre

            Hi Patrick,

            okay dann war es kein Fehler in der Anleitung 🙂
            Ports sollten natürlich frei sein, klar.
            Freut mich wenn ich helfen konnte und Danke fürs sharen 😉

            LG
            André

    Thomas Schäfer

    Pfui NAT,
    Das ist nicht Teil der IPv6-Welt, sondern der Hölle.
    Aber schön zu wissen, dass auch teuflische Dinge funktionieren.

      Andre

      Durchaus aber Maskieren ist nun mal notwendig sofern man ein privates IPv6 Netz verwendet. Andernfalls gibts keine Verbindung ins Internet…
      Ein Public IPv6 Netz braucht das logischerweise nicht 😉
      Habe den Hinweis aber ergänzt. Danke

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*
*