Zuerst prüfen, was Sie haben
Führen Sie das auf dem Rechner aus, den Sie erreichen wollen, oder sehen Sie auf der Statusseite Ihres Routers nach:
curl -4 https://ifconfig.me # the public IPv4 others see
curl -6 https://ifconfig.me # the public IPv6, if you have one
ip -6 addr show scope global # IPv6 addresses on this machine
Suchen Sie dann die WAN-Adresse auf der Statusseite des Routers. Weicht sie von dem ab, was der erste Befehl zeigt, steht vor Ihnen bei Ihrem Anbieter ein weiteres NAT. Eine Adresse von 100.64.0.0 bis 100.127.255.255 auf der WAN-Seite ist ein starkes Zeichen für CGNAT, denn RFC 6598 reserviert diesen Bereich dafür.
Die Möglichkeiten
| Voraussetzung | Funktioniert hinter CGNAT | Grenzen | |
|---|---|---|---|
| VPN oder Overlay | Software auf beiden Seiten. Eine erreichbare Gegenstelle oder ein Koordinationsdienst | Ja | Die Software muss auf jedem Gerät installiert sein, von dem Sie sich verbinden |
| Reverse-SSH-Tunnel | Ein Server mit öffentlicher Adresse | Ja | Der zusätzliche Server trägt den Verkehr |
| IPv6 | Globales IPv6 auf dem Rechner und im Netz, von dem Sie sich verbinden | Ja, wenn der Anbieter IPv6 liefert | Scheitert aus reinen IPv4-Netzen. Die Firewall muss es erlauben |
| Portweiterleitung im Router | Eine öffentliche IPv4 am Router und Zugriff auf dessen Einstellungen | Nein | Der Port ist zum Internet offen. Die Adresse kann sich ändern |
VPN oder Overlay-Netz
WireGuard
WireGuard ist ein VPN, das Sie selbst betreiben. Hinter CGNAT verbindet sich der versteckte Rechner nach außen mit einer Gegenstelle, die eine öffentliche Adresse hat, und das Keepalive hält die NAT-Zuordnung offen. Die Quick Start von WireGuard schlägt 25 Sekunden vor. Auf dem versteckten Rechner, /etc/wireguard/wg0.conf:
[Interface]
Address = 10.0.0.2/24
PrivateKey = HIDDEN_MACHINE_PRIVATE_KEY
[Peer]
PublicKey = PUBLIC_PEER_PUBLIC_KEY
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25
Auf der Gegenstelle mit der öffentlichen Adresse:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = PUBLIC_PEER_PRIVATE_KEY
[Peer]
PublicKey = HIDDEN_MACHINE_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32
Erzeugen Sie die Schlüssel mit wg genkey | tee priv | wg pubkey > pub, starten Sie jede Seite mit sudo wg-quick up wg0 und verbinden Sie sich von der Gegenstelle aus mit ssh user@10.0.0.2. UDP 51820 muss dort offen sein. Wir haben diese beiden Dateien zwischen Containern laufen lassen, und die SSH-Anmeldung über 10.0.0.2 funktionierte. Nur die Gegenstelle braucht eine öffentliche Adresse.
Tailscale
Tailscale ist ein auf WireGuard aufgebautes Overlay-Netz mit einem gehosteten Koordinationsdienst und einem Konto. Unter Linux, laut Dokumentation:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
Tun Sie dasselbe auf Ihrem eigenen Gerät und verbinden Sie sich dann per SSH mit der zugewiesenen Adresse, die tailscale ip -4 auf dem versteckten Rechner anzeigt. Tailscale versucht zuerst eine direkte Verbindung zwischen den Geräten, und sein Artikel zu NAT-Traversal sagt, dass das hinter CGNAT schwieriger ist. Scheitern direkte Wege, läuft der Verkehr über die DERP-Relays, Ende-zu-Ende-verschlüsselt.
Reverse-SSH-Tunnel
Dafür brauchen Sie nur SSH und einen Server mit öffentlicher Adresse, etwa 203.0.113.10. Auf dem versteckten Rechner:
ssh -N -o ExitOnForwardFailure=yes -R 2222:localhost:22 user@203.0.113.10
Von Ihrem Laptop aus:
ssh -J user@203.0.113.10 -p 2222 hiddenuser@localhost
Einzelheiten stehen unter Reverse-SSH-Tunnel. Wie er nach einem Abbruch automatisch neu startet und wie Sie den verwendeten Schlüssel einschränken, steht unter autossh und systemd.
Die Option -J erklärt ProxyJump und Jump-Hosts.
IPv6
CGNAT betrifft IPv4, und manche Anbieter, die es einsetzen, vergeben auch globale IPv6-Adressen. Zeigt ip -6 addr show scope global eine an, versuchen Sie es aus einem Netz mit IPv6:
ssh user@2001:db8::10
Router oder Anbieter blockieren eingehendes IPv6 möglicherweise, daher kann ein Timeout bedeuten, dass die Firewall eine Regel für Port 22 braucht. Siehe Connection timed out. Auch das Netz, von dem aus Sie sich verbinden, muss IPv6 haben, und manche Büro- und Hotelnetze haben es nicht. Ändert sich Ihre Adresse, hilft ein dynamischer DNS-Name.
Portweiterleitung im Router
Das funktioniert, wenn der Router eine echte öffentliche IPv4-Adresse hat. Leiten Sie in seinen Einstellungen einen äußeren TCP-Port auf Port 22 des Rechners weiter und verbinden Sie sich dann mit der öffentlichen Adresse des Routers:
ssh -p 2222 user@203.0.113.10
Hinter CGNAT bewirkt das nichts, weil die öffentliche Adresse Ihrem Anbieter gehört. Manche Anbieter geben auf Anfrage eine öffentliche IPv4, manchmal gegen Gebühr, nachzufragen kann sich also lohnen. Ein offener Port erhält außerdem ständig Anmeldeversuche aus dem Internet, verwenden Sie daher nur Schlüssel. Siehe SSH-Passwort-Anmeldung deaktivieren und fail2ban.
Fragen
Wie erkenne ich, ob ich hinter CGNAT bin?
Vergleichen Sie die WAN-Adresse Ihres Routers mit der Adresse, die Seiten wie ifconfig.me sehen. Weichen sie ab oder liegt die WAN-Adresse zwischen 100.64.0.0 und 100.127.255.255, nutzt Ihr Anbieter CGNAT.
Komme ich ohne VPN per SSH auf einen Rechner hinter CGNAT?
Ja, mit einem Reverse-SSH-Tunnel zu einem Server mit öffentlicher Adresse. Der versteckte Rechner baut die Verbindung nach außen auf, und Sie erreichen ihn über diesen Server.
Funktioniert Portweiterleitung am Router hinter CGNAT?
Nein. Die öffentliche Adresse gehört dem Anbieter, nicht Ihrem Router, es gibt also nichts weiterzuleiten. Fragen Sie den Anbieter nach einer öffentlichen IPv4 oder nutzen Sie eine der anderen Lösungen.
Quellen
- RFC 6598, Shared Address Space
- WireGuard Quick Start
- Install Tailscale on Linux
- How NAT traversal works, Tailscale
- ssh(1), OpenBSD-Handbuch