Port Forwarding
Remote Port per Tunnel lokal binden
Per SSH kann prinzipiell jeder TCP-Port getunnelt werden, den der Remote-Host erreicht.
Hierzu wird auf dem Client ein Port lokal gebunden und jeglicher Traffic der auf diesen eingeht, durch den Tunnel zum Remote-Host geleitet.
Dieser stellt dann stellvertredend die Verbindung zum Ziel her.
Syntax
ssh -L [local_bind_address:]port:host:hostport root@remote.host
Beispiel 1
MariaDB wird über diverse lokalen IP-Adressen und Ports verfügbar gemacht.
Auf dem Remote-Host host1 ist MariaDB nur lokal erreichbar (127.0.0.1:3306).
Die linke Seite entspricht der lokalen IP (oder Port) des Clients.
ssh user@host1 -L 127.0.0.1:3306:127.0.0.1:3306
ssh user@host1 -L 192.168.123.2:3306:127.0.0.1:3306
ssh user@host1 -L 192.168.123.2:13306:127.0.0.1:3306
ssh user@host1 -L 3306:127.0.0.1:3306
Beispiel 2
Ein Webserver (HTTP/S) läuft auf web1, welcher von host1 erreicht werden kann (ein typischer Jumphost):
- IP-Adresse web1: 192.168.55.2
- IP-Adresse host1: 192.168.55.1
ssh user@host1 -L 127.0.0.1:80:192.168.55.2:80
ssh user@host1 -L 127.0.0.1:443:192.168.55.2:443
Weil die Ports 80 und 443 zu den “well-known” Ports gehören, müssen diese ggf. mit root-Rechten gebunden werden (sudo vor dem ssh Befehl).
Deswegen kann es empfehlenswert sein, diese stattdessen auf Ports größer 1024 zu binden:
ssh user@host1 -L 127.0.0.1:8080:192.168.55.2:80
ssh user@host1 -L 127.0.0.1:8443:192.168.55.2:443
SSH SOCK5 Proxy
Anwendungen können (sofern unterstützt) über einen sogenannten Sock5-Proxy mit Servern kommunizieren.
Hierbei wird der Traffic an den Remote-Host gesendet und dieser schickt die Anfrage weiter zum Ziel.
Syntax
ssh user@host1 -D [lokale_bind_address:]port
Beispiel 1
Der Sock5-Proxy bindet sich lokal auf Port 5000.
ssh user@host1 -D 127.0.0.1:5000
Beispiel 2
Lokaler Proxy, der auch von anderen Clients genutzt werden kann, sofern Sie den Host und Port erreichen können.
ssh user@host1 -D 192.168.178.2:1337
SShuttle
Gerne als “poor man’s VPN” bezeichnet, kann SShuttle (eine Python Anwendung) bestimmte Ziel-Adressen (oder Netze) über SSH tunneln.
Hierzu bindet SShuttle einen lokalen Port und hinterlegt Firewall-Regeln (nftables / iptables). Hierdurch werden Pakete zum Ziel an den lokalen SShuttle Port umgeleitet (DNAT), und SShuttle leitet diese wiederum zum Remote-Host.
Dieser schickt die Pakete dann dann zum Ziel(netz).
Durch diese Technik können ganze IP-Netze hinter (Jump-)Hosts erreicht werden, solange es sich um TCP-Traffic handelt.
Syntax
sshuttle [-l [ip:]port] -r [user@]sshserver[:port] <subnets...>
Beispiel 1
Die Netze 10.20.30.0, 192.168.33.0/25
und die IP-Adresse 1.1.1.1 sollen über host1 verfügbar gemacht werden:
sshuttle -r user@host1 10.20.30.0/24 192.168.33.0/25 1.1.1.1