Mittwoch, 17. September 2025

Das Internet ist ausgefallen

Schnelle Abhilfe schafft eine Mobilnetzanbindung am Router, aber nun fehlt der Weg "nach Hause"!?

VPN Einwahl, Zugriff auf eine Portfreigabe im Heimnetz, nichts funktioniert mehr. Vielleicht gibt es mobile Anbindungen wo das funktioniert, ich habe auf die Schnelle keine "einfache" gefunden. Nicht mal der Businessvertrag und eine öffentliche IPv4 Adresse bei einem großen deutschen Mobilfunkanbieter hat funktioniert. Es liegt wohl am CGNAT.

Lösungsansatz: ein VPN Einwahlknoten Internet und dort die Ports freigeben. Alle Clients die über ein Port erreichbar sein sollen, müssen eine wireguard Verbindung zu diesem Knoten aufbauen. Diese Lösung will ich kurz beschreiben (nur für IPv4).

Diese Lösung funktioniert auch generell, wenn man zu Hause gar keine IPv4 Adresse besitzt / bekommt. Die im Kommentar erwähnte Cloud Router als Service Lösung funktioniert leider nicht für 1:1 Portmappings, wohl aber das Tutorial von Denis.

Grundlage schaffen

Ich habe bei Hetzner einen kleinen VPC mit debian installiert. Den gibt es für wenige Euro im Monat, der wird in Minuten abgerechnet und ist auch gleich wieder kündbar. Selbst bei kurzer Nutzung ist der finanzielle Aufwand damit minimal. 

Hinweis: Ich hatte mit dem wireguard App Produkt, welches man bei Hetzner mit einem Klick installieren kann, keinen Erfolg. Ich weiß aber (noch) nicht warum, deshalb beschreibe ich die komplette Installation.

wireguard installieren

apt update && apt upgrade
apt install wireguard iptables

Damit die alten Lösungen funktionieren, muss der DNS Eintrag (die dynDNS Lösung) auf diesen VPC umgebogen werden.  Das genaue Vorgehen ist sehr individuell, ich habe einfach einen crontab Eintrag mit einem entsprechenden curl Aufruf gemacht.

Den Einwahlknoten mit einem privaten IPv4 Netzwerk (RFC 1918: 192.168.x.x, 10.x.x.x oder 172.16.x.x bis 172.31.x.x. ) erzeugen.

touch /etc/wireguard/wg0.sh
tee /etc/wireguard/wg0.conf << EOI
[Interface]
Address = 172.30.0.1/24
ListenPort = 51820
PrivateKey = $(wg genkey)
PostUp= sh /etc/wireguard/wg0.sh %i A
PostDown= sh /etc/wireguard/wg0.sh %i D
EOI
echo "Einwahlknoten PublicKey: $(wg show | awk '/public key/ {printf($3)}')"

Hinweis: Die Datei wg0.sh dient dazu Firewall Regeln auszuführen und dabei die Übersichtlichkeit zu bewahren.  Die Datei wird später befüllt.

Zwischenschritt am anderen Gerät

Beispiel für einen Windows Client, der im lokalen Netzwerk erreichbar bleiben soll.

Einen wireguard Client mit allen vorhandenen Informationen erzeugen:

[Interface]
PrivateKey = <wird vom WG Client erzeugt>
Address = 172.30.0.5/32
DNS = 1.1.1.1, 1.0.0.1

[Peer]
PublicKey = <Einwahlknoten PublicKey>
AllowedIPs = 0.0.0.0/1, 128.0.0.0/1
Endpoint = wireguard.domain.tld:51820
PersistentKeepalive = 25

Den public Key (oberste Zeile in der Windows Konfiguration, bei Linux siehe code oben) kopieren und hier in den Code eintragen.

Peer freischalten

Damit wird die wg0.conf am Einwahlknoten ergänzt. Tipp: Der Kommentar hilft später.

tee -a /etc/wireguard/wg0.conf << EOI

[Peer]
# peer number 5  
PublicKey = <Client PublicKey>
AllowedIPs = 172.30.0.5/32
PersistentKeepalive = 25
EOI

