Wireguard an einem CGNAT Anschluss der Deutschen Glasfaser über einen vServer mit fester IPv4 Adresse wieder erreichbar machen

elvito

New member
Hallo zusammen,

ich hoffe der Titel ist aussagekräftig. Ich bin über diese Anleitung hier ins Forum gekommen. Mit 6tunnel lassen sich leider keine Verbindungen mit Wireguard realisieren, weil 6tunnel nur TCP Pakte weiterleiten kann und Wireguard UDP Pakete verwendet. Das Problem in meinem Fall besteht darin, daß man aufgrund der Knappheit von IPv4 Adressen von vielen Providern eine CGNAT IPv4 Adresse zugewiesen bekommt. Auf der Fritzbox wird bei mir eine 100.85.xx.xx Adresse angezeigt. Diese Adressen werden im Internet nicht geroutet analog beispielsweise zu dem 192.168.xx.xx Adressbereich. Details hierzu findet man hier --> https://de.wikipedia.org/wiki/Carrier-grade_NAT

Wenn man die eigene IPv4 Adresse über eine Seite wie z.B. wieistmeineip.de abfragt, wird bei IPv4 eine andere Adresse als die obige angezeigt. Diese Adresse verwendet Dt GF für die Kunden zum Surfen im Internet und die Dienste die IPv4 only sind. Diese eine Adresse müssen sich jedoch mehrere Kunden teilen und daher weiß Deutsche Glasfaser bei IPv4 Anfragen aus dem Internet auch nicht welchem Kunden die jeweils ankommenden Pakete zugeordnet werden müssen. Daher ist man weder über die IPv4 Adresse die in der Fritzbox angezeigt wird noch über die Adresse die bei wieistmeineip.de angezeigt wird aus dem Internet erreichbar. Mein Handymobilnetz (O2) teilt mir unterwegs nur eine IPv4 Adresse zu. Damit konnte ich keine Wireguardverbindung mehr von meinem Handy/Laptop zur Fritzbox aufbauen. Diese benötige ich, weil in meinem Heimnetz nicht alle Geräte IPv6 fähig sind und mir so ein Wechsel des Mobilfunkanbieters auch nicht komplett weitergeholfen hätte.

Um das zu umgehen benötigt man zunächst eine feste und damit erreichbare IPv4 Adresse. Ich habe hierfür einen vServer bei der Firma Ionos gemietet. Das billigste Angebot ohne Extras ist ausreichend und kostet aktuell 1€/Monat zzgl 10€ für die einmalige Einrichtung. Ich will hier keine Werbung machen, jeder andere Anbieter mit dem gleichen Leistungsumfang sollte auch funktionieren.

Bei dem vServer musste ich in der Webverwaltung zunächst ICMP in der Firewall aktivieren, um Ping nutzen zu können. Das ist nur zum testen und kann am Ende wieder deaktiviert werden. Ausserdem musste ich die IPv6 Adresse ebenfalls erst in der Webverwaltung aktivieren. Als OS hab ich das neueste Ubuntu genommen. Den Benutzer "root" sollte man deaktivieren und statt dessen einen neuen Benutzer anlegen und sudo installieren. Anleitungen hierzu findet nach man nach kurzer Suche zuhauf im Internet. Auf dem vServer habe ich nach dem üblichen updaten noch die Pakete socat, net-tools und screen installiert. Letzteres ist optional, ich empfehle es jedoch zur Ersteinrichtung der Weiterleitung. Den vServer ggf rebooten. Per ssh kann man auf dem vServer prüfen ob er jeweils eine Ipv4 und IPv6 Adresse hat. -->

Code:
ip a

bei mir sieht das dann so aus (die Adresse ist von mir mit x überschrieben):

Code:
elvito@ubuntu:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    inet 217.xxx.xxx.xx/32 metric 100 scope global dynamic ens6
       valid_lft 517sec preferred_lft 517sec
    inet6 2a01:xxxx:xxxx:xxxx::1/128 scope global dynamic noprefixroute
       valid_lft 3210sec preferred_lft 2210sec
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever

