SSH-Tunnel: Dienste erreichen, ohne sie ins Internet zu stellen
SSH ist mehr als eine Shell auf einem fernen Rechner. Die verschlüsselte Verbindung kann auch beliebige TCP-Verbindungen durchreichen – ein Tunnel. Damit lassen sich Admin-Oberflächen nutzen, die von außen gar nicht erreichbar sind.
Das Problem
Die Weboberfläche eines Servers (Virtualisierung, Datenbank-Verwaltung, Proxy-Admin) soll nur der Administrator sehen. Steht sie offen im Internet, wird sie automatisch gefunden und mit Passwörtern angegriffen. Besser: Der Port bleibt zu, und man geht durch den SSH-Tunnel hinein.
Local Forward (-L): der Standardfall
ssh -N -L 8006:127.0.0.1:8006 admin@server.example.org
Danach im Browser https://localhost:8006 öffnen. Die drei Teile von -L:
| Teil | Bedeutung |
8006 (links) | Port auf deinem Rechner, an dem du dich anschließt |
127.0.0.1 | Ziel-Adresse, aus Sicht des Servers aufgelöst |
8006 (rechts) | Port des Ziels |
Wichtig ist der zweite Teil: „127.0.0.1“ heißt hier nicht dein Rechner, sondern der Server. So erreicht man auch Rechner hinter dem Server, die selbst keine öffentliche Adresse haben:
ssh -N -L 8081:10.0.0.20:8081 admin@server.example.org # Container im internen Netz
-N startet keine Shell, die Verbindung dient nur dem Tunnel. Mit -f läuft er im Hintergrund.
Bequem: ~/.ssh/config
Host server1
HostName 203.0.113.10
User admin
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 30
ServerAliveCountMax 4
LocalForward 8006 127.0.0.1:8006
LocalForward 8081 10.0.0.20:8081
Ab jetzt reicht ssh -N server1. ServerAliveInterval sendet regelmäßig ein Lebenszeichen, damit ein Router den ruhigen Tunnel nicht abbaut.
Weitere Tunnelarten
- Sprungserver (-J / ProxyJump):
ssh -J admin@bastion.example.org admin@10.0.0.20 – erst zum Server mit öffentlicher Adresse, von dort weiter ins interne Netz.
- Dynamic Forward (-D):
ssh -N -D 1080 admin@server.example.org macht den Server zum SOCKS-Proxy (siehe unten).
- Remote Forward (-R):
ssh -R 9000:localhost:3000 admin@server.example.org – ein lokaler Dienst wird auf dem Server erreichbar. Nützlich zum Testen, aber sicherheitlich heikel: Man macht selbst eine Tür auf.
Und die IP verbergen?
Hier wird oft etwas vermischt. Ein SSH-Tunnel verbirgt je nach Richtung etwas anderes:
| Was? | Verborgen? |
Deine eigene IP gegenüber Webseiten (bei -D als SOCKS-Proxy) | Ja: Die Webseite sieht die IP des Servers. Dein Internetanbieter sieht nur verschlüsselten Verkehr zum Server. |
Interne Dienste des Servers (bei -L) | Ja: Sie sind von außen nicht erreichbar und tauchen in keinem Portscan auf. Es bleibt nur SSH sichtbar. |
| Die IP des Servers selbst | Nein. Sie ist öffentlich, und der SSH-Port ist erreichbar. |
Test für den SOCKS-Fall:
ssh -N -D 1080 admin@server.example.org
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me # zeigt die IP des Servers
Im Browser (z. B. Firefox) unter Netzwerkeinstellungen: SOCKS-Host 127.0.0.1, Port 1080, SOCKS v5, und „Proxy-DNS bei Verwendung von SOCKS v5“ aktivieren. Sonst gehen die Namensanfragen an dir vorbei durchs normale Netz.
Kein Anonymitätswerkzeug: Der Betreiber des Servers sieht den gesamten Verkehr, und die Verbindung lässt sich dem SSH-Konto zuordnen. Für den Schutz in fremden WLANs ist das gut, für Anonymität nicht.
Prüfen und Fehler finden
ss -tlnp | grep 8006 # lauscht der lokale Port?
curl -k https://127.0.0.1:8006 # antwortet das Ziel? (-k: selbstsigniertes Zertifikat)
ssh -v -N server1 # ausführliche Ausgabe, wenn etwas hakt
- „bind: Address already in use“: Der lokale Port ist belegt (alter Tunnel läuft noch). Anderen Port wählen oder den alten Prozess beenden.
- „channel open failed: administratively prohibited“: Der Server verbietet Weiterleitungen. Prüfen, ob
AllowTcpForwarding no gesetzt ist.
- Zertifikatswarnung im Browser: Bei selbstsignierten Zertifikaten normal, denn der Name
localhost passt nicht zum Zertifikat.
- Der Tunnel bindet standardmäßig nur an
127.0.0.1. Andere Rechner im WLAN können ihn nicht mitbenutzen (das ändert erst -L 0.0.0.0:… oder die Option -g).
Auf dem Server absichern
Beim Härten von SSH sollte AllowTcpForwarding yes bleiben, sonst funktioniert kein Tunnel. Wer genauer sein will, erlaubt nur bestimmte Ziele:
# /etc/ssh/sshd_config.d/20-tunnel.conf
AllowTcpForwarding yes
PermitOpen 127.0.0.1:8006 10.0.0.20:8081
Wenn der Tunnel dauerhaft laufen soll
Für Dauerbetrieb eignen sich autossh oder ein systemd-Dienst mit Restart=always. Im Alltag reicht meist ssh -N server1 in einem Terminal. Für mehrere Nutzer oder viele Dienste ist ein VPN wie WireGuard bequemer.
Was nicht öffentlich sein muss, wird nicht öffentlich. Interne Dienste bleiben auf 127.0.0.1 oder im privaten Netz, und der Zugriff läuft durch den Tunnel.