Tunneln mit SSH

Am 11.09.2021 um 22:54
von ridcully, Kategorie: Blog, Tags: Administration ssh

SSH ist eines der mächtigsten Tools für den Systemadministrator und das Schweizer Taschenmesser eines Administrators. Heutzutage wird nahezu jeder Server mit SSH verwaltet. Ausnahmen laufen mit Windows...

Eine der bekanntesten SSH-Implementierungen ist PuTTy, das die meisten Windows-Nutzer kennen werden. Auch wenn PuTTy sämtliche Proxy Möglichkeiten unterstützt, soll das hier nicht Thema sein. Wir schauen uns direkt das SSH-Kommando an, wie es unter Linux und OSX zur Verfügung steht.

Zum Verwalten wird eine Remote-Shell genutzt, doch eigentlich kann SSH wesentlich mehr, als nur eine Kommandozeile anzubieten. Somit ist auch eine der spannendsten Funktionen, die Möglichkeit beliebige Daten durch eine aktive SSH-Verbindung zu tunneln.

Um Daten zu Tunneln, bietet SSH im wesentlichen drei Möglichkeiten:

  1. Weiterleitung eines Lokalen-Ports an einen Remote-Port.
  2. Weiterleitung eines Remote-Ports an einen Lokalen-Port.
  3. Ein dynamischer (SOCKS-Proxy) Port der beliebigen Internet-Verkehr weiter leiten kann.

Die ersten beiden erlauben das Weiterleiten eines einzelnen Ports. Die Dritte baut einen regulären Socks-Proxy auf, der alle Daten durch die SSH-Verbindung leiten kann. Doch schauen wir uns erst die einfachen Weiterleitungen zuerst an.

Lokalen-Port weiterleiten

Die lokale Port-Weiterleitung bindet einen auf dem Server verfügbaren Port an einen lokalen Port. Das Kommando sieht wie folgt aus:

ssh user@server -L localport:host:port

Darüber kann man z. B. auf eine MySQL-Datenbank auf einem Server zugreifen:

ssh user@server -L 3306:localhost:3306

Wobei der host vom Server aus aufgelöst wird. Es ist also auch möglich auf einen Port auf einem anderen Server in dem Remote-Netzwerk zuzugreifen. So könnte man sich in das Firmen-Netzwerk per SSH Verbinden und anschließend alle Server in dem LAN auch lokal auf dem Rechner verfügbar machen.

Remote-Port weiterleiten

Die Remote-Port-Weiterleitung funktioniert genau umgekehrt zur lokalen Weiterleitung. Somit kann ein Dienst aus dem lokalen Netzwerk auf einem Remote-Server verfügbar gemacht werden. Diese Art des Tunnels wird von den Meisten wahrscheinlich sehr selten, oder gar nicht verwendet. Das Kommando ist entsprechend:

ssh user@server -R remoteport:host:port

Interessant wäre es z. B. einen lokalen Dienst auf einem Remote-Server zugänglich zu machen. Somit weiß der Server nicht, wo z. B. eine Datenbank gehostet wird. Jedenfalls nicht, so lange die Verbindung nicht aufgebaut wurde. Reale Anwendungen sind meist rar.

Dynamische Weiterleitung

Die dynamische Weiterleitung erstellt einen lokalen Socks-Proxy. Dieser kann mit jeder Software die einen entsprechenden Proxy unterstützt genutzt werden. Alle Verbindungen werden dann durch die SSH-Verbindung getunnelt. Zu beachten ist, dass DNS-Auflösung meistens lokal auf dem Rechner ausgeführt werden, und somit Hostnamen aus dem Remote-Netzwerk nicht verfügbar sind. Einen dynamische Weiterleitung kann mit dem folgenden Kommando aufgebaut werden:

ssh user@server -D port

Der Aufruf eines Proxies braucht lediglich einen Port, der lokal zur Verfügung gestellt wird. Auf dem Server wird kein Port benötigt.

Weitere nützliche Parameter

Möchte man nur einen Tunnel aufbauen kann man weitere Parameter verwenden. So ist z. B. eine Remote-Shell nicht notwendig. Mit dem Parameter -N wird keine Shell gestartet. Weiterhin kann man -q (quiet, still) verwenden, um die Konsolen-Ausgaben so gering wie möglich zu halten. Mit -C wird der Datenverkehr komprimiert. Dies ist nur nützlich, wenn der getunnelte Datenverkehr nicht bereits komprimiert ist. Es kann aber helfen die übertragenen Datenmengen gering zu halten.

ssh -N -q -C  -D port user@server

Build @ 2022-11-05T23:02:03+01:00