Die Entmystifizierung der SSH-Portweiterleitung: Lokale, Remote- und Dynamische Tunnel erklärt.
Lernen Sie lokale, Remote- und dynamische SSH-Portweiterleitung mit praktischen Befehlen für Datenbanken, Web-Apps und SOCKS-Proxys.
SSH-Portweiterleitung verständlich erklärt: Lokale, Remote- und dynamische Tunnel
SSH-Portweiterleitung ermöglicht es Ihnen, einen Netzwerkdienst über eine verschlüsselte SSH-Verbindung zu erreichen, anstatt diesen Dienst direkt freizugeben. Sie werden dies in der Regel verwenden, wenn eine Datenbank, ein Dashboard oder ein Entwicklungsserver von einem SSH-Host aus erreichbar ist, aber nicht von Ihrem Laptop aus.
Die drei gängigen Formen sind lokale Weiterleitung, Remote-Weiterleitung und dynamische Weiterleitung. Sie verwenden eine ähnliche Syntax, aber der Lauschport befindet sich an einer anderen Stelle.
Was SSH-Portweiterleitung bewirkt
SSH-Portweiterleitung, auch bekannt als SSH-Tunneling, leitet Datenverkehr von einem Host und Port zu einem anderen Host und Port durch Ihre SSH-Sitzung um. Das Ziel wird von der Seite aufgelöst, die die endgültige Verbindung herstellt. Bei der lokalen Weiterleitung stellt der SSH-Server eine Verbindung zum Ziel her. Bei der Remote-Weiterleitung stellt Ihr SSH-Client eine Verbindung zum Ziel her.
Dies bietet mehrere Vorteile:
- Sicherheit: Verschlüsselt Datenverkehr, der andernfalls unverschlüsselt zwischen Ihrem Client und dem Zieldienst wäre.
- Zugriffskontrolle: Ermöglicht den Zugriff auf Dienste, die in privaten Netzwerken oder hinter Firewalls laufen und von Ihrem aktuellen Standort aus nicht direkt erreichbar sind.
- Netzwerkbrücken: Verbindet verschiedene Netzwerksegmente sicher.
Lokale Portweiterleitung (-L)
Die lokale Portweiterleitung ist die häufigste Art. Sie ermöglicht es Ihnen, Verbindungen von einem Port auf Ihrem lokalen Rechner zu einem Port auf einem entfernten Rechner über einen SSH-Server weiterzuleiten. Im Wesentlichen lassen Sie einen Dienst, der im entfernten Netzwerk läuft, so erscheinen, als ob er auf Ihrem lokalen Rechner läuft.
Funktionsweise:
- Sie starten einen SSH-Client auf Ihrem lokalen Rechner.
- Sie geben einen lokalen Port (
local_port) an, auf dem SSH lauschen soll. - Jede Verbindung, die zu
local_portauf Ihrem lokalen Rechner hergestellt wird, wird über die SSH-Verbindung an denremote_hostundremote_portweitergeleitet.
Syntax:
ssh -L [local_bind_address:]local_port:remote_host:remote_port [user@]ssh_server_host
local_bind_address: Optionale Adresse auf Ihrem lokalen Rechner, an die gebunden werden soll. Wenn nicht angegeben, bindet OpenSSH normalerweise an Loopback-Adressen, sofern Ihre Client-Konfiguration nichts anderes vorgibt.local_port: Der Port auf Ihrem lokalen Rechner, auf dem SSH lauschen soll.remote_host: Der Hostname oder die IP-Adresse des Zielrechners, mit dem der SSH-Server eine Verbindung herstellen soll.remote_port: Der Port auf demremote_host, an den der Datenverkehr geleitet werden soll.user@ssh_server_host: Ihr Benutzername und der Hostname/die IP-Adresse des SSH-Servers, mit dem Sie sich verbinden.
Praktischer Anwendungsfall: Zugriff auf einen Datenbankserver, der auf einer privaten IP-Adresse eines entfernten Servers läuft.
Stellen Sie sich einen Datenbankserver (z. B. PostgreSQL auf 192.168.1.100:5432) vor, der nur von Ihrem internen Firmennetzwerk aus erreichbar ist. Sie können die lokale Portweiterleitung verwenden, um von Ihrem Laptop zu Hause aus darauf zuzugreifen:
ssh -L 5433:192.168.1.100:5432 your_user@your_ssh_server.com
- Dieser Befehl verbindet Sie mit
your_ssh_server.com. - Er öffnet Port
5433auf Ihrem lokalen Rechner (standardmäßiglocalhost). - Jede Verbindung zu
localhost:5433wird überyour_ssh_server.coman192.168.1.100:5432weitergeleitet.
Jetzt können Sie Ihren lokalen Datenbank-Client so konfigurieren, dass er eine Verbindung zu localhost:5433 herstellt, und der Datenverkehr wird sicher zum entfernten Datenbankserver getunnelt.
Tipp: Verwenden Sie ssh -N, um einen Tunnel zu erstellen, ohne einen entfernten Befehl auszuführen. Dies ist nützlich für Hintergrundtunnel.
ssh -N -L 5433:192.168.1.100:5432 your_user@your_ssh_server.com
Remote-Portweiterleitung (-R)
Die Remote-Portweiterleitung ermöglicht es Ihnen, Verbindungen von einem Port auf dem entfernten SSH-Server zu einem Port auf Ihrem lokalen Rechner oder einem anderen von Ihrem lokalen Rechner aus erreichbaren Rechner weiterzuleiten. Dies ist nützlich, um einen auf Ihrem lokalen Rechner laufenden Dienst für den entfernten Server oder dessen Netzwerk zugänglich zu machen.
Funktionsweise:
- Sie starten einen SSH-Client auf Ihrem lokalen Rechner.
- Sie geben einen entfernten Port (
remote_port) auf dem SSH-Server an, auf dem SSH lauschen soll. - Jede Verbindung, die zu
remote_portauf dem SSH-Server hergestellt wird, wird über die SSH-Verbindung zurück zu Ihrem lokalen Rechner und dann zu einem bestimmtendestination_hostunddestination_portweitergeleitet.
Syntax:
ssh -R [remote_bind_address:]remote_port:destination_host:destination_port [user@]ssh_server_host
remote_bind_address: (Optional) Die Adresse auf dem SSH-Server, an die der Lauschport gebunden werden soll. Standardmäßiglocalhost(d. h. nur der SSH-Server selbst kann eine Verbindung zu diesem Port herstellen). Verwenden Sie0.0.0.0oder*, um anderen Rechnern im entfernten Netzwerk die Verbindung zu ermöglichen.remote_port: Der Port auf dem SSH-Server, auf dem SSH lauschen soll.destination_host: Der Hostname oder die IP-Adresse des Zielrechners, mit dem Ihr SSH-Client eine Verbindung herstellen soll (oftlocalhost, wenn sich der Dienst auf Ihrem lokalen Rechner befindet).destination_port: Der Port auf demdestination_host, an den der Datenverkehr geleitet werden soll.user@ssh_server_host: Ihr Benutzername und der Hostname/die IP-Adresse des SSH-Servers, mit dem Sie sich verbinden.
Praktischer Anwendungsfall: Bereitstellen eines lokalen Webservers für ein entferntes Netzwerk.
Angenommen, Sie entwickeln eine Webanwendung auf Ihrem Laptop und möchten sie einem Kollegen demonstrieren, der nur Zugriff auf Ihr internes Firmennetzwerk hat, und Sie haben einen SSH-Server (your_ssh_server.com), der von diesem Netzwerk aus erreichbar ist.
Auf Ihrem Laptop würden Sie Folgendes ausführen:
ssh -R 8080:localhost:3000 your_user@your_ssh_server.com
- Dieser Befehl verbindet Sie mit
your_ssh_server.com. - Er weist
your_ssh_server.coman, auf Port8080zu lauschen. - Jede Verbindung zu
your_ssh_server.com:8080wird über den SSH-Tunnel zurück zu Ihrem Laptop (localhost) auf Port3000weitergeleitet (wo Ihr Webserver läuft).
Jetzt kann Ihr Kollege über die URL http://your_ssh_server.com:8080 in seinem Browser auf Ihre Webanwendung zugreifen. Der Datenverkehr gelangt von seinem Browser zum SSH-Server, durch den Tunnel zu Ihrem Laptop und dann zu Ihrem Webserver.
Warnung: In typischen OpenSSH-Konfigurationen ist der remote_port nur vom SSH-Server selbst aus erreichbar. Um anderen Rechnern im entfernten Netzwerk den Zugriff auf den weitergeleiteten Port zu ermöglichen, setzen Sie remote_bind_address explizit auf 0.0.0.0 oder * und stellen Sie sicher, dass der SSH-Server dies mit einer GatewayPorts-Einstellung wie clientspecified oder yes erlaubt.
ssh -R 0.0.0.0:8080:localhost:3000 your_user@your_ssh_server.com
Dynamische Portweiterleitung (-D)
Die dynamische Portweiterleitung erstellt einen SOCKS-Proxy auf Ihrem lokalen Rechner. Dies ist wohl die flexibelste Art, da sie es Ihnen ermöglicht, jede Anwendung, die SOCKS-Proxys unterstützt, durch Ihre SSH-Verbindung zu tunneln. Anstatt einen bestimmten Port weiterzuleiten, lauscht SSH auf einem lokalen Port und fungiert als SOCKS-Proxy-Server.
Funktionsweise:
- Sie starten einen SSH-Client auf Ihrem lokalen Rechner.
- Sie geben einen lokalen Port (
local_port) an, auf dem SSH als SOCKS-Proxy lauschen soll. - Sie konfigurieren Ihre Anwendungen (Webbrowser usw.) so, dass sie
localhost:local_portals ihren SOCKS-Proxy verwenden. - Wenn eine Anwendung eine Anfrage über diesen Proxy stellt, leitet SSH den Datenverkehr an den SSH-Server weiter, der dann die Verbindung zum endgültigen Ziel im Namen Ihrer Anwendung herstellt.
Syntax:
ssh -D [local_bind_address:]local_port [user@]ssh_server_host
local_bind_address: (Optional) Die Adresse auf Ihrem lokalen Rechner, an die der Lauschport des SOCKS-Proxys gebunden werden soll. Standardmäßiglocalhost.local_port: Der Port auf Ihrem lokalen Rechner, auf dem SSH als SOCKS-Proxy lauschen soll.user@ssh_server_host: Ihr Benutzername und der Hostname/die IP-Adresse des SSH-Servers, mit dem Sie sich verbinden.
Praktischer Anwendungsfall: Sicheres Surfen im Internet über ein öffentliches WLAN.
Wenn Sie mit einem nicht vertrauenswürdigen öffentlichen WLAN-Netzwerk verbunden sind, ist Ihr Datenverkehr gefährdet. Sie können die dynamische Portweiterleitung verwenden, um Ihren gesamten Webbrowsing-Datenverkehr über eine verschlüsselte SSH-Verbindung zu einem vertrauenswürdigen Server zu tunneln.
Führen Sie auf Ihrem Laptop Folgendes aus:
ssh -D 1080 your_user@your_trusted_server.com
- Dieser Befehl verbindet Sie mit
your_trusted_server.com. - Er öffnet Port
1080auf Ihrem lokalen Rechner, der als SOCKS-Proxy fungiert.
Konfigurieren Sie als Nächstes Ihren Webbrowser oder eine andere Anwendung so, dass ein SOCKS-Proxy unter localhost auf Port 1080 verwendet wird. Wenn die Anwendung eine SOCKS5-Remote-DNS-Option hat, verwenden Sie diese, wenn Sie nicht möchten, dass DNS-Abfragen in Ihrem lokalen Netzwerk erfolgen.
Ihr Browser-Datenverkehr wird an Ihren SSH-Server gesendet, der dann eine Verbindung zur Zielseite herstellt. HTTPS ist weiterhin wichtig; der SSH-Tunnel schützt den Pfad zu Ihrem SSH-Server, nicht jeden Hop danach.
Tipp: Sie können -D mit -C für Komprimierung kombinieren, was bei langsameren Netzwerkverbindungen von Vorteil sein kann.
ssh -C -D 1080 your_user@your_trusted_server.com
Erweiterte Überlegungen und bewährte Methoden
- SSH-Server-Konfiguration (
sshd_config): Einige Weiterleitungsfunktionen erfordern eine Berechtigung auf der Serverseite. Überprüfen SieAllowTcpForwarding,PermitOpen,PermitListenundGatewayPorts, bevor Sie davon ausgehen, dass ein Tunnel überall lauschen oder eine Verbindung herstellen kann. - Firewalls: Denken Sie daran, dass Firewalls auf dem Client, dem Server oder zwischengeschalteten Netzwerken SSH-Verbindungen oder die für die Weiterleitung verwendeten Ports blockieren können. Stellen Sie sicher, dass die erforderlichen Ports (normalerweise 22 für SSH selbst) geöffnet sind.
- Sicherheit: Obwohl die Portweiterleitung den Datenverkehr verschlüsselt, hängt die Sicherheit des Tunnels von der Sicherheit Ihres SSH-Servers ab. Verwenden Sie starke SSH-Schlüssel, deaktivieren Sie die Passwortauthentifizierung und halten Sie Ihren SSH-Server auf dem neuesten Stand.
- Zuverlässigkeit: Fügen Sie für Skripte
-o ExitOnForwardFailure=yeshinzu, damit SSH beendet wird, wenn die angeforderte Weiterleitung nicht erstellt werden kann. Erwägen Sie für langlebige Tunnelautosshoder einen überwachten Dienst.
Fazit
Verwenden Sie -L, wenn Ihr Laptop einen privaten entfernten Dienst erreichen muss. Verwenden Sie -R, wenn ein entfernter Host etwas in der Nähe Ihres Laptops erreichen muss. Verwenden Sie -D, wenn Sie einen SOCKS-Proxy über einen vertrauenswürdigen SSH-Server benötigen. Halten Sie Bindungen eng, überprüfen Sie die Serverrichtlinie und behandeln Sie jeden Tunnel als vorübergehende Netzwerköffnung.