SSH-Tunnel bauen und sicher surfen

120px Totley Tunnel western portal wlan windows verschlüsselung ubuntu tunnelbau tunnel telnet sshd ssh tunnel ssh squid SMTP sicherheit shell server Secure Shell rdp putty Proxy server proxy netzwerk midori localhost linux http howto hotspot hotel firewall firefox encrypt Domain Name System DNS browser bash 3128 Ein SSH-Tunnel ist ein gesicherter Kanal, der Netzwerk-Protokolle einbetten und verschlüsselt übertragen kann. Der Tunnel führt dabei meist von einem Rechner innerhalb eines fremden, potenziell unsicheren Netzwerks zu einem Server bzw. Netz des Vertrauens. Durch diese Form der  Portweiterleitung können TCP-Protokolle wie HTTP, Telnet, SMTP oder RDP durch ein fremdes Netz hindurch vertraulich genutzt bzw. überhaupt erst zugänglich gemacht werden.

Gründe zum Bau eines Tunnels

Der Bau eines SSH-Tunnels macht Sinn, wenn man sich als mobiler Nutzer mit einem Notebook o.ä. physisch in unbekannten Netzen bewegt (Hotel, Cafe oder Hotspot) und deshalb eine Verschlüsselung des Netzverkehrs wünscht.
Ein weiterer Grund für den Bau eines SSH-Tunnels kann die Firewall bzw. ein anderer Filtermechanismus des fremden Netzes sein, welcher evtl. nicht bei allen Protokollen (Ports, Webseiten…) mitspielen will und den Zugriff auf bestimmte Dienste des entfernten Servers verweigert. Der SSH-Tunnel kann diese Einschränkung umgehen, indem er die Daten des blockierten Protokolls rein über den SSH-Port (i.d.R. Port 22) schickt und sich so trotzdem mit dem gewünschten Dienst verbindet.

800px SSHtunnel wlan windows verschlüsselung ubuntu tunnelbau tunnel telnet sshd ssh tunnel ssh squid SMTP sicherheit shell server Secure Shell rdp putty Proxy server proxy netzwerk midori localhost linux http howto hotspot hotel firewall firefox encrypt Domain Name System DNS browser bash 3128

„Veranschaulichung SSH Tunneling“ von Christian Mueller; lizenziert unter Creative Commons-Lizenz Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Unported. Bild anklicken für weitere Lizenzdetails.

Voraussetzung für den Tunnel ist eine funktionierende SSH-Verbindung auf den Server des Vertrauens (im Schaubild hinter der „Firewall 2“). Erlaubt die Fremdnetz-Firewall (im Schaubild „Firewall 1“) die SSH-Verbindung, kann im Prinzip jeder auf dem Server nutzbare Dienst verschlüsselt durch das „unsichere“ Netz getunnelt werden.

SSH-Tunnel: Firewall umgehen und verschlüsselt über Proxy surfen

Das folgenden Szenario zeigt exemplarisch, wie ein SSH-Tunnel zum eigenen, entfernten Proxy (z.B. Squid, Port 3128) aufgebaut wird, z.B. weil die Firewall des Hotels bestimmte Webseiten aus übertriebener Vorsicht blockiert hat oder der schniefende Hotelier W. Eiershark nicht unser Vertrauen genießt. Mit dem SSH-Tunnel auf den eigenen Proxy soll die Sperre umgangen werden und/oder das Surfvergnügen vor neugierigen Augen im Fremdnetz geschützt werden:

ich@hotel: ssh nutzer@meinserver -L 4444:meinserver:3128

Nach der Eingabe des SSH-Passworts ist nun der Port 3128 der entfernten Maschine „meinserver“ an den frei gewählten Port 4444 auf dem lokalen Rechner (im Hotelzimmer) gebunden. Im Schaubild oben wurden die Ports 15900 – 15904 benutzt. Das symbolische „meinserver“ muss natürlich individuell angepasst werden, z.B. mit der  IP-Adresse des Zielservers.

