Seiten

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).

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 openresolv

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.

Routing aktivieren

echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p

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)}')"

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
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

# powershell listener
$Listener = [System.Net.Sockets.TcpListener]81;
$Listener.Start();
while($true) 
{
    $client = $Listener.AcceptTcpClient();
    Write-Host "Connected!";
    $client.Close();
}
$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


Keine Kommentare:

Kommentar veröffentlichen