Zum Inhalt springen
SONOYA.com
Web & Code

DS-Lite und CGNAT: Server trotzdem erreichbar machen

Portfreigabe geht bei DS-Lite oder CGNAT nicht? So machst Du Deinen Server trotzdem erreichbar: per IPv6, Tailscale, Cloudflare Tunnel oder VPS-Relay.

Von

Router-Symbol auf farbigem Verlauf für einen Heimanschluss mit DS-Lite oder CGNAT, an dem eine klassische IPv4-Portfreigabe nicht funktioniert

Du hast die Portfreigabe in der FRITZ!Box sauber eingetragen, der Server läuft, im Heimnetz ist alles erreichbar, und von außen kommt trotzdem nichts an. Sehr oft liegt das nicht an Dir, sondern am Anschluss: Viele Glasfaser- und Kabelanbieter geben Privatkunden keine eigene öffentliche IPv4-Adresse mehr, sondern nur noch DS-Lite oder CGNAT. Eine IPv4-Portfreigabe hat dann schlicht kein Ziel.

Hier erfährst Du, wie Du Deinen Anschlusstyp in zwei Minuten sicher erkennst, welche fünf Wege es trotzdem gibt und welcher davon zu Deinem Fall passt. Den Weg, der ohne Zusatzdienst auskommt, die IPv6-Freigabe, zeige ich Schritt für Schritt am Beispiel einer FRITZ!Box mit FRITZ!OS 8. Die anderen Wege sind ausführlich in eigenen Anleitungen beschrieben, auf die ich an der passenden Stelle verweise.

Warum die Portfreigabe ins Leere läuft

Eine klassische Portfreigabe funktioniert so: Eine Anfrage aus dem Internet trifft auf die öffentliche IPv4-Adresse Deines Routers, und der Router reicht sie an den Rechner im Heimnetz weiter. Das setzt voraus, dass diese öffentliche Adresse Dir allein gehört.

Bei DS-Lite (Dual-Stack Lite, beschrieben in RFC 6333) ist das nicht der Fall. Dein Anschluss bekommt eine vollwertige IPv6-Verbindung, aber IPv4 läuft nur noch durch einen Tunnel zu einem großen NAT-Router beim Provider. Dort teilst Du Dir eine öffentliche IPv4-Adresse mit vielen anderen Kunden. Kommt von außen eine Anfrage an diese Adresse, weiß der Provider-Router nicht, zu welchem Kunden sie gehört, und verwirft sie.

CGNAT (Carrier-Grade NAT) funktioniert ähnlich, nur ohne IPv6-Tunnel: Dein Router bekommt auf der Internetseite eine Adresse aus dem Bereich 100.64.0.0/10, den RFC 6598 genau für diesen Zweck reserviert. Diese Adresse ist im Internet nicht erreichbar.

Die gute Nachricht: Bei DS-Lite ist IPv6 nicht eingeschränkt. Jedes Gerät in Deinem Heimnetz hat eine weltweit eindeutige IPv6-Adresse, und genau darauf baut der erste Lösungsweg auf.

Den Anschlusstyp erkennen

In der FRITZ!Box siehst Du es am schnellsten in der Übersicht der Benutzeroberfläche unter http://fritz.box. Bei den Verbindungen steht bei DS-Lite ausdrücklich, dass IPv4 über DS-Lite läuft, oft mit dem Zusatz „DS-Lite-Tunnel“. Ausführlicher zeigt es Internet > Online-Monitor, wo die IPv4- und die IPv6-Verbindung getrennt aufgeführt sind.

Unabhängig vom Router klappt der Vergleich im Terminal. Öffne auf dem Mac das Terminal (oder auf einem Linux-Rechner eine Shell) und frag ab, mit welcher Adresse Du im Internet auftauchst:

Code
curl -4 https://ifconfig.co
curl -6 https://ifconfig.co

Der erste Befehl zeigt Deine öffentliche IPv4-Adresse, der zweite Deine öffentliche IPv6-Adresse. Vergleich das Ergebnis mit der IPv4-Adresse, die die FRITZ!Box im Online-Monitor für ihre Internetverbindung anzeigt:

  • Beide IPv4-Adressen stimmen überein: Du hast eine eigene öffentliche IPv4-Adresse, eine normale Portfreigabe funktioniert. Liegt das Problem trotzdem vor, prüf die Firewall auf dem Server.
  • Die FRITZ!Box zeigt eine Adresse zwischen 100.64.0.0 und 100.127.255.255 oder gar keine öffentliche IPv4-Adresse: Du hast CGNAT oder DS-Lite.
  • Der zweite Befehl liefert eine Adresse, die mit 2 oder 3 beginnt: IPv6 funktioniert, und die IPv6-Freigabe ist für Dich eine Option. Kommt dort eine Fehlermeldung, hat Dein Rechner keine IPv6-Verbindung ins Internet.

