SSH zu einem Server ohne öffentliche IP oder hinter CGNAT

Etwas muss die Verbindung von außen hereintragen. Das kann ein VPN oder Overlay-Netz wie WireGuard oder Tailscale sein, ein Reverse-SSH-Tunnel zu einem Server mit öffentlicher Adresse oder IPv6, wenn beide Seiten es haben. Eine Portweiterleitung im Router funktioniert auch, aber nicht hinter CGNAT, weil Ihr Router dann keine öffentliche Adresse hat, von der aus weitergeleitet werden könnte.

Steht der Weg einmal, merkt sich Wardterm ihn, und der versteckte Rechner öffnet sich wie jeder andere Server. Zeigen

Aktualisiert am . Die beiden WireGuard-Dateien wurden zwischen zwei Debian-13-Containern mit wireguard-tools ausgeführt, und eine SSH-Anmeldung über 10.0.0.2 hat funktioniert.

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

VoraussetzungFunktioniert hinter CGNATGrenzen
VPN oder OverlaySoftware auf beiden Seiten. Eine erreichbare Gegenstelle oder ein KoordinationsdienstJaDie Software muss auf jedem Gerät installiert sein, von dem Sie sich verbinden
Reverse-SSH-TunnelEin Server mit öffentlicher AdresseJaDer zusätzliche Server trägt den Verkehr
IPv6Globales IPv6 auf dem Rechner und im Netz, von dem Sie sich verbindenJa, wenn der Anbieter IPv6 liefertScheitert aus reinen IPv4-Netzen. Die Firewall muss es erlauben
Portweiterleitung im RouterEine öffentliche IPv4 am Router und Zugriff auf dessen EinstellungenNeinDer 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

Mehr zu Tunnel und Jump-Hosts

Alle Anleitungen