Man benötigt noch die IPv6 Adresse der Fritzbox und den Port für Wireguard. Der Wireguardport wird scheinbar auf jeder Fritzbox zufällig vergeben und ist vermutlich bei jedem anders. Man findet den Port etwas versteckt in den Fritzboxeinstellungen zu Wireguard. Ich habe eine 5590 Fiber, das ist bei anderen Modellen ggf woanders zu finden. Bei mir ist es unter Internet --> Freigaben --> VPN (Wireguard) dann am Ende der Seite auf "Wireguard-Einstellungen anzeigen". Auf der Infoseite steht unter "Internet-Adresse Ihrer Fritz!Box" hinter dem ":" der Port für Wireguard. Diesen muss man notieren. Die IPv6 Adresse findet man in der Fritzbox bei Internet --> Online-Monitor --> IPv6 Adresse. Relevant ist nur der Teil vor dem "/". Die Adresse sollte mit 2a beginnen. Wenn die Adresse mit fd, fe o.ä. beginnt muss man die Setting zu IPv6 in der Fritzbox überprüfen und ggf. ULA deaktivieren.

In der Webverwaltung von Ionos muss man nun diesen Port in der Firewall des vServers freigeben. Man muss hier unbedingt als Protokoll UDP auswählen.

Auf dem vServer startet man nun eine screen Session mit

Code:
screen

und gibt folgendes ein:

Code:
sudo socat UDP4-LISTEN:<Port von Wireguard eintragen>,fork,su=nobody UDP6:[<IPv6 Adresse der Fritzbox oder DynDNS Adresse der Fritzbox>]:<Port von Wireguard>

Der Aufruf von socat gibt keine Rückmeldung die Weiterleitung ist aber aktiv. Man kann nun die screen Session akoppeln mit

Code:
<strg+a> <d>

und mit

Code:
screen -r

später wieder aufnehmen.

Das Programm socat wandelt nun auf dem vServer jedes auf dem eingetragenen Port ankommende UDP IPv4 Paket in ein UDP IPv6 Paket um und leitet es an den gewünschten Port der IPv6 Adresse der Fritzbox weiter. Man kann das jetzt schon so laufen lassen und sollte nur aus Sicherheitsgründen alle Ports ausser dem UDP Port für die Weiterleitung wieder in der Firewall des vServers schließen.

Wer keine feste IPv6 Adresse von seinem Provider zugewiesen bekommt muss eine DynDNS Adresse benutzen. Hierbei ist wichtig zu beachten, dass der DynDNS Dienst auf der Fritzbox nur Updates zur IPv6 Adresse veröffentlicht. Sonst kann es passieren, das der DynDNS Updater der Fritzbox die CGNAT Adresse mitschickt und dann würde die Verbindung nicht mehr funktionieren. Ich vermute so ein Problem bei den myfritz Adressen. Mit so einer Adresse hat es bei mir jedenfalls nicht geklappt. Ich nehme für DynDNS den Dienst von All-inkl.de. Die Update URL sieht dann bei mir so aus -->

Code:
dyndns.kasserver.com/?myip=<ip6addr>

Man muss zuletzt in der Wireguardsoftware z.B. beim Handy bei Endpoint die IPv4 Adresse/DynDNS des vServers eintragen und ggf auch den Port anpassen. Die Verbindung mit Wireguard der Fritzbox sollte über IPv4 nun wieder klappen.

Das ist noch nicht ideal und man muss diese Lösung noch etwas finetunen, da z,B. bei manchen Leuten die IPv6 Adresse wechselt. Meine Idee war/ist socat in einem shellscript per cronjob alle paar Stunden zu resetten. So eine Lösung könnte man ja evtl auch hier gemeinsam "erarbeiten". Cool wäre auch z.B. eine simple WebGUI in PHP auf der man solche Weiterleitungen einrichten und verwalten kann. Sowas übersteigt allerdings meine Skills und meine verfügbare Freizeit.

