Raspberry Pi VPN – Teil 13: IPv4 VPN mit (trotz) DS-Lite

Raspberry Pi VPN

Wiederholt wurde von Lesern gewünscht, einen VPN-Tunnel von einem IPv4-Client (Smartphone) in ein DS-Lite-Heimnetz aufbauen zu können. Ein verständlicher Wunsch, wenn man bedenkt, dass Heimnetzanbindungen (fast) nur noch als DS-Lite Version zu bekommen sind, aber umgekehrt, die Mobilfunknetze und WLAN-Hotspots noch häufig nur auf IPv4 setzen. Mit klassischen IP lässt sich ein VPN zwischen IPv4 und IPv6 nicht realisieren, aber Gastautor Stefan hat eine Möglichkeit der Übersetzung von IPv4 auf IPv6 gefunden, die mit socat auf einem gemietetem vServer eingerichtet werden kann. Gleichzeitig stellt Stefan mit WireGuard eine Alternative zu OpenVPN vor. Ich freue mich, Stefans Artikel hier in meinem Blog präsentieren zu können und bedanke mich gleichzeitig für die Mühe, die er sich damit gemacht hat.

Der nachfolgende Artikel stammt von Gastautor Stefan:

Ihr habt einen DS-Lite-Anschluss, euer VPN-Server läuft einwandfrei und ihr wollt lediglich wissen, wie ihr euer Heimnetzwerk für IPv4 erreichbar machen könnt? Dann könnt ihr direkt zum Abschnitt „Mit vServer und socat ins Heimnetzwerk“ springen.

Interessierst ihr euch hingegen für einen alternativen Weg zur Einrichtung eines VPN-Servers oder seid ihr auf der Suche nach zusätzlichen Denkanstößen? In jedem Fall wünsche ich viel Spaß beim Lesen und Ausprobieren.

WireGuard als Alternative zu OpenVPN

Um das Frustpotential möglichst gering zu halten habe ich versucht die nach meiner persönlichen Einschätzung bestehenden Voraussetzungen aufzulisten damit ihr etwaige Probleme besser eingrenzen könnt.

VORAUSSETZUNGEN:

  1. Raspberry Pi bootet einwandfrei
  2. Zugriff (lokal, vorzugsweise aber per SSH) ist vorhanden
  3. Privacy Extensions sind deaktiviert
  4. Raspberry Pi hat eine globale IPv6-Adresse
  5. Dynamische IPv6-IP-Adresse ist eingerichtet
  6. Raspberry Pi ist erreichbar und Port 1194/UDP ist geöffnet.

PRÜFE:

(1) und (2) gehören zur Grund-/Ersteinrichtung.
(3) cat /etc/dhcpcd.conf | grep slaac

cat /etc/dhcpcd.conf | grep slaac

„slaac private“ ist auskommentiert oder inexistent – „slaac hwaddr“ ist das was wir wollen.

(4) ifconfig

ifconfig
Eine globale IPv6-Adresse ist vorhanden.

(5) Verweist eure dynamische IP-Adresse auf die globale IPv6-Adresse?

Ipv6 Address
Siehe zwecks Abgleich Punkt (4)

(6) Ruft http://www.ipv6now.com.au/pingme.php und tragt (5) ein:

Pingtest

Gab es Probleme? Dann schaut euch nochmal https://blog.helmutkarger.de/raspberry-pi-vpn-teil-5-vorarbeiten-fuer-ein-vpn-unter-ipv6/ an oder fragt im Blog nach.

Wenn alles geklappt hat – super! Installiert Pi-hole mit dem Befehl

curl -sSL https://install.pi-hole.net | bash

Hierbei könnt ihr den Schritten aus https://blog.helmutkarger.de/raspberry-pi-vpn-teil-9-installation-pi-hole/ folgen bis zum Abschluss der Installation. Empfehlenswert ist die Änderung des Admin-Passwortes. Darüber hinaus sind keine weiteren Nacharbeiten notwendig!

