OpenVPN ohne Altlasten



Vorwort


Mit den Auswirkungen der IPv4-Adressknappheit haben immer mehr Internetnutzer zu kämpfen.
Dies äußert u.a. in der größer werdenden Verbreitung von CGNAT, das sich auch hinter wohlklingenden Bezeichnungen wie Dualstack-lite versteckt. Adressüberlappungen und der Verlust der direkten Adressierbarkeit sind die Folgen.

Glücklicherweise bieten fast alle InternetServiceProvider, die ihren Kunden keine eigene IPv4-Adresse mehr bieten können, vollständige IPv6-Konnektivität.

Damit kann man etwas anfangen.

IPv4 tunneln kann ja jeder, selbst AVM nach langer langer Wartezeit.

OpenVPN erlaubt seit Version 2.5.0 den kompletten Verzicht auf IPv4.


Wozu also der Aufwand?

Es gibt ja schließlich direkte Konnektivität via IPv6. Myfritz als DNS-Service von AVM bietet hier hervorragende Dienste.

Das Problem

Manchmal möchte man seine IP-Adresse von daheim haben, z.B. um die Telefoniefunktion der Fritzbox von unterwegs aus nutzen zu können.
Das geht zwar derzeit nicht mit der Fon-App von AVM ( da ist noch eine Abhängigkeit von IPv4 drin). Aber Linphone beispielsweise spricht IPv6 mit der Fritzbox.


Die Idee zur Lösung


OpenVPN: Transportnetz via IPv6, Payload IPv6


Umsetzung


Hardware: Raspberry PI (im Grunde geht auch jeder andere Rechner) der Raspberry Pi bietet sich an, weil er leise, stromsparend und relativ günstig ist.

Software: Linux (hier openSUSE leap, debian sollte ebenso den Zweck erfüllen)

openvpn ist sehr komplexe Software. Ein meiner Meinung nach sehr aufwendiger Teil ist die Erstellung entsprechender Verschlüsselungszertifikate. Dazu verweise ich nur auf die mitgelieferte Dokumentation.
Die einfache Variante mit dem "static.key" ist zwar sehr verlockend, hat aber letztendlich zu viele Einschränkungen.


Der VPN-Service läuft also auf dem Raspberry Pi, ganz normal via LAN-Kabel angeschlossen.
Der Raspberry Pi hat eine IPv6-Adresse, die auf der Fritzbox freigegeben(Firewall) ist und außerdem via dynv6 oder myfritz einen stabilen Servernamen hat. (andere Router und DDNS-Dienste sind hier auch denkbar)

Um statische Routeneinträge auf dem Router und den anderen Geräten zu vermeiden, setze ich auf  NDP-Proxy.

sysctl net.ipv6.conf.eth0.proxy_ndp=1



Da der Raspberry Pi ja nun Pakete zwischen tun0 und eth0 routen soll, ist noch folgende Einstellung notwendig:

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


ip neigh add proxy 2001:db8:41a:7901::1:3 dev eth0
ip neigh add proxy 2001:db8:41a:7901::1:4 dev eth0
ip neigh add proxy 2001:db8:41a:7901::1:5 dev eth0


leider für jede IPv6-Adresse einzeln,
oder via diesem Shellaufruf einfach mal für alle setzen:

for i in $(seq 3 10) ; do ip neigh add proxy 2001:db8:41a:7901::1:$(printf %x $i) dev eth0; done


Für IPv6 kann man auch auf ein richtiges geroutetes Netz setzen (die Fritzbox unterstützt dhcpv6-pd). Das hätte den Vorteil, dass man auf die NDP-Proxies verzichten kann.

Im hier hinterlegten Skript habe ich mich für die Verwendung von NDP-Proxy entschieden. Wegen der dynamischen Präfixe muss das Skript nach jedem Wechsel neu aufgerufen werden.



Somit sieht die Serverkonfiguration (server.ovpn) so aus:

proto tcp6-server
dev tun
tun-mtu 1492
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server-ipv6 2001:db8:41a:7901:0:0:1:1/112
push "redirect-gateway def1 ipv6"
push "route-ipv6 fd00::/64"
push "route-ipv6  2001:db8:41a:7901:0:0:0:0/64"
push "dhcp-option DNS fd00::dea6:32ff:feb7:f781"
keepalive 10 120
verb 3


Auf dem Client (client.ovpn) sieht das so aus:

client
dev tun
proto tcp-client
remote servername-hier-nicht-abschreiben 1194
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
verb 3


Mit diesen Einstellungen kann man nun die Konfigurationsoberfläche der Fritzbox unter http://fritz.box (oder http://[fd00::3631:c4ff:fef8:83a4] ) aufrufen, auch andere IPV6-Geräte im "Heimnetz" sind somit aus der Ferne trotz fehlender individueller Freigaben wieder erreichbar.
Auf dem Client sieht das dann so aus OpenVPN auf Android.


Dieses veröffentlichte Selbstgespräch erhebt keinen Anspruch auf Fehlerfreiheit. Lob und Kritik sind trotzdem willkommen.

Thomas Schäfer

Mai 2022

PS: damit das VPN auch geschmeidig nutzbar ist, sollte daheim dns64/nat64 aktiv sein: NAT64 mit dem_Raspberry_Pi