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