Viel Spass beim ausprobieren
 
Zuletzt bearbeitet:
Das ist wirklich ein schönes Stück Arbeit und Du hast Dir da echt Mühe gemacht, das hinzubekommen, Respekt! Ich vermute aber, das für den Standardnutzer, der sich nicht so gut auskennt wie Du und der vielleicht nur ein einzelnes Gerät erreichen will, Tailscale die einfachere Lösung ist.
 
Da ich ein großer NodeRed Fan bin habe ich auf dem vServer zusätzlich NodeRed installiert. Ich habe mir damit ein paar QoL Funktionen für meine Lösung mit socat zusammengeklickt, die ich hier noch teilen möchte. Ich rate, bevor man mit irgendwas loslegt, NodeRed vor unbefugtem Zugriff abzusichern. Wenn der Editor nicht benutzt wird sollte der Port (trotz SSL und Username/PW) immer geschlossen werden. Die Steuerung möchte ich später nur noch über das NR Dashboard machen. Selbst wenn jemand dann mein Passwort errät, kann der Angreifer nur die vorgegebenen Weiterleitungen ein- und ausschalten und meine IP Adresse abfragen (die er bereits kennt). Dieses Risiko halte ich für vertretbar.
(Nachtrag: Ich habe inzwischen festgestellt, daß man den Editor und die UI leider nicht mit den NR Boardmitteln porttechnisch "trennen" kann. Man müsste/kann das aber mit einem nginx reverse Proxy auf dem vServer z.B. umgehen.)

Man kann mit meinem Flow aktuell folgendes machen:
- socat starten (auch mehrere Instanzen für mehrere verschiedene Ports)
- alle socat Instanzen stoppen
- Den aktuellen IPv6 DNS Eintrag bei Google DNS zur DynDNS Adresse auflösen (nslookup via DNS von Google 8.8.8.8)
- Die DynDNS Adresse der FB 1x anpingen und so die bei DynDNS hinterlegte IPv6 Adresse abfragen
- Die aktuell am vServer vergebene Ipv4+6 Adressen abfragen
- Abfragen welche externe IPv4 Adresse grade mit der socatweiterleitung verbunden ist
- Abfragen wieviele Instanzen von socat grade laufen (inkl PID)

Screenshot 2024-10-04 173749.png

Screenshot 2024-10-04 182832.png

Viele Nodes müssen manuell angepasst werden. Es wird Out of the Box nach dem Import also ganz sicher nicht funktionieren. Bei den Nodes die angepasst werden müssen habe ich es dazu geschrieben, das sollte selbsterklärend sein, sobald man den Flow importiert hat. Ausserdem muss das alles noch sinnvoll verknüpft werden. Da die Anforderungen bei jedem anders sind, kann man keine pauschale Lösung anbieten.

Diese zwei Nodes muss man vorher zusätzlich über die Palette nachinstallieren -->
string
persist

Flow:
klick (Ich darf nur 1000 Zeichen/Beitrag posten daher der gesamte Flow auf Pastebin)

Der Flow ist bei mir noch nicht fertig und im aktuellen Zustand nur ein Grundgerüst. Jeder kann/muss das noch auf die eigenen Bedürfnisse zuschneiden. Diejenigen die NodeRed schon kennen werden sich schnell zurechtfinden.

Als nächstes wollte ich mit diesem Flow und den Dashboardnodes noch eine kleine GUI zusammenklicken. Dann kann ich die socatweiterleitung per Webbrowser abfragen und neu setzen. Wenn das läuft werde ich bei Interesse berichten wie es funktioniert und aussieht.

Nachtrag;
Screenshot 2024-10-05 120821.png
(in Arbeit und noch nicht fertig, folgt in separatem Post)