Die fünf Wege im Überblick

WegWas er löstVoraussetzungLaufende Kosten
Echte IPv4 beim Provideralles, wie früherProvider bietet es anje nach Tarif
IPv6-PortfreigabeZugriff von IPv6-fähigen GerätenIPv6 am Anschlusskeine
Tailscaleprivater Zugriff für Dich und Deine FamilieApp auf jedem Gerätim privaten Rahmen kostenlos
Cloudflare Tunnelöffentliche Websites und Web-Appseigene Domain bei Cloudflarekostenlos für den Grundbedarf
VPS als Relayalles inklusive Spieleserver, per IPv4kleiner Server mit IPv4ein paar Euro im Monat

Weg 1: Beim Provider nachfragen

Der direkteste Weg ist ein Anruf. Manche Anbieter stellen auf Nachfrage auf echtes Dual-Stack mit eigener IPv4-Adresse um, teils kostenlos, teils gegen Aufpreis oder nur in Geschäftskundentarifen. Frag konkret nach „Dual-Stack mit öffentlicher IPv4-Adresse statt DS-Lite“. Die Bedingungen ändern sich regelmäßig, deshalb lohnt der Anruf auch dann, wenn ein Bekannter beim selben Anbieter vor zwei Jahren eine Absage bekommen hat.

Weg 2: IPv6-Freigabe

Bei DS-Lite hat Dein Server bereits eine öffentliche IPv6-Adresse. Die FRITZ!Box blockiert eingehende Verbindungen nur mit ihrer Firewall, und eine IPv6-Freigabe öffnet genau einen Port für genau ein Gerät. Das kostet nichts und braucht keinen fremden Dienst. Der Haken: Nur Geräte mit IPv6 erreichen den Server. Die großen deutschen Mobilfunknetze liefern IPv6, viele Hotel-, Firmen- und Gäste-WLANs dagegen nicht. Die Schritte folgen weiter unten.

Weg 3: Tailscale für private Zugriffe

Tailscale baut ein privates Netz aus WireGuard-Verbindungen zwischen Deinen Geräten auf. Weil jedes Gerät die Verbindung von sich aus aufbaut, spielt DS-Lite keine Rolle, und es ist kein einziger Port offen. Für alles, was nur Du und ein paar Vertraute nutzen, also Home Assistant, NAS, SSH oder eine Kamera, ist das der sicherste und einfachste Weg. Auf einem Linux-Server ist Tailscale laut offizieller Installationsanleitung mit zwei Befehlen eingerichtet:

Code
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Der zweite Befehl gibt einen Link aus, mit dem Du den Server in Deinem Tailscale-Konto anmeldest. Wie das am Beispiel Home Assistant im Detail aussieht, zeigt der Artikel Home Assistant von unterwegs: Tailscale oder Cloudflare.

Weg 4: Cloudflare Tunnel für Webdienste

Soll eine Website oder Web-App öffentlich erreichbar sein, ohne dass jeder Besucher eine App installiert, ist ein Cloudflare Tunnel die bequemste Lösung. Das Programm cloudflared läuft bei Dir zu Hause, baut eine ausgehende Verbindung zu Cloudflare auf und nimmt darüber die Anfragen an Deine Domain entgegen. Du brauchst dafür eine eigene Domain, deren DNS bei Cloudflare liegt. Zwei Einschränkungen solltest Du kennen: Cloudflare entschlüsselt den Verkehr auf seinen Servern und sieht ihn damit im Klartext, und für Nicht-Web-Dienste wie Spieleserver ist der Tunnel nicht gedacht.

Weg 5: Ein VPS als Relay

Der universelle Weg ist ein kleiner gemieteter Server mit eigener öffentlicher IPv4-Adresse. Dein Heimserver baut zu ihm einen WireGuard-Tunnel auf, und der VPS reicht ausgewählte Ports durch diesen Tunnel nach Hause weiter. Für die Außenwelt sieht das aus wie eine normale Portfreigabe, auch für reine IPv4-Geräte und auch für Spieleserver. Die Konfiguration steht weiter unten.