Jetzt kann man die Verbindung grundlegend testen. 

wg-quick up wg0

Wenn alles funktioniert wird der Einwahlknoten als Dienst aktivieren.

wg-quick down wg0
systemctl enable --now wg-quick@wg0

Jetzt kommt der eigentliche und vielleicht komplexeste Teil. Ich habe da lange experimentiert.  

Port Forward einrichten

Die eigentliche Aufgabe war Ports ins heimische Netzwerk weiterzuleiten. Dazu wird die Datei /etc/wireguard/wg0.sh mit Regeln gefüllt.

Hier ein Beispiel für zwei Peers (Hostadresse 21 und 4 ) und jeweils ein tcp bzw. udp Port.

#!/bin/sh
interface='eth0' # eth0 / wlan0 - change it to the real Interface Name
# funktioniert besser als ein fester system-abhängiger Eintrag
if [ "$2" = "A" ] ;then on=1;else on=0;fi
sysctl -q net.ipv4.ip_forward=$on
iptables -$2 FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1240
iptables -$2 FORWARD -i $1 -j ACCEPT; iptables -t nat -A POSTROUTING -o $interface -j MASQUERADE
iptables -$2 FORWARD -i $interface -o $1 -p tcp --syn --dport 30159 -m conntrack --ctstate NEW -j ACCEPT
iptables -$2 FORWARD -i $interface -o $1 -p udp --dport 51825 -m conntrack --ctstate NEW -j ACCEPT

iptables -$2 FORWARD -i $interface -o $1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -$2 PREROUTING -i $interface -p tcp --dport 30159 -j DNAT --to-destination 172.30.0.21
iptables -t nat -$2 PREROUTING -i $interface -p udp --dport 51825 -j DNAT --to-destination 172.30.0.4

Nach einem Neustart des wg Dienstes sollten die Ports im heimischen Netz erreichbar sein.

systemctl restart wg-quick@wg0

Ports testen

Alle Beispiele kann man mit IP Adressen oder Namen ausführen, falls etwas nicht funktioniert auch auf allen Zwischenstellen.

Code für Windows Clients mit Powershell

geöffneten Port testen

Test-NetConnection wireguard.domain.tld -port 81

Port öffnen und lauschen, die Firewall für Windows muss für diese Port offen sein!

# powershell listener
$Listener = [System.Net.Sockets.TcpListener]::new(81)
$Listener.Start()

while ($true) {
    if ($Listener.Pending()) {
        $client = $Listener.AcceptTcpClient()
        Write-Host "Connected!"
        $client.Close()
    }

    Start-Sleep -Milliseconds 100
}
$Listener.Stop()

Code für Linux Clients

geöffneten Port testen

nc -zv wireguard.domain.tld 81

Port öffnen und lauschen

nc -l -p 81

ToDo

Code


3 Kommentare:

  1. Hi, da gibt es einen etwas eleganteren Weg...Cloud Router bei IPV64.net...kostet nichts und ist auch bei oben beschriebenen Problem erreichbar. Und nein, ich mache hier keine Werbung , sondern nutze den Service selbst.

    AntwortenLöschen
    Antworten
    1. Hi, danke für diesen Kommentar.
      In der Tat habe ich damals auch schon damit begonnen das auf IPv64.net zu probieren, bin aber aus irgendeinem Grund abgestorben. Ich glaube, weil mein Versuch dann erstmal ging und die Sache nur ganz kurz sein sollte. Ich hatte dann noch erfolglos (für meinen Fall) mit S2S Verbindungen experimentiert.
      Ich werde den Gedanken auf alle Fälle nochmal aufnehmen.
      Noch der Hinweis: "kostet nichts" bedeutet hier aber auch Einschränkungen in Bandbreite und Trafficlimit.
      Otto

      Löschen
    2. Wie versprochen nochmal getestet: Man kann damit leider keine definierten Ports freigeben, lediglich ein Portmapping von einem vorgegebenen (beim Einrichten per Zufall vergebenen) Port zu dem gewünschten internen Port ist möglich. Also extern:81 -> intern:81 geht nicht. Daraus wird z.B. extern:61066 -> intern:81

      Löschen