Dienste über SSH-Tunnel weiterleiten
Diese Anleitung erklärt, wie Sie einen Dienst auf einem entfernten Linux-Server per SSH-Port-Forwarding (ssh -L) über einen Zwischenserver erreichbar machen. Der Datenverkehr ist verschlüsselt, und Sie benötigen nur einen Standard-OpenSSH-Client.
Das Konzept
SSH-Tunneling funktioniert als dreiteilige Kette. Stellen Sie es sich wie eine Weiterleitung über einen Relay-Server vor — Sie verbinden sich mit dem mittleren Server, der den Datenverkehr transparent an das Ziel weiterleitet:
| Teil | Rolle | Beispiel |
|---|---|---|
| Near | Der Client, der den Dienst nutzen möchte — verbindet sich mit dem weitergeleiteten Port auf Middle | Ihr Laptop / Workstation |
| Middle | Der Zwischenserver, auf dem Sie den ssh-Befehl ausführen — er öffnet den weitergeleiteten Port | 209.239.112.134 |
| Far | Das eigentliche Ziel — der Server, auf dem der Dienst läuft; Middle verbindet sich per SSH mit ihm | server935 |
Der entscheidende Vorteil: Far muss nicht öffentlich erreichbar sein. Solange Middle zu Far und Sie zu Middle eine Verbindung aufbauen können, schlägt der Tunnel die Brücke.
SSH-Flags erklärt
Der Tunnel-Befehl nutzt folgende SSH-Flags:
| Flag | Bedeutung |
|---|---|
| -N | Kein Remote-Befehl ausführen — die Verbindung bleibt ausschließlich für das Port-Forwarding offen, ohne in eine Shell zu wechseln. |
| -L | Lokales Port-Forwarding — öffnet einen Port auf dem Rechner, auf dem Sie ssh ausführen (hier: der mittlere Server), und leitet den Datenverkehr durch die SSH-Verbindung zum Zielserver weiter. Format: bind-address/lokaler-port/ziel-server/ziel-port |
| -f | Optional — startet SSH im Hintergrund. In Kombination mit -N läuft der Tunnel als Hintergrundprozess. |
| -v | Optional — ausführliche Ausgabe, hilfreich bei der Fehlersuche. |
Der Befehl
Allgemeine Syntax
Führen Sie den Befehl auf dem mittleren Server aus und ersetzen Sie die Platzhalter durch Ihre tatsächlichen Server-Adressen, IP-Adressen und Portnummern:
Konkretes Beispiel
Auf dem mittleren Server ausgeführt, öffnet dieser Befehl Port 110 auf dessen IP 209.239.112.134 und leitet alle Verbindungen zu Port 22 (SSH) auf dem Zielserver (server935) weiter:
Jede Verbindung zu 209.239.112.134:110 wird transparent zu server935:22 weitergeleitet — der SSH-Dienst des Zielservers ist damit über den mittleren Server erreichbar.
Tunnel im Hintergrund starten
Mit dem Flag -f wird der Tunnel im Hintergrund gestartet, sodass das Terminal frei bleibt:
Um einen Hintergrund-Tunnel zu beenden, ermitteln Sie die Prozess-ID und beenden den Prozess:
Der Tunnel bleibt aktiv, solange die SSH-Verbindung aufrechterhalten wird. Bricht die Verbindung ab, muss der Befehl erneut ausgeführt werden. Für persistente Tunnel mit automatischem Reconnect empfiehlt sich das Tool autossh.
Typische Anwendungsfälle
Fehlerbehebung
| Problem | Ursache & Lösung |
|---|---|
| Verbindung zum weitergeleiteten Port wird abgelehnt | Der Tunnel läuft nicht, oder die Firewall des mittleren Servers blockiert den Port. Prüfen Sie den ssh-Prozess und öffnen Sie den Port in iptables oder nftables auf dem mittleren Server. |
| Tunnel verbindet sich, bricht aber sofort ab | SSH-Keepalive ist möglicherweise nicht konfiguriert. Fügen Sie ServerAliveInterval 30 in ~/.ssh/config hinzu. |
| Port-Forwarding wird vom Server abgelehnt | Der SSH-Server, mit dem Sie sich verbinden (der Zielserver), hat möglicherweise AllowTcpForwarding no in seiner /etc/ssh/sshd_config. Setzen Sie den Wert auf yes und starten Sie den SSH-Dienst neu. |
| Bind an die IP des mittleren Servers schlägt fehl | Ports unter 1024 (z. B. 110) kann nur root öffnen, und der Port darf nicht bereits belegt sein. Prüfen Sie außerdem, ob die Bind-Adresse eine IP des mittleren Servers ist. Ohne explizite Bind-Adresse bindet SSH nur an localhost. |
Weiterführende Dokumentation
Die vollständige Referenz aller SSH-Port-Forwarding-Optionen finden Sie im offiziellen OpenSSH-Handbuch.