Einleitung
Ergänzend zum Beitrag IPv4-Erreichbarkeit via VPS und VPN (WireGuard) möchte ich weitere Möglichkeiten aufzeigen, einzelne Dienste im Heimnetz erreichbar zu machen.
Übersichtszeichnung
Auch hier zunächst eine Übersicht, was erreicht werden soll:
Auf den ersten Blick hat sich nicht viel getan. Es besteht weiterhin eine WireGuard-Verbindung zwischen einem VPS und dem Heimnetzwerk.
Daher gehe ich hier nicht weiter auf diese Verbindung ein, bitte im anderen Thread nachlesen.
Der Unterschied ist, dass hier nun eine Möglichkeit besteht, auf bestimmte Ports/Dienste direkt zuzugreifen, also ohne, dass der (mobile) Client Teil des WireGuard-Netzes wird.
Das kann durchaus gewünscht oder notwendig sein, wenn ich zum Beispiel möchte, dass meine aufwändig und mit viel Liebe gestaltete Webseite von meinem eigenen "Server" ausgeliefert wird. Dafür gäbe es weitere unzählige Optionen, gerade bei externen Hostern. Aber manchmal möchte man das vielleicht nicht nach extern geben. Zum Beispiel seine eigene Nextcloud-Instanz. Da kann es sinnvoll und einfacher sein, wenn diese an einem öffentlichen Endpunkt verfügbar ist.
6tunnel
Ich gehe davon aus, dass die eigentlichen Voraussetzungen bereits geschaffen wurden:
- Die öffentliche IP des VPS ist sinnvoll im DNS registriert
- Die WireGuard-Verbindung zwischen VPS und Heimnetz funktioniert
- Firewall des Hosters ist konfiguriert und auch verstanden
- Wenn konfiguriert, muss die Paket-Firewall des VPS eingehende Verbindungen zum weiterzuleitenden Port akzeptieren
Es ist dabei unerheblich, wie die WireGuard-Verbindung etabliert ist: mit oder ohne zusätzlichem Server.
Ich gehe daher jetzt nur auf die Kernkomponente ein, in diesem Beispiel 6tunnel (https://github.com/wojtekka/6tunnel).
Es ist ein Applikationstunnel. Ziel ist es, dass eingehende Anfragen an den VPS transparent an das eigentliche Ziel im Heimnetz getunnelt werden.
Dabei kann sich 6tunnel sowohl zu IPv4 als auch IPv6-Adressen verbinden. In einem abgewandelten Beispiel wird klar, warum 6tunnel hier eine gute Lösung ist.
Zunächst muss 6tunnel installiert werden, unter Debian-basierten Systemen via:
Danach lässt sich bereits ein einfacher Test machen.
Auf dem VPS möchte ich eingehend Port 80 an Port 80 meines NAS weiterleiten:
sudo 6tunnel 80 192.168.178.110 80
6tunnel: warning: both local and remote addresses are IPv4
sudo netstat -anp|grep 6tunnel
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12705/6tunnel
Da es eigentlich um eine Tunnelung zu einem IPv6-Ziel geht, warnt uns 6tunnel, arbeitet aber völlig korrekt.
Im zweiten Schritt sehen wir, dass 6tunnel brav auf eingehende Verbindungen wartet.
Testen wir von einem Client im weltweiten Netz:
nc -v vps.meinefabelhaftedomain.de 80
Connection to vps.meinefabelhaftedomain.de (80.90.100.110) 80 port [tcp/http] succeeded!
Wenn wir jetzt wieder via netstat auf dem VPS die Verbindungen prüfen, sehen wir den Erfolg:
sudo netstat -anp|grep 6tunnel
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12705/6tunnel
tcp 0 0 10.99.99.1:55188 192.168.178.110:80 ESTABLISHED 12744/6tunnel
tcp 0 0 80.90.100.110:80 110.111.112.113:59704 ESTABLISHED 12744/6tunnel
Wir sehen, dass der Client im weltweiten Netz (110.111.112.113) sich mit dem Ports 80 des VPS verbunden hat. Der wiederum baut zum Port 80 des fabehaften NAS eine Verbindung auf und tunnelt den Datenverkehr.
Damit ist das Ziel bereits erreicht. Man verfährt analog zu anderen Ports, z.B. Port 443.
Automatischer Start
Nachteil ist, dass 6tunnel keine fertigen systemd-Units mitbringt. Nach Neustart des Servers sind die Tunnel also wieder verschwunden und müssen manuell gestartet werden.
Schöner ist es, wenn systemd sich darum kümmert.
Auf die Schnelle habe ich keine fertigen Beispiele gefunden, daher habe ich ein Beispiel gebastelt.
Zunächst legen wir ein Verzeichnis an, wo wir die Konfigurationsdateien ablegen:
Danach legen wir für jede Weiterleitung eine Datei an:
ll /etc/6tunnel/
total 16
drwxr-xr-x 2 root root 4096 Oct 30 15:52 ./
drwxr-xr-x 95 root root 4096 Oct 30 15:43 ../
-rw-r--r-- 1 root root 28 Oct 30 15:52 443
-rw-r--r-- 1 root root 27 Oct 30 15:50 80
Wir brauchen nur wenige Informationen:
cat /etc/6tunnel/80
TARGET=192.168.178.110
PORT=80
cat /etc/6tunnel/443
TARGET=192.168.178.110
PORT=443
Wir legen eine Template-Unit an:
cat /usr/lib/systemd/system/6tunnel@.service
[Unit]
Description=Simple example unit for a 6tunnel
After=network-online.target nss-lookup.target wg-quick.target
Wants=network-online.target nss-lookup.target wg-quick.target
[Service]
EnvironmentFile=/etc/6tunnel/%i
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/6tunnel ${PORT} ${TARGET} ${PORT}
[Install]
WantedBy=multi-user.target
Alles anzeigen
Ich habe eine Abhängigkeit zum WireGuard-Tunnel gesetzt. Aber selbst ohne, dürfte das kein Problem sein.
Nun aktivieren wir je eine Unit je Freigabe:
sudo systemctl enable 6tunnel@80
Created symlink /etc/systemd/system/multi-user.target.wants/6tunnel@80.service → /lib/systemd/system/6tunnel@.service.
sudo systemctl enable 6tunnel@443
Created symlink /etc/systemd/system/multi-user.target.wants/6tunnel@443.service → /lib/systemd/system/6tunnel@.service.
Nach Neustart sehen wir, dass die Units geladen wurden und 6tunnel seine Arbeit aufgenommen hat.
systemctl status 6tunnel@80
● 6tunnel@80.service - Simple example unit for a 6tunnel
Loaded: loaded (/lib/systemd/system/6tunnel@.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2023-10-30 16:06:32 UTC; 2min 34s ago
Process: 545 ExecStart=/usr/bin/6tunnel ${PORT} ${TARGET} ${PORT} (code=exited, status=0/SUCCESS)
Main PID: 545 (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 981)
Memory: 192.0K
CPU: 809us
CGroup: /system.slice/system-6tunnel.slice/6tunnel@80.service
└─546 /usr/bin/6tunnel 80 192.168.178.110 80
systemctl status 6tunnel@443
● 6tunnel@443.service - Simple example unit for a 6tunnel
Loaded: loaded (/lib/systemd/system/6tunnel@.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2023-10-30 16:06:32 UTC; 2min 39s ago
Process: 543 ExecStart=/usr/bin/6tunnel ${PORT} ${TARGET} ${PORT} (code=exited, status=0/SUCCESS)
Main PID: 543 (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 981)
Memory: 232.0K
CPU: 1ms
CGroup: /system.slice/system-6tunnel.slice/6tunnel@443.service
└─544 /usr/bin/6tunnel 443 192.168.178.110 443
sudo netstat -anp|grep 6tunnel
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 546/6tunnel
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 544/6tunnel
Alles anzeigen
Das geht bestimmt noch ausgefeilter, erfüllt aber zunächst seinen Zweck.
Ausblick
In weiteren Abwandlungen geht es um die Idee, Ports durch den TCP/IP-Stack mithilfe von iptables weiterzuleiten.
Ebenso wird es um eine Lösung gehen, wo der VPS sich ohne Hilfe von WireGuard direkt mit dem IPv6-Ziel des Heimnetzes verbindet.
Dafür gibt es natürlich auch (kostenpflichtige) Lösungen am Markt, wie z.B. https://www.feste-ip.net/dslite-ipv6-po…-informationen/.
Diese Lösung ist nicht besser oder schlechter und ohne Hilfe eines VPS einrichtbar. Wer Lust und Erfahrung hat, kann ja dazu vielleicht ein kleines Tutorial erstellen.