Das liegt daran, dass wir jetzt PiVPN installieren – PiVPN erkennt das Vorhandensein von Pi-hole und bietet die Einbindung an. Bestätigt einfach immer die Vorgaben bis ihr zur Wahl des VPN kommt:

WireGuard

Selbstverständlich ist euch die Wahl überlassen aber probiert doch mal WireGuard statt OpenVPN aus. Die (vermeintlichen) Vorteile von WireGuard werden bereits in der Auswahlmaske angepriesen.

Hinzu kommt, dass ihr bei WireGuard keine händischen Nacharbeiten vornehmen müsst. Bei Interesse findet ihr weitere Infos zu WireGuard auf https://www.thomas-krenn.com/de/wiki/WireGuard_Grundlagen.

Als Port schlage ich euch 1194 vor da ihr diesen Port vermutlich bereits für euer Raspberry Pi gemäß https://blog.helmutkarger.de/raspberry-pi-vpn-teil-5-vorarbeiten-fuer-ein-vpn-unter-ipv6/ geöffnet habt:

WireGuard Port

Wie bereits angekündigt erkennt das Setup Pi-hole:

Pi-Hole deected

Stimmt der Verwendung der DNS-Server zu und tragt anschließend eure dynamische IP-Adresse ein:

Public IP or DNS
DNS Name

Anschließend könnt ihr bis zum Abschluss der Installation die Vorgaben bestätigen. Führt den empfohlenen Neustart durch. Nach dem Neustart könnt ihr mit „pivpn -d“ prüfen, ob alles geklappt hat. Haltet Ausschau nach:

::::            Self check               ::::
:: [OK] IP forwarding is enabled
:: [OK] Iptables MASQUERADE rule set
:: [OK] WireGuard is running
:: [OK] WireGuard is enabled (it will automatically start on reboot)
:: [OK] WireGuard is listening on port 1194/udp

Was euch noch fehlt ist die Anlage eines Client-Profils:

pivpn add

Sucht euch einen passenden Namen aus. Das Client-Profil auf das Smartphone zu übertragen ist sehr simpel:

pivpn qrcode
WireGuard QR Code

In der WireGuard-App (F-Droid oder Google Play) kann man den QR-Code einscannen:

WireGuard App

Die Client-Profile werden unter /home/pi/configs/ abgelegt. Statt dem QR-Code kann die Übertragung auf das Smartphone natürlich auch auf konventionelle Weise vorgenommen werden.

Damit ist die Einrichtung des VPN-Servers abgeschlossen.

Mit vServer und socat ins Heimnetzwerk

Ihr möchtet euer Heimnetzwerk selbst ohne IPv6 erreichen obwohl ihr einen DS-Lite-Anschluss habt? Über einen Umweg lässt sich das realisieren. Es ist lediglich Root-Zugriff auf ein Linux mit IPv4-Adresse UND IPv6-Adresse notwendig, was auf nahezu alle Miet-Server / vServer zutrifft. Meinen vServer habe ich beispielsweise auf https://www.delta-networks.de/ gebucht.

Im Folgenden gehe ich von bestehenden Zugang zur Konsole aus.

Wir werden „socat“ benutzen um die gewünschte Weiterleitung durchzuführen:

sudo apt install socat

Auf https://medium.com/@copyconstruct/socat-29453e9fc8a6 hat der Autor eine gute Zusammenfassung geliefert:

So Cat

Ein einziger Befehl mit Root-Rechten reicht aus:

sudo socat UDP4-LISTEN:1194,fork,su=nobody UDP6:<DYNDNS>:1194

Bei der <DYNDNS> handelt es sich um eure dynamische IPv6-IP-Adresse – lautet diese raspi.dyndns.com wird daraus also:

sudo socat UDP4-LISTEN:1194,fork,su=nobody UDP6:raspi.dyndns.com:1194