Noch einen Tick sicherer geht es mit der Option -N. Diese beschränkt die  SSH-Verbindung rein auf ihre Tunnelfunktion und unterbindet die Ausführung von weiteren Befehlen. Mit der Option -f wird SSH in den Hintergrund geschickt. Und mit -C fragen wir eine Komprimierung an, um die Datenübertragung zu beschleunigen. Komprimierung ist jedoch nur sinnvoll, wenn der Flaschenhals eine lahme Verbindung ist. Bei schwachbrüstigen Rechnern kann die Komprimierung soviel Ressourcen beanspruchen, dass sich der Effekt umkehrt. Die optimierte Version des Tunnelbaus könnte also so aussehen:

ich@hotel: ssh -fCN nutzer@meinserver -L 4444:meinserver:3128

Alternative: Tunnelbau mit PuTTy

Als grafische Alternative zum Tunnelbau bietet sich PuTTy an, das für Linux und Windows frei erhältlich ist. Nach der Installation werden zunächst im Sitzungsmenü Zielserver und Zielport für SSH angegeben:

putty1 wlan windows verschlüsselung ubuntu tunnelbau tunnel telnet sshd ssh tunnel ssh squid SMTP sicherheit shell server Secure Shell rdp putty Proxy server proxy netzwerk midori localhost linux http howto hotspot hotel firewall firefox encrypt Domain Name System DNS browser bash 3128

Danach legt man im Untermenü  „SSH“  und dann „Tunnels“ den lokalen Port 4444 sowie Zielrechner und Zielport fest (meinserver:3128):

putty2 wlan windows verschlüsselung ubuntu tunnelbau tunnel telnet sshd ssh tunnel ssh squid SMTP sicherheit shell server Secure Shell rdp putty Proxy server proxy netzwerk midori localhost linux http howto hotspot hotel firewall firefox encrypt Domain Name System DNS browser bash 3128

Dann noch auf „Add“ klicken und den Tunnel durch Eingabe des SSH-Passworts öffnen.

Browsereinstellungen anpassen

Ob Kommandozeile oder PuTTy: Nun muss man nur noch dem Browser beibringen, dass er als Proxy „localhost:4444“ nutzen soll. Alle Anfragen an „meinserver:3128“ laufen danach über Port 4444 des lokalen Rechners und werden von dort durch das unsichere Netz verschlüsselt an den Proxy auf „meinserver“ getunnelt – und zurück. Für den Webbrowser Midori z.B. ändert man die Einstellungen wie folgt:

netzwerk einstellungen fc3bcr midori1 wlan windows verschlüsselung ubuntu tunnelbau tunnel telnet sshd ssh tunnel ssh squid SMTP sicherheit shell server Secure Shell rdp putty Proxy server proxy netzwerk midori localhost linux http howto hotspot hotel firewall firefox encrypt Domain Name System DNS browser bash 3128

Man kann nun prüfen, ob alles geklappt hat, indem man z.B. What is my IP ansurft. Wenn nun die IP-Adresse von „meinserver“ angezeigt wird, dann werden alle Browseranfragen verschlüsselt zum Proxy getunnelt. Manche Proxies geben jedoch die Ursprungs-Client-ID weiter. Die zuverlässigere Methode ist es daher wohl, den Verkehr mit einem der gängigen Netzwerkanalysetools zu beobachten und sicherzustellen, dass ein Webseitenaufruf keine HTTP-, sondern SSH-Einträge erzeugt.

Nach diesem Prinzip kann man auch andere Dienste auf dem eigenen Server verschlüsselt und unter Umgehung eventueller Firewallhindernisse erreichen (Mailserver, diverse Chatanwendungen usw.). In der Konfiguration des jeweiligen Programms muss man nur die jeweiligen Einstellungen so anpassen, dass das Programm den festgelegten Port auf „localhost“ als Tunneleingang nutzt.