NodeRed zu verwenden ist sicherlich etwas unorthodox aber ich habe so den Programmierteil und den GUI Teil unter einer Haube, kriege regelmäßig Updates usw. und es ist für Leute wie mich leichter zu verstehen als shellscripte. Ich mach das nur als Hobby und viele meiner Lösungen können sicher eleganter gelöst werden. Mir persönlich ist es egal wie primitiv (m)eine Lösung ist, solange sie funktioniert und sicher ist. Ich würde mich daher sehr über bessere Lösungswege und Vorschläge freuen, am besten mit konkretem Beispiel.

viel Spass beim ausprobieren
 
Zuletzt bearbeitet:
Das ist wirklich ein schönes Stück Arbeit und Du hast Dir da echt Mühe gemacht, das hinzubekommen, Respekt! Ich vermute aber, das für den Standardnutzer, der sich nicht so gut auskennt wie Du und der vielleicht nur ein einzelnes Gerät erreichen will, Tailscale die einfachere Lösung ist.
Danke. Es liest sich eigentlich nur kompliziert. Die Einrichtung ist recht simpel, wenn man es einmal Schritt für Schritt gemacht hat. Ich hab mich bisher vor tailscale gedrückt weil man das nicht komplett in Eigenregie betreiben kann. Ich hab aber grade gesehen, daß es headscale als Alternative dazu gibt. Das sieht sehr interessant aus, das werde ich mir mal genauer anschauen, von daher nochmal danke für den Hinweis.
 
Aber was spricht dagegen den Tunnel einfach auf v6 aufzubauen, außer dass viele öffentliche Hotspots und die in Hotels und Co kein v6 unterstützen (weil nicht eingerichtet)?
Ich verwende dann halt das Mobilfunknetz. Für diejenigen für die das nicht in Frage kommt, ist das aber natürlich ein guter Weg :)
 
Aber was spricht dagegen den Tunnel einfach auf v6 aufzubauen, außer dass viele öffentliche Hotspots und die in Hotels und Co kein v6 unterstützen (weil nicht eingerichtet)?
Ich verwende dann halt das Mobilfunknetz. Für diejenigen für die das nicht in Frage kommt, ist das aber natürlich ein guter Weg :)
Normalerweise nichts :) Ich muss das von unterwegs so machen wegen der Kombination Dt. GF zuhause (Erreichbar nur über IPv6) und sipgate/O2 im Mobilnetz (derzeit IPv4 only). Wie du richtig sagst, sind viele Leute immer noch auf IPv4 only unterwegs.

Ich hab IPv6 auch jahrelang gemieden bis es nicht mehr anders ging. Ich war einfach zu faul mich da einzuarbeiten. Es ist aber eigentlich ganz simpel und in vielen Punkten IPv4 deutlich überlegen. Mir hat ein CRE Podcast zum grundsätzlichem Verständnis extrem weitergeholfen --> klick Ich kann die Folge, obwohl aus dem Jahr 2012, nur sehr empfehlen.
 
Oha... Dass ein Hotel kein v6 im WLAN eingerichtet hat, kann ich ja fast noch nachvollziehen, aber ein Provider der 4 only unterwegs ist... Das ist schon hart.
 
Das ist wirklich ein schönes Stück Arbeit und Du hast Dir da echt Mühe gemacht, das hinzubekommen, Respekt! Ich vermute aber, das für den Standardnutzer, der sich nicht so gut auskennt wie Du und der vielleicht nur ein einzelnes Gerät erreichen will, Tailscale die einfachere Lösung ist.
Hallo zusammen,

ich empfehle allen die ein ähnliches Problem wie ich haben/hatten den Einsatz von Tailscale oder Headscale. Das funktioniert ausgezeichnet und ist wesentlich besser als mein Vorschlag mit socat aus dem Anfangspost. Ein vServer ist hierfür dann auch nicht notwendig. Tausend Dank nochmal für den Tipp mit Tailscale! Das ist echt der Hammer was damit sonst noch so alles geht.(y):)
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
5.879
Beiträge
57.437
Mitglieder
5.812
Neuestes Mitglied
Espresso
Zurück
Oben