Welcher Weg für welchen Fall

Du willst …Empfehlung
Home Assistant, NAS oder SSH nur für Dich und die FamilieTailscale
eine Website oder einen Blog öffentlich betreibenCloudflare Tunnel
Nextcloud oder Immich für Freunde, die keine App installieren sollenVPS als Relay, sonst Cloudflare Tunnel
einen Minecraft- oder anderen Spieleserver betreibenVPS als Relay
ohne fremden Dienst auskommen und alle Nutzer haben IPv6IPv6-Freigabe
dass einfach alles wie früher funktioniertbeim Provider nach Dual-Stack fragen

Meine Empfehlung für die meisten Heimnetze: Tailscale für alles Private und erst dann einen zweiten Weg, wenn wirklich Fremde zugreifen sollen.

IPv6-Freigabe in der FRITZ!Box Schritt für Schritt

Die folgenden Schritte gelten für FRITZ!OS 8. Auf älteren Versionen heißen die Menüs ähnlich, nur einzelne Schaltflächen sind anders angeordnet.

  1. Öffne http://fritz.box im Browser und melde Dich an.
  2. Geh zu Internet > Freigaben und dort auf den Reiter Portfreigaben.
  3. Klick auf Gerät für Freigaben hinzufügen und wähle Deinen Server aus der Liste.
  4. Im Dialog siehst Du unten die IPv6-Adressen des Geräts und die IPv6 Interface-ID. Das ist der hintere Teil der Adresse, der auch dann gleich bleibt, wenn Dein Provider das IPv6-Präfix wechselt. Die FRITZ!Box nutzt die Interface-ID, damit die Freigabe einen Präfixwechsel übersteht.
  5. Klick auf Neue Freigabe und wähle Portfreigabe.
  6. Wähle als Anwendung Andere Anwendung, gib einen Namen ein, als Protokoll TCP und als Port den Dienst Deines Servers, zum Beispiel 443 für HTTPS.
  7. Setz das Häkchen für die Freigabe über IPv6. Das IPv4-Häkchen bringt bei DS-Lite nichts.
  8. Bestätige mit OK und speichere den Gerätedialog ebenfalls mit OK.

Auf dem Server selbst muss der Dienst auf IPv6 lauschen und die lokale Firewall den Port erlauben. Bei einem Linux-Server mit aktivem ufw erledigt das:

Code
sudo ufw allow 443/tcp

Prüf anschließend, welche globale IPv6-Adresse der Server dauerhaft nutzt:

Code
ip -6 addr show scope global

Nimm die Adresse ohne den Zusatz temporary. Temporäre Adressen wechseln regelmäßig aus Datenschutzgründen und sind für einen Server ungeeignet. Stimmt ihr hinterer Teil mit der Interface-ID aus der FRITZ!Box überein, passt alles zusammen.

Damit Du Dir die lange Adresse nicht merken musst, brauchst Du einen Hostnamen, der auf sie zeigt. Am einfachsten geht das mit einer MyFRITZ!-Freigabe für das Gerät oder mit einem DynDNS-Dienst, der einen AAAA-Eintrag aktualisiert. Wichtig ist, dass der Name auf die IPv6-Adresse des Servers zeigt und nicht auf die der FRITZ!Box.

So prüfst Du, ob es funktioniert

Ein Test aus dem eigenen WLAN sagt nichts aus, weil die Anfrage die FRITZ!Box-Firewall gar nicht von außen passiert. Schalte am Smartphone das WLAN aus, sodass es über das Mobilfunknetz surft, und öffne die Adresse dort im Browser. Alternativ testest Du von einem anderen Anschluss aus im Terminal:

Code
curl -6 -I https://dein-server.example.de

Ersetze dein-server.example.de durch Deinen Hostnamen. Antwortet der Server mit einer Zeile wie HTTP/2 200 oder einer Weiterleitung, ist die Freigabe aktiv.

VPS-Relay mit WireGuard: das Grundgerüst

Für diesen Weg brauchst Du einen kleinen Linux-Server mit öffentlicher IPv4-Adresse, etwa ein Droplet bei DigitalOcean (Affiliate Link) mit Ubuntu. Die kleinste Größe reicht, weil der VPS nur Pakete weiterreicht. Wie Du WireGuard auf dem Droplet installierst und Schlüssel erzeugst, erklärt die Anleitung WireGuard-VPN auf einem Ubuntu-Droplet einrichten. Hier geht es nur um die Konfiguration, die aus dem VPN ein Relay macht.

