SSH-Tunneling erklärt: Sicherer Zugriff auf entfernte Dienste
Nutzen Sie SSH-Tunneling, um private Datenbanken, Web-Apps und entfernte Dienste mit lokalem, remoteem und dynamischem Forwarding zu erreichen.
SSH-Tunneling erklärt: Sicherer Zugriff auf entfernte Dienste
SSH-Tunneling hilft Ihnen, entfernte Dienste zu erreichen, ohne diese Dienste dem Internet auszusetzen. Wenn Ihre Datenbank, Ihr Admin-Dashboard oder Ihr Entwicklungsserver nur über einen Bastion-Host erreichbar ist, kann ein SSH-Tunnel Ihren lokalen Tools einen sicheren Pfad dorthin bieten.
Die Hauptmuster sind lokales Forwarding, remotees Forwarding und dynamisches Forwarding. Jedes beantwortet eine andere Frage: Müssen Sie etwas Remotees erreichen, etwas Lokales freigeben oder einen SOCKS-Proxy erstellen?
Was ist SSH-Tunneling?
SSH-Tunneling verpackt Anwendungsverkehr in eine SSH-Verbindung. Anstatt sich direkt mit einem Dienst zu verbinden, verbinden Sie sich mit einem lokalen oder remote weitergeleiteten Port. SSH transportiert diesen Verkehr durch die verschlüsselte Sitzung und stellt die Verbindung zum endgültigen Ziel von der richtigen Seite des Tunnels her.
Der Tunnel verschlüsselt den Verkehr zwischen Ihrem SSH-Client und dem SSH-Server. Wenn das endgültige Ziel jenseits des SSH-Servers liegt, verwendet dieses letzte Teilstück die Sicherheitsmaßnahmen, die der Zieldienst bietet. Für sensible Dienste behalten Sie TLS oder native Verschlüsselung bei, auch wenn Sie tunneln.
Arten von SSH-Tunneln
SSH bietet drei Hauptarten der Portweiterleitung, die jeweils einem anderen Zweck dienen:
1. Lokales Port-Forwarding (-L)
Lokales Port-Forwarding ist die häufigste Art. Es ermöglicht Ihnen, Verkehr von einem Port auf Ihrem lokalen Rechner an einen Port auf einem remote Rechner (oder einem Rechner, der vom remote SSH-Server aus erreichbar ist) weiterzuleiten. Dies ist ideal, um auf Dienste zuzugreifen, die im internen Netzwerk eines remote Servers oder auf dem Server selbst laufen und von Ihrem lokalen Netzwerk aus nicht direkt erreichbar sind.
So funktioniert es: Der SSH-Client hört auf Ihrem Rechner. Der SSH-Server stellt die Verbindung zum Ziel her.
Anwendungsfall: Zugriff auf eine MySQL-Datenbank auf Port 3306, die nur der Bastion-Host erreichen kann.
Befehlssyntax:
ssh -L [LOKALER_PORT]:[ZIEL_HOST]:[ZIEL_PORT] [SSH_BENUTZER]@[SSH_SERVER]
Beispiel:
Angenommen, Sie haben eine MySQL-Datenbank, die auf db.internal.example.com (Port 3306) läuft, und Sie können sich nur per SSH bei bastion.example.com anmelden. Um von Ihrem lokalen Rechner aus auf die Datenbank auf Port 8888 zuzugreifen:
ssh -L 8888:db.internal.example.com:3306 [email protected]
Nachdem Sie diesen Befehl ausgeführt haben, können Sie Ihren lokalen MySQL-Client öffnen und eine Verbindung zu localhost:8888 herstellen. Der Verkehr wird sicher durch bastion.example.com zu db.internal.example.com:3306 getunnelt.
Verwenden Sie -N, wenn Sie keine remote Shell benötigen:
ssh -N -L 8888:db.internal.example.com:3306 [email protected]
Fügen Sie für Skripte -o ExitOnForwardFailure=yes hinzu, damit SSH beendet wird, wenn der lokale Listener nicht erstellt werden kann.
2. Remote Port-Forwarding (-R)
Remote Port-Forwarding macht das Gegenteil des lokalen Forwardings. Es ermöglicht Ihnen, Verkehr von einem Port auf dem remote SSH-Server an einen Port auf Ihrem lokalen Rechner oder einem von Ihrem lokalen Rechner aus erreichbaren Rechner weiterzuleiten. Dies ist nützlich, um einen Dienst, der auf Ihrem lokalen Rechner (oder einem Rechner in Ihrem lokalen Netzwerk) läuft, für den remote Server oder dessen Netzwerk freizugeben.
So funktioniert es: Der SSH-Server hört auf einem remote Port. Ihr SSH-Client stellt von Ihrer Seite des Tunnels aus die Verbindung zum Ziel her.
Anwendungsfall: Einem remote Kollegen Zugriff auf einen Webentwicklungsserver zu ermöglichen, der auf Ihrem lokalen Rechner läuft (z. B. eine Flask-App auf Port 5000), ohne Ihren lokalen Rechner direkt dem Internet auszusetzen.
Befehlssyntax:
ssh -R [REMOTE_PORT]:[ZIEL_HOST]:[ZIEL_PORT] [SSH_BENUTZER]@[SSH_SERVER]
Beispiel:
Angenommen, Sie betreiben eine Webanwendung auf Ihrem lokalen Rechner unter localhost:5000. Sie möchten einem Benutzer auf remote.example.com erlauben, darauf zuzugreifen, indem er sich mit Port 9000 auf remote.example.com verbindet.
ssh -R 9000:localhost:5000 [email protected]
In typischen OpenSSH-Konfigurationen ist der remote Listener nur auf der Loopback-Schnittstelle des SSH-Servers verfügbar. Das bedeutet, dass Benutzer auf dem remote Host localhost:9000 testen können, aber andere Rechner nicht unbedingt remote.example.com:9000 erreichen können.
Um den Listener für andere Rechner freizugeben, benötigen Sie normalerweise eine Bind-Adresse wie 0.0.0.0 im Befehl und eine serverseitige GatewayPorts-Einstellung wie clientspecified oder yes. Seien Sie vorsichtig: Remote-Forwarding kann Dienste auf Ihrem Laptop oder lokalen Netzwerk für das remote Netzwerk freigeben.
3. Dynamisches Port-Forwarding (-D)
Dynamisches Port-Forwarding erstellt einen SOCKS-Proxy auf Ihrem lokalen Rechner. Anstatt Verkehr an ein bestimmtes Ziel weiterzuleiten, ermöglicht es Anwendungen, die für die Verwendung dieses SOCKS-Proxys konfiguriert sind, eine Verbindung zu jedem Host und Port herzustellen, der vom SSH-Server aus erreichbar ist. Dies macht Ihre SSH-Verbindung effektiv zu einem vielseitigen Proxy-Server.
So funktioniert es: Ihr SSH-Client fungiert als SOCKS-Proxy. Anwendungen, die SOCKS unterstützen, senden Anfragen an diesen lokalen Proxy, und der SSH-Server stellt die ausgehende Verbindung her.
Anwendungsfall: Sicheres Surfen im Internet über ein öffentliches WLAN, indem Sie Ihren gesamten Browserverkehr über einen SSH-Server zu Hause oder im Büro leiten. Dies verschlüsselt Ihre Surfaktivitäten.
Befehlssyntax:
ssh -D [LOKALER_PORT] [SSH_BENUTZER]@[SSH_SERVER]
Beispiel:
Um einen SOCKS-Proxy auf Ihrem lokalen Rechner zu erstellen, der auf Port 1080 hört:
ssh -D 1080 [email protected]
Nachdem Sie diesen Befehl ausgeführt haben, konfigurieren Sie Ihren Browser oder eine andere Anwendung so, dass ein SOCKS-Proxy unter localhost:1080 verwendet wird. Wenn die Anwendung remote DNS über SOCKS5 unterstützt, aktivieren Sie dies, wenn DNS-Privatsphäre wichtig ist.
Praktische Anwendungen und Vorteile
SSH-Tunneling bietet eine breite Palette praktischer Anwendungen:
- Sicherer Datenbankzugriff: Zugriff auf Datenbanken (wie PostgreSQL, MySQL oder MongoDB), die nur von einem bestimmten Server in einem privaten Netzwerk aus erreichbar sind, ohne den Datenbankport direkt dem Internet auszusetzen.
- Zugriff auf interne Webdienste: Verbindung zu internen Webanwendungen, administrativen Schnittstellen oder Überwachungs-Dashboards, die nicht öffentlich zugänglich sind.
- Sicherung unverschlüsselter Protokolle: Verpacken unsicherer Protokolle wie VNC, FTP oder einfaches HTTP in einen verschlüsselten SSH-Tunnel, um Vertraulichkeit und Integrität zu gewährleisten.
- Arbeiten mit Netzwerkbeschränkungen: Zugriff auf Dienste über einen Server, der diese erreichen darf. Tun Sie dies nur, wenn es mit der Netzwerkrichtlinie Ihrer Organisation übereinstimmt.
- Sichere Remote-Entwicklung: Bereitstellung eines sicheren Zugriffs auf Entwicklungsumgebungen oder Tools, die auf remote Servern laufen.
Fazit
Verwenden Sie lokales Forwarding, wenn Ihr Laptop Zugriff auf einen privaten remote Dienst benötigt. Verwenden Sie remote Forwarding, wenn ein remote Host vorübergehend Zugriff auf einen Dienst in Ihrer Nähe benötigt. Verwenden Sie dynamisches Forwarding, wenn Sie einen SOCKS-Proxy über einen vertrauenswürdigen SSH-Server benötigen. Halten Sie den Tunnel so eng wie möglich und schließen Sie ihn, wenn die Aufgabe erledigt ist.