Ssh Socks Proxy

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Prinzip

ssh-proxy

Beispiel

  • Problem: nas-system hat kein Default Gateway
  • Auf ssh-host wird ein SocksProxy aktiviert
  • Es wird gleichzeitig ein Tunnel zu jump-host geöffnet
  • Dieser SocksProxy öffnet den Port 1080
  • Alle Anfragen auf diesen Proxy werden gehen durch den Tunnel
  • Wenn sie den Tunnel verlassen bekommen sie die Absende Addresse von jump-host
  • Antwort Pakete von Servern werden wieder durch den Tunnel zurück geschickt
  • Und abschliessend dann vom SocksProxy zu den Clients
  • Man kann also nun auf dem Notebook den SocksProxy im Browser eintragen
  • Danach kann man auf die Weboberfläche des nas-systems zugreifen

Auf ssh-host lokal

  • ssh -fnD 1080 root@jump-host -N

Auf ssh-host global

  • ssh -fnD "*:1080" root@jump-host -N

Erklärung der Optionen

-f → Startet SSH im Hintergrund, nachdem ggf. ein Passwort eingegeben wurde. Praktisch, wenn die Session nur als Tunnel läuft und man nicht am Terminal hängen will.

-n → Leitet stdin nach /dev/null um. Verhindert, dass SSH Eingaben von der Shell entgegennimmt. Wird oft zusammen mit -f genutzt.

-N → Weist SSH an, keine Remote-Kommandos auszuführen. Der Tunnel bleibt bestehen, aber es wird keine Shell auf dem Ziel geöffnet.

-D [Bindadresse:]Port → Aktiviert einen SOCKS-Proxy auf dem angegebenen Port. Beispiel -D 1080: bindet lokal auf 127.0.0.1:1080. Mit -D *:1080 (bzw. "*:1080") auch auf allen Interfaces (global erreichbar).


Beenden

  • fuser -vkn tcp 1080

Socksify

Eine weitere SSH-Verbindung über den SocksProxy schicken (ohne Dante)

  • Man will nicht nur den Browser, sondern auch eine zweite SSH-Verbindung durch den bestehenden SocksProxy (s.o., Port 1080) tunneln.
  • Ohne zusätzliches Paket geht das über SSHs eigene ProxyCommand-Option plus nc aus dem Paket netcat-openbsd (das beherrscht SOCKS selbst über die Optionen -X/-x):
  • ssh -o ProxyCommand="nc -X 5 -x 127.0.0.1:1080 %h %p" -p 8472 root@zielhost

Wie es funktioniert

  • ProxyCommand sagt SSH: Statt selbst eine TCP-Verbindung zum Ziel aufzubauen, einen Befehl starten und über dessen stdin/stdout mit dem Server reden. SSH ersetzt %h durch den Zielhost und %p durch den Zielport.
  • nc -X 5 -x 127.0.0.1:1080 %h %p verbindet sich zum lokalen SocksProxy (SOCKS Version 5) und weist ihn an, intern zu %h:%p weiterzuverbinden.
  • Das lokale ssh merkt davon nichts und baut seinen normalen Handshake/Login einfach über diese durchgereichte Leitung auf.

Hinweis: Options-Reihenfolge

  • -p <port> kann bei ssh sowohl vor als auch nach user@host stehen, beides wird korrekt ausgewertet. Schlägt die Verbindung scheinbar grundlos fehl, liegt es meist woanders: falscher Port/IP auf der Zielseite, SocksProxy (-D) läuft nicht mehr, oder Firewall zwischen Proxy und Ziel.

Alternative: Dante/Socksify

  • Tunnelt beliebige Programme global über LD_PRELOAD, siehe Dante Client. Lohnt sich, wenn man nicht nur SSH, sondern viele/beliebige Programme proxifizieren will; für nur SSH ist die ProxyCommand-Variante schlanker, da kein zusätzliches Paket/Config-File nötig ist.