Installiere WireGuard auf beiden Seiten und erzeuge auf jeder Seite ein eigenes Schlüsselpaar:

Code
sudo apt install wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

Auf dem VPS legst Du mit sudo nano /etc/wireguard/wg0.conf diese Datei an. Das Beispiel leitet den Minecraft-Port 25565 nach Hause weiter:

Code
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = VPS_PRIVATE_KEY
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.2:25565
PostUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.2:25565
PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE

[Peer]
PublicKey = HEIM_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32

Ersetze VPS_PRIVATE_KEY durch den Inhalt der Datei privatekey auf dem VPS und HEIM_PUBLIC_KEY durch den Inhalt von publickey auf dem Heimserver. eth0 ist bei DigitalOcean die Netzwerkkarte mit der öffentlichen Adresse, bei anderen Anbietern prüfst Du den Namen mit ip addr. Die MASQUERADE-Zeile sorgt dafür, dass die Antworten Deines Heimservers zuverlässig durch den Tunnel zurückgehen. Speichere mit Strg + O, bestätige mit Enter und schließe mit Strg + X.

Auf dem Heimserver sieht /etc/wireguard/wg0.conf so aus:

Code
[Interface]
Address = 10.8.0.2/24
PrivateKey = HEIM_PRIVATE_KEY

[Peer]
PublicKey = VPS_PUBLIC_KEY
Endpoint = VPS_IP:51820
AllowedIPs = 10.8.0.1/32
PersistentKeepalive = 25

VPS_IP ist die öffentliche IPv4-Adresse des Droplets. PersistentKeepalive hält den Tunnel offen, denn bei DS-Lite kann nur Dein Heimserver die Verbindung aufbauen, nicht umgekehrt. Starte den Tunnel auf beiden Seiten und richte ihn als Dienst für den Systemstart ein:

Code
sudo systemctl enable --now wg-quick@wg0

Mit sudo wg show siehst Du auf beiden Seiten einen Eintrag latest handshake mit einer Zeit von wenigen Sekunden, wenn der Tunnel steht. Ist auf dem VPS ufw aktiv, gibst Du dort noch UDP-Port 51820 und den weitergeleiteten Port frei. Für eine Website leitest Du statt 25565 die Ports 80 und 443 weiter und lässt den A-Eintrag Deiner Domain auf die IP des VPS zeigen. Das Zertifikat holt sich dann weiterhin Dein Heimserver, weil Let’s Encrypt ihn über den weitergeleiteten Port 80 erreicht.

Diese Konfiguration ist das Grundgerüst nach der offiziellen WireGuard-Schnellstartanleitung. Sie leitet bewusst nur die Ports weiter, die Du einträgst, sodass der VPS sonst nichts von Deinem Heimnetz preisgibt.

Wenn es trotzdem nicht klappt

  • Die IPv6-Freigabe funktioniert nur im eigenen WLAN: Der Test lief nicht von außen. Teste über Mobilfunk ohne WLAN.
  • Nach ein paar Tagen ist der Server unter IPv6 nicht mehr erreichbar: Der Provider hat das Präfix gewechselt, und Dein DNS-Eintrag zeigt noch auf die alte Adresse. Prüf, ob die MyFRITZ!-Freigabe oder Dein DynDNS-Dienst den AAAA-Eintrag aktualisiert.
  • Manche Freunde erreichen den Server, andere nicht: Die anderen haben kein IPv6. Für sie hilft nur Tailscale, ein Cloudflare Tunnel oder das VPS-Relay.
  • Der WireGuard-Tunnel steht, aber der weitergeleitete Port antwortet nicht: Prüf mit sudo iptables -t nat -L -n -v, ob die DNAT-Regel angelegt ist, und ob der Dienst auf dem Heimserver auch auf der Tunneladresse 10.8.0.2 lauscht und nicht nur auf 127.0.0.1.

Wenn Du den Server ohnehin nur selbst nutzt, lohnt ein Blick auf den Artikel Tailscale Exit Node: unterwegs über den Pi surfen. Dort wird aus demselben Tailscale-Netz zusätzlich ein Werbeblocker für unterwegs, und Du hast mit einer einzigen Einrichtung zwei Probleme gelöst.

Weiterlesen.