SSH Port Forwarding, Proxy & VPN

SSH kann mehr als nur Konsolenverbindung. Proxy und schmalspur VPN!

SSH Port Forwarding, Proxy & VPN

SSH wird im Regelfall für die Konsolenverbindung zu Servern verwendet. Dass SSH aber auch als Proxy oder gar für Schmalspur-VPN Lösungen verwendet werden kann, ist nicht immer bekannt.
Zeit für ein paar Beispiele!

Remote Port per Tunnel lokal binden

Eine Anwendung (MariaDB) läuft auf einem Remote-Host, ist aber 127.0.0.1:3306 gebunden. Möchte man diese nun lokal verfügbar machen um zum Beispiel mittels MySQL Client zu zugreifen, bindet man einen Port X lokal und jeglicher Traffic zu diesem wird mittels SSH zum Remote Server weitergeschickt. Hier ein Paar Beispiele unter der Annahme, dass der eigene Host die IP-Adresse 192.168.123.2 gebunden hat und der remote.host eine IP-Adresse im, oder eine Route zum Netz 172.16.0.0/24 besitzt. In diesem Beispiel hat remote1.host die IP-Adresse 172.16.0.1 und remote2.host 172.16.0.2.

ssh -L [local_bind_address:]port:host:hostport root@remote.host

# MySQL von remote.host lokal holen
ssh user@remote1.host -L 192.168.123.2:3306:127.0.0.1:3306 
ssh user@remote1.host -L 127.0.0.1:3306:127.0.0.1:3306
ssh user@remote1.host -L 192.168.123.2:13306:127.0.0.1:3306
ssh user@remote1.host -L 3306:127.0.0.1:3306

# HTTP Traffic zu Host hinter remote.host
ssh user@remote1.host -L 127.0.0.1:8080:172.16.0.2:80
ssh user@remote1.host -L 192.168.123.2:1234:172.16.0.2:1234

Die linke Seite des "-L" Parameters gibt das lokale Port-Binding an (welcher Port lokal gebunden wird). Die rechte Seite gibt das Ziel des Traffics an, also die Adresse des Servers, oder eines weiteren Hosts, der von remote1.host erreicht werden kann.

Wichtig zu verstehen ist hierbei, dass ein Host der den Traffic von remote1.host erhält, auch dessen IP-Adresse als Quell-IP sieht. Dies kann Firewall- oder Dienst-Konfigurationen wie zum Beispiel MySQL Berechtigungen betreffen.

SSH SOCK5 Proxy

Mittels SOCK5-Protokoll können Anwendungen einen beliebigen Host als Proxy verwenden, um über diesen bestimmte Netze (oder das Internet) zu erreichen.
Der SSH Client kann einen solchen Proxy bereitstellen und ausgehender Traffic wird vom remote.host ausgehend weitergeleitet:

ssh user@remote1.host -D [bind_address:]port
ssh user@remote1.host -D 127.0.0.1:5000
ssh user@remote1.host -D 192.168.123.2:1337

SSH bindet sich lokal an die IP:Port vom -D Parameter. Dieser kann beliebig gewählt werden, darf nur nicht bereits belegt sein, oder unter 1024 liegen (falls man unprivilegierter Benutzer ist).

SSHuttle

Auch gerne als "poor man's VPN" bezeichnet, können mittels der Python Anwendung SSHuttle mehrere IP-Adressen und Netze über eine SSH Verbindung erreicht werden. Hierzu hinterlegt SSHuttle NF- oder IPTables Regeln die ausgehenden Traffic an die Python Anwendung umleitet und diese durch die SSH Verbindung tunnelt. Der Remote-Host leitet dann den Traffic weiter, sofern er eine Route für die Zieladressen hat.

Hierbei sind die Möglichkeiten allerdings auf TCP beschränkt!

sshuttle -r user@remote1.host 10.20.30.0/24 192.168.33.5/32 my.host.com

Die Installation ist auf der Projektseite (siehe Links) beschrieben und die meisten Distributionen haben bereits Pakete bereitstehen.


https://github.com/sshuttle/sshuttle