VPN mit IPv4 und IPv6 ohne eigene IPv4
Aktuell beschäftige ich mich mit einem Problem, welches wahrscheinlich alle Benutzer von Internetzugängen mit DS-Lite haben. Es fehlt an der eigenen IPv4. Meinen Provider muss ich hierbei loben, er stellt mir diverse IPv6 Netze zur verfügung, doch ist leider in öffentlichen Hotspots das IPv6 internet nicht überall möglich, daher arbeitet mein VPN nicht und mein Endgerät inkl. mein Traffic ist ungeschützt im fremden WLAN/Netzwerk unterwegs. Als lösung habe ich mir hierbei folgendes überlegt.
Übersicht:
Im folgenden Bild habe ich versucht grafisch das Zusammenspiel des Linuxservers, des DNS Servers und des VPN-Gateway.

DNS:
Wir starten mit der Konfiguration des DNS-Servers. Hierbei ist zu beachten, dass für den IPv6 Bereich, die direkte IPv6 des VPN Gateway genommen wird. Da der Anschluss nativ über IPv6 verfügt, gibt es hier keinen Grund die Kommunikation über einen dritten Server zu leiten. Wie genau der DNS Server Konfiguriert wird, hängt etwas von eurem Provider ab. Ich habe mich dazu entschieden, dies hier nicht zu beschreiben, jeder Provider hat in der Regel dazu eine Knowlagebase. Sollte dies dennoch ein Problem darstellen, bitte ich um einen Kommentar.
Für den DNS-Server wählt ihr nun einen Namen aus, in meinem Fall ist dies der generische Name „vpn.domain.tld“, für diesen wird ein A-Record mit der IP-Adresse eures vServers im Internet angelegt (A-Record = IPv4). Weiterhin wird eine AAA-Record für eure direkte IPv6 angelegt. Prüft bitte vorher ob ihr eine feste IPv6 habt, wenn nicht kann auch ein C-NAME (Aliasname) den AAA-Record (AAA-Record = IPv6) ersetzen.
Generisch sieht dies im Fall für einen A-Record und AAA-Record wie folgt aus:
vpn.domain.tld. 86400 IN A 99.99.99.99
vpn.domain.tld. 86400 IN AAAA 1a1a:1a1a:1a1a::1
Hier ein Beispiel für einen C-NAME und einen A-Record, achtet bitte darauf dass der C-NAME nur mit einer IPv6 auflöst:
vpn.domain.tld. 86400 IN A 99.99.99.99
vpn.domain.tld. 86400 IN CNAME my.dyndns.tld.
Ob alle srichtig konfiguriert ist, könnt ihr üb er „Windowstaste + R“ –> „cmd“ –> „nslookup vpn.domain.tld“ testen:
C:\Users\user>nslookup vpn.domain.tld
Server: one.one.one.one
Address: 1.1.1.1
Nicht autorisierende Antwort:
Name: vpn.domain.tld
Addresses: 1a1a:1a1a:1a1a::1
99.99.99.99
Installation „socat“:
Nachdem der DNS-Server vorbereitet wurde, beginnen wir mit der Installation von socat, um die IPv4 Anfragen an das IPv6 VPN-Gatewas weiterzureichen. In meinem fall ist dies eine Pfsense mit OpenVPN, es sollte aber keine Rolle Spielen welcher dienst auf diese Weise weitergereicht wird, solange dieser über TCP oder UDP arbeitet.
Ich habe die installation auf OpenSuse Leap 15.6 durchgeführt, analog sollte es aber auch mit fast jeder anderen Linux Distribution funktionieren:
srv:~ # zypper ref
Repository 'Packman Repository' is up to date.
Repository 'openSUSE-Leap-15.5-OSS' is up to date.
Repository 'openSUSE-Leap-15.5-Update' is up to date.
Repository 'Update repository of openSUSE Backports' is up to date.
Repository 'Non-OSS Repository' is up to date.
Repository 'Update repository with updates from SUSE Linux Enterprise 15' is up to date.
Repository 'Aktualisierungs-Repository (Nicht-Open-Source-Software)' is up to date.
All repositories have been refreshed.
srv:~ # zypper up
Loading repository data...
The following package update will NOT be installed:
Mesa-libva
Nothing to do.
srv:~ # zypper in socat
Reading installed packages...
Resolving package dependencies...
The following NEW package is going to be installed:
socat
1 new package to install.
Package download size: 281.1 KiB
Package install size change:
| 869.3 KiB required by packages that will be installed
869.3 KiB | - 0 B released by packages that will be removed
Backend: classic_rpmtrans
Continue? [y/n/v/...? shows all options] (y): y
Retrieving: socat-1.8.0.0-150400.14.6.1.x86_64 (Update repository with updates from SUSE Linux Enterprise 15) (1/1), 281.1 KiB
Retrieving: socat-1.8.0.0-150400.14.6.1.x86_64.rpm ......................................................................................................................................................................[done (910.2 KiB/s)]
Checking for file conflicts: ..........................................................................................................................................................................................................[done]
(1/1) Installing: socat-1.8.0.0-150400.14.6.1.x86_64 ..................................................................................................................................................................................[done]
Firewallfreischaltung:
Nun muss der UDP-Port 1194 in der Firewall frei gegben werden. Im falle von Opensuse wird über Yast, für den Bereich Public, der Port eingetragen. Dies würde für andere Linuxdistributionen analog gelten, z.B. via IPTables oder UFW.

Test:
Jetzt muss nur noch socat gestartet werden, hierzu ist zu beachten, ob du zuhause eine feste oder dynamische IPv6 hast.
Feste IPv6:
sudo socat UDP4-LISTEN:1194,fork UDP6:[1a1a:1a1a:1a1a::1]:1194
Dynamische IPv6:
sudo socat UDP4-LISTEN:1194,fork UDP6:my.dyndns.tld:1194
An dieser Stelle sollte nun alles Funktional sein und kann getestet werden.
Dauerhafter Betrieb:
Sofern die Funktion vollständig gegeben ist, muss nun noch ein „screen“ erstellt werden, sodass mit verlassen von Putty der „socat“ Proxy weiterarbeitet. Hierfür kann auch systemd verwendet werden, diese lösung würde ich nochmal nachreichen, bis dahin ist dies mit folgendem Befehl möglich!
/usr/bin/screen -d -m /usr/bin/socat -d -d -lmlocal2 UDP4-LISTEN:1194,fork UDP6:[1a1a:1a1a:1a1a::1]:1194
oder im Falle der dynamischen IP mit:
/usr/bin/screen -d -m /usr/bin/socat -d -d -lmlocal2 UDP4-LISTEN:1194,fork UDP6:my.dyndns.tld:1194
Hiermit bedanke ich mich bei allen Lesern und wünsche viel Spaß mit der Möglichkeit ohne lokale IPv4 über ein IPv4 zu IPv6 Gateway Serversysteme hinter DS-Lite zu betreiben.