Damit der Befehl dauerhaft im Hintergrund ausgeführt wird und zum Zwecke der Stabilität empfiehlt es sich entsprechende cronjobs anzulegen:

sudo crontab -e

Tragt mit einem Editor – ich kann nano empfehlen – folgende Zeilen ein und speichert ab:

@reboot	socat UDP4-LISTEN:1194,fork,su=nobody UDP6:<DYNDNS>:1194
0     5       *       *       *       /sbin/reboot
Crontab

Der tägliche Neustart um 05:00 Uhr erhöht meiner persönlichen Meinung nach die Stabilität – das bzw. die zweite Zeile ist jedoch kein Muss.

Startet den vServer neu (sudo reboot).

Jetzt ist lediglich das Client-Profil anzupassen. Hierfür müsst ihr die IPv4-Adresse eures Linux-Servers kennen. Mal angenommen das wäre 85.13.134.231 dann sieht das wie folgt aus:

OpenVPN:

Remote IPv4

WireGuard:

WireGuard Remote IPv4

Wo vorher eure dynamische IPv6-IP-Adresse stand tragt ihr jetzt die IPv4-Adresse des Servers auf dem socat läuft ein. Übertragt das geänderte Client-Profil auf euer Smartphone.

Damit habt ihr trotz DS-Lite-Anschluss Zugriff auf euer Heimnetzwerk:

Smartphone IPv4 => IPv4-Eingang-vServer-Ausgang-IPv6 => IPv6-Heimnetzwerk

Okay, es ist extrem stark vereinfacht und ein Schaubild wäre wohl eingängiger. Hauptsache es klappt…

Hinweis:
Sollte auf dem vServer eine Firewall laufen (empfehlenswert) muss der Port 1194 geöffnet werden. Bei „ufw“ geht das so:

sudo ufw allow 1194/udp
Firewall

Weitere Artikel in dieser Kategorie:

14 Kommentare

  1. Anton

    Danke für die anschauliche Anleitung! Ich hatte bis jetzt immer Probleme, aber es lag wohl an meiner Firewall. Nachdem ich Stefans Anleitung Schritt für Schritt durchgegangen bin, klappt es nun.

  2. Michi

    Danke für die Arbeit und die gute Erklärung. Ich komme beim vserver einrichten nicht weiter. Habe socat installiert, aber wenn ich sudo socat UDP4-LISTEN:1194,fork,su=nobody UDP6:meine.ddns:1194
    eingebe, passiert nichts. ich komme nur mit strg C wieder raus.crontab und firewall sind auch fertig.

  3. Chris

    Hallo Herr Gastautor,
    haben Sie eine Idee für folgendes Problem, ich fange mal vorne an:
    Ich habe auf meinem Raspberry Wireguard installiert und kann von außen sowohl per IPv4 als auch per IPv6 darauf zugreifen.
    IPv4 läuft über Myfritz und IPv6 über dynv6.com.
    Der Tunnel an sich ist rein IPv4.

    Jetzt wollte ich den Verkehr im Tunnel als DS ausführen.

    Leider „hänge“ ich bei folgendem Sachverhalt:
    Wenn ich net.ipv6.conf.all.forwarding=1 aktiviere, dann wird automatisch die IPv6 autoconfig deaktiviert.

    „Enabling IPv6 forwarding will disable IPv6 autoconf. Usually you want routers (devices that forward) to have static addresses.“

    Entsprechend kann meine FritzBox dem Raspberry nicht mehr den sich änderenden IPv6 Prävix zuteilen.
    Ich brauche aber sowohl IPv6 Forwarding als auch die automatische IPv6 Prävix Zuteilung durch die FritzBox.
    Da beißt sich die Katze in den Schwanz

  4. Stefan

    @Anton: Freut mich, dass es klappt :-)

    @Michi: In diesem konkreten Fall macht socat nichts anderes als auf dem IPv4 Port 1194/UDP des vServer zu lauschen. Das von dir beschriebene Verhalten ist tatsächlich der Soll-Zustand. Sobald du dich mit dem vServer auf dem IPv4 Port 1194/UDP verbindest fängt socat mit der eigentlichen Arbeit an – Weiterleitung des Datenstroms an dynamische DNS deines Raspberry Pi auf IPv6 Port 1194/UDP. Sofern Firewall deines Routers und Firewall deines vServers eingerichtet sind sollte demnach alles klappen. Der Crontab ist lediglich dafür um socat nach einem Reboot zu starten und im Hintergrund auszuführen. Das nimmt dir sozusagen die Arbeit ab socat manuell ausführen zu müssen.

    @Chris: Alle meine Versuche IPv6-Forwarding einzurichten sind bislang gescheitert. Wenn ich Glück hatte ging alles wieder nach dem Zurücksetzen der entsprechenden Einstellungen. Nicht selten habe ich mich aber auch aus meinen eigenen Systemen ausgeschlossen und es war eine Neuinstallation notwendig. Lange Rede kurzer Sinn – ich habe leider zu wenig Ahnung von IPv6. Es bestand bislang auch keine echte Notwendigkeit für mich mit dem Thema zu beschäftigen. Die IPv4-Weiterleitung habe ich nur wegen DS-Lite eingerichtet. Abgesehen davon kann ich mich direkt über IPv6 mit meinem Heimnetzwerk verbinden – für mich bestand daher keine Notwendigkeit mich IPv6-Forwarding zu beschäftigen. Ich bedaure Ihnen nicht weiterhelfen zu können.

    Viele Grüße,

    Stefan

  5. Anonymous

    @Michi: Folgende Schritte sollten in den meisten Fällen zur Einrichtung des vServer bei Linux auf Basis von Debian ausreichen:

    (1) sudo apt update
    (2) sudo apt install cron nano socat ufw
    (3) sudo ufw allow 22/tcp #Verbindung zu vServer per ssh, ggf. anpassen
    (4) sudo ufw allow 1194/udp
    (5) sudo crontab -e #folgende Zeilen eintragen und abspeichern
    nohup socat UDP4-LISTEN:1194,fork,su=nobody UDP6::1194 &>/dev/null &
    0 5 * * * /sbin/reboot
    (6) sudo reboot

    Statt mit cron zu arbeiten kann man die Zeile „nohup socat UDP4-LISTEN:1194,fork,su=nobody UDP6::1194 &>/dev/null &“ auch in /etc/rc.local eingetragen werden. Das setzt allerdings voraus, dass /etc/rc.local existiert und funktioniert (siehe https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd).

    Erläuterung: Nach jedem Reboot wird socat gestartet und im Hintergrund ausgeführt. Hierbei lauscht socat auf IPv4 Port 1194/UDP und leitet im Falle einer Verbindung den Datenstrom an den IPv6 Port 1194/UDP der weiter. Etwaige Ausgaben von socat werden unterdrückt.

    Viel Erfolg und viele Grüße,

    Stefan

  6. Stefan

    Für Einrichtung einer Weiterleitung ins Heimnetzwerk mit Linux auf Basis von Debian sollten folgende Schritte reichen:

    (1) sudo apt update
    (2) sudo apt install cron nano socat ufw
    (3) sudo ufw allow 22/tcp #für SSH-Verbindung, ggf. Port anpassen
    (4) sudo ufw allow 1194/udp
    (5) sudo ufw enable
    (6) sudo crontab -e #Nachfolgende Zeilen eintragen und speichern:
    @reboot nohup socat UDP4-LISTEN:1194,fork,su=nobody UDP6::1194&>/dev/null &
    0 5 * * * /sbin/reboot
    (7) sudo reboot

    Hinweis: ist durch die dynamische IP-Adresse zu ersetzen, beispielsweise „raspi.dyndns.com“

    Viel Erfolg und viele Grüße,

    Stefan

  7. Stefan

    Hoppla, irgendwas ist beim Post schief gelaufen.

    Gemeint war:
    ~~~~~~~~~~~~
    (6) sudo crontab -e #Nachfolgende Zeilen eintragen und speichern:
    @reboot nohup socat UDP4-LISTEN:1194,fork,su=nobody UDP6:raspi.dyndns.com:1194&>/dev/null &
    0 5 * * * /sbin/reboot

    „raspi.dyndns.com“ müsst ihr durch eure eigene dynamische IP-Adresse ersetzen.

  8. Vincent de Groot

    Danke für die Viele Infos! Leider hat es bei mir nicht funktioniert. Ich habe Lösung gefunden indem ich auf dem PI auch Socat gestartet habe und mich ein TCP 443-1194-442 Verbindung gemacht habe. (VPN lauft also über TCP Port 443).

    In crontab von vServer (ich verwende Ionos VPS-S):

    @reboot socat TCP4-LISTEN:443,fork,su=nobody TCP6:[<IPV6 Adresse von PI]:1194

    In Crontab RaspberyPi mit OpenVPN:

    @reboot socat TCP6-LISTEN:1194,fork,su=nobody TCP4::443

    Es gab danach immer wieder Verbindungsabbruche, dies habe durch Anpassung von MTU Länge im .opvn File beheben können:

    mssfix 1400

  9. thorsten

    Hallo ..
    Vielleicht kann mir jemand helfen…
    ich habe wireguard genau nach der anleitung durchgeführt..
    allerdings mit port 80
    per ping v6 aus dem internet die ipv6 adresse anpingen geht auch..
    aber leider funktioniert das ganze nur im wlan ..
    weiss nicht mehr weiter ..
    über hilfe würde ich mich freuen

  10. Stefan

    Hallo Thorsten,

    kann man den Port 80 von Außen erreichen?

    Probier doch mal http://www.ipv6scanner.com/cgi-bin/main.py und gib dort die IPv6-Adresse ein. Dort kannst du unter anderem gezielt den Port 80 TCP und UDP testen. Klappt das?

    Viele Grüße,

    Stefan

  11. Michi

    Hallo, danke für die Tipps.
    Der erste Fehler lag daran, das ipv6 im Server nicht aktiv war.
    Das zweite Problem war, das socat immer beendet wurde, immer wenn ich die Konsole geschlossen habe. Und das mit crontab, ohne und oder & am Ende.
    Die Lösung war einen Dienst erstellen.

    # /etc/systemd/system/socat.service
    [Unit]
    Description=SocatDienst
    [Service]
    Type=simple
    ExecStart=/usr/bin/socat -u
    [Install]
    WantedBy=multi-user.target

    Danach…

    systemctl enable socat.service
    systemctl start socat.service

    seitdem läuft alles.

    Einziges problem, die Fritzapp fon gibt keinen Ton aus über wireguard,
    aber das kommt in ein anderes Forum.

  12. Michael

    Was hat es mit der Privacy Extention auf sich?
    Warum geht nicht slacc private? Wäre das nicht grundsätzlich zu bevorzugen?
    Vllt. kannst du dazu noch das ein oder andere Wort verlieren?
    Danke:)

  13. Helmut

    Hallo Michael,
    Mehr zu den Privacy Extensions und warum wir sie für einen VPN-Server nicht brauchen können, findest Du in Teil 5 dieser Artikelserie.

  14. Florian

    Hallo zusammen !
    Danke für die Anleitung. Mein PiVPN läuft nun mit Wireguard.
    Der Geschwindigkeitszuwachs beim Kopieren über den Tunnel ist Wahnsinn im Vergleich zu OpenVPN.
    Leider ist nach Aufbau des Tunnels weder das Internet erreichbar, noch das lokale LAN.
    Scheinbar ist da irgendwo ein Haken in der Default-Config.
    Hat jemand eine Idee ?
    Gruß
    Florian

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.