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
(DS-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 (FRITZ!OS >=7.50) nach
langer langer Wartezeit.
OpenVPN erlaubt seit Version 2.5.0 den kompletten Verzicht auf IPv4,
außer bei Verwendung
von Data Channel Offload (DCO).
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 udp6
dev tun
tun-mtu 1500
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 !ipv4 ipv6"
push "dhcp-option DNS fd00::dea6:32ff:feb7:f781"
keepalive 10 120
replay-window 4096
verb 3
Auf dem Client (client.ovpn) sieht das
so aus:
client
dev tun
proto udp6
tun-mtu 1500
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.
Für die MTU1500 ist es unter Umständen notwendig in der Fritzbox die
Option "PPPoE MTU/MRU 1500 RFC4638-Support" zu aktivieren.
Anderenfalls sollte man runter auf 1492 gehen.
Dieses veröffentlichte Selbstgespräch erhebt keinen Anspruch auf
Fehlerfreiheit.
Thomas Schäfer
Letzte Überarbeitung Juni 2024
PS: damit das VPN auch geschmeidig nutzbar ist, sollte daheim
dns64/nat64 aktiv sein: NAT64
mit dem_Raspberry_Pi