Weiterführende Infos

Dieser Artikel heißt „SSH-Tunnel bauen und sicher surfen“. Die Sicherheit bezieht sich dabei natürlich nur auf den Verkehr, der verschlüsselt zwischen Rechner und Proxy stattfindet. Der Verkehr zwischen Proxy und den angesurften Seiten in der „bösen Wolke“ ist mit Ausnahme von HTTPS-Verbindungen natürlich wie immer unverschlüsselt.

Außerdem sollte man sich darüber im Klaren sein, dass beim Tunnel zum Proxy die DNS-Anfragen weiterhin im unsicheren Netz sichtbar sind und Rückschlüsse auf angesurfte Domains zulassen können (nicht jedoch auf konkrete Seiten).

Des weiteren gibt es die Option einen SOCKS-Proxy aufzusetzen, der eine dynamische Portweiterleitung betreibt und durch den auch TCP-Protokolle generisch getunnelt werden können (ohne einen eigenen Tunnel für jeden einzelnen Dienst aufsetzen zu müssen). Der Server am Tunnelende leitet dabei alle Anfragen (theoretisch) an den zugehörigen Port weiter. Interessenten sollten sich dazu die Option -D von ssh ansehen.

Fehlt nur noch der Hinweis, das das Tunneln ggf. nicht den Richtlinien des Fremdnetzbetreibers entspricht und im Zweifelsfall dessen Einverständnis eingeholt werden muss. Happy Tunneling!

Links:

Wikipedia: Tunnel (Rechnernetz)

Proxy Firefox through a SSH-Tunnel

http://www.revsys.com/writings/quicktips/ssh-tunnel.html

http://paulstamatiou.com/how-to-surf-securely-with-ssh-tunnel

Comments

  1. Danke für die gute Beschreibung und die Links zu diesem Thema!
    Kannst du vielleicht auch einen Proxyserver-Service empfehlen, für die, die keinen eigenen Server in sicherem Umfeld besitzen?

    Gruss
    Andi

    1. Bei einem externen, anonymen Proxy dürftest Du wohl kaum SSH-Zugriff erhalten. Von daher reden wir hier über ein ganz anderes Thema, was nichts mit SSH-Tunneling zu einem befreundeten Netz zu tun hat. Dann geht es eher um die Frage, wie man einfach nur über einen Proxy (idealerweise SSL-verschlüsselt) anonym surfen kann. Da ich hier wenig Erfahrung habe, kann ich keine Empfehlung für einen solchen Service aussprechen.

  2. Hi,
    wenn man keinen squid oder einen anderen Proxy-Dienst aufsetzen möchte, kann auch folgender ssh-Befehl benutzt werden:
    ssh -fCND 4444 meinserver.de

    Damit wird ein Socks-Tunnel über SSH realisiert. Dein Browser bzw. dein System musst du dann nur noch auf den Socks-Proxy meinserver.de:4444 einstellen. Danach geht der ganze Netzwerkverkehr über meinserver.de.

    1. @phil:
      Danke für den Hinweis. Unter Lucid Lynx hat das bei mir aber leider nicht hingehauen (was auch an meiner Config liegen kann), obwohl diese Methode im Netz immer wieder beschrieben wird, auch in den Links unten im Artikel. Deshalb auch mein kleiner Hinweis auf die Option -D, dass dies „theoretisch“ an den richtigen Port weiterleitet. Ich habe auch gelesen, dass nicht alle Dienste immer erfolgreich getunnelt bzw. weitergeleitet werden. Es ist wohl auf jeden Fall einen Versuch wert, v.a. weil dann auch der DNS-Verkehr und der ganze Rest getunnelt werden kann.

  3. Genau das habe ich so vor 2 Tagen auch realisiert 😉 Ist auf jeden Fall ein sehr interessantes Thema, insbesondere, wenn OpenVPN aus irgendwelchen Gründen nicht möglich ist.

Comments are closed