AA_hole_atirme_sxc_1069988.jpg

© Atirme, sxc.hu

Sicherer Durchgang

Quick-and-Dirty-Tunnel mit SSH und Sshuttle

23.04.2012
Für den schnellen Zugriff von unterwegs auf private Daten ist ein VPN oft überdimensioniert. Das geniale kleine Tool Sshuttle dagegen durchtunnelt unsichere Netze auch ohne langwierige Vorbereitungen auf dem Server.

Beim Fernzugriff über unsichere Transportwege wie das Internet lauern Gefahren: Das Abhören von WLAN-Verbindungen an öffentlichen Zugangspunkten stellt für einen Angreifer kaum ein Problem dar. Der Markt hält daher unzählige Lösungen und Produkte parat, um aus der Ferne sicher auf den eigenen Arbeitsplatz oder Server zuzugreifen. Wie komplex das dabei zum Einsatz kommende Instrumentarium ausfällt, hängt von Einsatzart und Sicherheitsbedürfnis ab – also primär von der Frage, was man unter "zugreifen" versteht, also welche Protokolle es im Einzelnen zu tunneln gilt. Klassische VPNs auf Basis von IPSec oder SSL (OpenVPN) bieten hier maximale Transparenz, die man aber mit minimaler Flexibilität erkauft.

Mit einem VPN nutzen Sie die Ressourcen des entfernten Rechners genau so, als säßen Sie direkt davor. Sie greifen dann nach Belieben auf lokale Verzeichnisse, Netzwerkfreigaben und Drucker des entfernten Rechners zu. Beim Aufruf einer Webseite wie www.meineip.de verhält sich der PC im Internet-Café exakt so, als wäre er der entfernte Rechner. VPNs erreichen diesen Grad an Transparenz, indem sie das komplette Netzwerk durch den aufgebauten Tunnel schicken, also sämtliche OSI-Layer und gegebenenfalls auch den DNS-Dienst. Einfache Fernzugriffslösungen auf Proxy-Basis tunneln dagegen je nach Einsatzzweck nur bestimmte Protokolle, etwa HTTP(S).

Allerdings ist ein VPN technisch aufwendig und mitunter relativ langsam. Für das angenommene Ad-hoc-Szenario scheiden VPNs jedoch aus: Sie bestehen stets aus je einer Server- und Client-Komponente und erfordern ein vorheriges Konfigurieren, in deren Verlauf Sie beispielsweise die virtuellen Netzwerkschnittstellen einrichten sowie die erforderlichen Nutzerrechte konfigurieren müssen.

SSH-Tunnel

Möchten Sie mit wenig Aufwand und zudem ad hoc auf einen entfernten Rechner zugreifen, gibt es noch eine Reihe anderer Verfahren, die etwa auf SSH oder Tsocks (siehe Kasten "Dynamic Forwarding mit SSH") basieren und im Einzelnen relativ umständlich ausfallen, wie etwa der doppelte SSH-Tunnel.

Nicht jeder Linux-Nutzer weiß, dass SSH nicht nur ein sicheres, verschlüsseltes Login auf einem entfernten Rechner ermöglicht, sondern auch verschiedene Tunnel-Arten beherrscht. So können Sie mit SSH (beinahe) beliebige andere Protokolle absichern, wozu die SSH-Funktion des Port Forwarding zum Einsatz kommt. Mit SSH-Portforwarding (siehe Kasten "Tunnelbau mit SSH") leiten Sie SSH-Verbindung um, wobei SSH selbst als Proxy fungiert: Auf der einen Seite des Tunnels nimmt es die Verbindung entgegen und stellt sie auf der anderen Seite zum adressierten Server durch, dem Verbindungsendpunkt. Das funktioniert allerdings nur für ein explizit angegebenes Protokoll.

Seit der Version 4.3 von OpenSSH können Sie zudem auch ein vollwertiges VPN als Layer-2- oder Layer-3-Tunnel mit virtuellen Netzwerk-Adaptern (TUN/TAP-Interfaces) aufbauen. Dazu müssen Sie jedoch auf Server- und Client-Seite die entsprechenden TUN/TAP-Devices durch Laden der zugehörigen Kernel-Module einrichten, zudem erweist sich TCP-over-TCP als umständliche und daher eher langsame Angelegenheit. Mit dem neuen Tool Sshuttle kommen Sie dagegen schneller ans Ziel.

Dynamic Forwarding mit SSH

Mit der Dynamic-Option -D verhält sich der SSH-Client wie ein SOCKS-Server (SOCKS-Proxy). Daher ist Dynamic Port Forwarding nützlich, wenn Sie via SSH von einem öffentlichen WLAN-Hotspot über einen gesicherten Tunnel lediglich auf einen einzelnen Dienst des entfernten Rechners zugreifen möchten. Dabei muss es sich allerdings um einen Dienst handelt, für den es einen passenden SOCKS-Client gibt, etwa den Webbrowser. Sie tragen dann in dessen Verbindungsoptionen den lokalen SSH-Client als SOCKS-Proxy mit der frei wählbaren Portnummer ein. Der Aufbau des Tunnels zum entfernten Sshd erfolgt dann mit

$ ssh -D Port Nutzer@Ziel-Host

Möchten Sie nur auf eine Web-Anwendung des entfernten PCs zugreifen, bietet SSH Dynamic Portforwarding also eine ideale Lösung. Möchten Sie andere Dienste auf diese Weise via SSH tunneln, gilt es zu beachten, dass manche Programme keine SOCKS-Proxies unterstützen. In einem solchen Fall können Sie den Wrapper Tsocks installieren.

Tunnelbau mit SSH

SSH kann nicht nur ein sicheres Shell-Login auf einem entfernten Server zu Verfügung zu stellen, sondern sichert mithilfe der Port-Forwarding-Option auch beliebige andere Protokolle ab, wobei SSH als Proxy fungiert. Das ist zwar kein vollwertiger VPN-Ersatz, weil es nur die angegeben Protokolle umleitet, reicht aber für viele Szenarien aus. Das SSH-Portforwarding kennt die zwei Betriebsarten Local Port Forwarding und Remote Port Forwarding. Die Richtung des Tunnelsbaus geben Sie mit den Parametern -L und -R an. Local Port Forwarding leitet eine Verbindung, die an einem frei wählbaren lokalen Client-Port eintrifft, durch den sicheren SSH-Tunnel auf einen Port eines entfernten Servers um:

# ssh User@Ziel-Host -L Port:Ziel-Host:Ziel-Port

So tunneln Sie beispielsweise eine unsichere FTP-Verbindung auf Port 21 über eine sichere SSH-Verbindung, sofern auf dem entfernten Rechner ein FTP- und der SSH-Server (sshd) laufen. Der Verbindungsaufbau beim Local Portforwarding sieht dann so aus wie in Zeile 1 von Listing 1. Mit diesem Kommando bauen Sie am Client-Rechner eine sichere SSH-Verbindung als Benutzer drilling zum entfernten Rechner www.thomas-drilling.de auf. Dabei lauscht der SSH-Client außerdem auf sämtliche Anfragen, die auf dem lokalen Port 5555 eingehen, und leitet diese zum entfernten Rechner www.thomas-drilling.de auf Port 21 um. Steht der Tunnel, starten Sie in einer zweiten Terminal-Sitzung den FTP-Client mit der Zieladresse localhost und dem Port Ziel-Port (Listing 1, Zeile 2).

Listing 1

$ sudo ssh drilling@www.thomas-drilling.de -L 5555:www.thomas-drilling.de:21
$ sudo ftp localhost 5555

Beispielszenario

Stellen Sie sich vor, Sie möchten von einem öffentlichen WLAN-Hotspot aus mit maximaler Transparenz und möglichst geringem Aufwand sicher auf Ihren Arbeitsrechner in der Firma oder auf den privaten Server zugreifen. Der entfernte Server stellt allerdings kein VPN zur Verfügung, oder lediglich eine VPN-Lösung, die komplexe (IPSec) beziehungsweise umständliche Protokolle (PPTP) benutzt, für die Sie keinen passenden Client zur Hand haben.

SSH-Portforwarding möchten Sie aus den oben genannten Gründen auch nicht verwenden. Das im Kasten "TUN/TAP-Tunnel" geschilderte SSH-Tunnel-Feature können Sie ebenfalls nicht nutzen: Zum Einen ist es per Default in OpenSSH auf dem Server deaktiviert, zum Anderen haben Sie weder auf dem Server noch auf dem Client die Möglichkeit, Kernel-Module für TUN- und oder TAP-Devices nachzuladen. Sie stehen damit vor dem gleichen Problem wie zahlreiche Admins beim Thema Traffic-Tunneling in öffentlichen Netzen: Diese verwenden im Normalfall entweder ein VPN, einen SSH-Tunnel oder diverse Proxy-Lösungen, die allesamt port- oder protokollbasiert funktionieren und ein im Einzelfall sehr komplexes Einrichten erfordern.

Zwar verfügt ein Admin in der Regel sowohl über das notwendige Fachwissen als auch über die administrativen Voraussetzungen. Dennoch dürfte sich auch der Fachmann über eine Lösung freuen, die so elegant und einfach funktioniert wie das relativ neue Tool Sshuttle [1] des kanadischen Studenten Avery Pennarun. Sshuttle erfordert auf dem Server nichts weiter als ein SSH-Benutzerkonto (also nicht notwendigerweise root) und Python.

TUN/TAP-Tunnel

OpenSSH ermöglicht es ab der Version 4.3 mit Hilfe der Option -w ein vollwertiges VPN mit einem Layer-2- oder Layer-3-Tunnel mit virtuellen Netzwerk-Adaptern (TUN/TAP-Interfaces) aufzubauen. Allerdings scheidet dieses Verfahren für das vorliegende Beispiel aus, weil es auf Server- und Client-Seite ein Aufsetzen der entsprechenden TUN/TAP-Devices durch Laden der zugehörigen Kernel-Module erfordert. Weiterhin setzt es voraus, dass in der Konfiguration des SSH-Daemons auf dem Server die Option PermitTunnel yes aktiviert ist, was per Default nicht der Fall ist. Die Befehle zum Aufsetzen der virtuellen Netzwerkadapter auf Server und Client sowie den Aufbau des Tunnels via SSH vom Client aus zeigt Listing 2.

Listing 2

# Client
$ sudo ifconfig tun0 10.0.2.1 netmask 255.255.255.252
# Server (IP-Adresse auf dem Zielrechner)
$ sudo ifconfig tun0 10.0.2.2 netmask 255.255.255.252
$ sudo route add -host Ziel-Host dev eth0
# Verbindungsaufbau
$ ssh -l User -p Sshd-Port -w0:0 Ziel-Host

Arme-Leute-VPN

Das unter der GPL lizenzierte Sshuttle eignet sich perfekt für den Einsatz in öffentlichen Netzen. Es nutzt einen bisher einzigartigen Ansatz, um on-the-fly ein SSH-VPN zwischen unixoiden (Linux, BSD, Mac OS X) Betriebssystemen aufzubauen und den kompletten Client-Datenverkehr zu tunneln.

Das relativ neue Sshuttle findet sich noch nicht in den Paketquellen aller Distributionen, falls vorhanden, fällt die Version – aktuell war zu Redaktionsschluss Sshuttle 0.60 – oft recht altbacken aus. So hat Debian "Sid" etwa Sshuttle 0.54-1 an Bord [2], das aktuelle Ubuntu 11.10 "Oneiric" enthält Version 0.53-0.1. Zum Ausprobieren der aktuellen Version 0.60 kommen Sie daher um ein manuelles Installieren nicht herum. Das stellt aber kein wirkliches Problem dar, weil es sich bei Sshuttle um ein in Python programmiertes Kommandozeilenwerkzeug handelt.

Sshuttle baut das VPN von der Client-Seite herauf, wofür es dort Root-Rechte benötigt. Außerdem muss Iptables installiert sein, das praktisch alle gängigen Distributionen ohnehin bei der Installation einrichten. Die aktuelle Sshuttle-Version ist unter Github [1] gehostet und steht wahlweise als ZIP-Archiv oder Tarball zum Download bereit. Da es sich um ein Python-Programm handelt, genügt das einfache Auspacken des Pakets (oder das Auschecken von Github), und Sie können Sshuttle sofort einsetzen. Ein typischer Aufruf sieht so aus:

$ sudo ./sshuttle --dns -vv -r User@Ziel-Host 0/0

Hier tunnelt -dns zusätzlich den DNS-Verkehr, -vv erhöht die Gesprächigkeit der Anwendung, und das Kürzel 0/0 stellt einen Alias für das IP-Binding 0.0.0.0/0 dar, das alle lokalen Adressen einbezieht. Sie könnten Sshuttle über Verändern dieser Maske problemlos auch auf ein bestimmtes Subnetz oder eine spezifische IP hängen. Das war's schon.

Abbildung 1: Sshuttle erweist sich im Bedarfsfall sehr nützlich, da es auf den Bordmitteln eines Linux-Rechners aufbaut.

Ab jetzt tunnelt Sshuttle den gesamten Traffic, inklusive DNS-Anfragen. Wer den vergleichbaren Aufwand mit SSH-Portforwarding kennt, kann möglicherweise im ersten Moment kaum glauben, dass Sshuttle funktioniert. Dass es das aber tut, verifizieren Sie leicht, indem Sie die externe IP prüfen – etwa durch Besuch eine entsprechenden Test-Webseite [3]. Bei aktiviertem Tunnel sollte hier die IP-Adresse des Servers oder entfernten Hosts erscheinen, andernfalls die des lokalen Routers.

Abbildung 2: Je eine Verbindung vom lokalen Host ohne Proxy und via Sshuttle mit Proxy auf einen entfernten Server.

Quick and Dirty

Möchten Sie wissen, wie Sshuttle das zuwege bringt, dann sollten Sie sich die ausführliche Dokumentation [4] des Tools näher ansehen. Im Prinzip verbiegt Sshuttle via Iptables die Routing-Tabellen auf dem Client, kopiert sich selbst auf den Server und fungiert sozusagen als transparenter Proxy.

Dass dieses Verfahren ähnlich wie ein doppelter SSH-Tunnel nicht ganz astrein ist und insbesondere in Unternehmen ein Sicherheitsproblem darstellt, liegt auf der Hand – muss Sie aber als Privatnutzer nicht stören. Beabsichtigen Sie allerdings, auf diese Weise von zuhause auf Ihren Arbeitsplatzrechner in der Firma zuzugreifen, sollten Sie tunlichst zuvor Ihren zuständigen Admin informieren (sofern Sie der nicht selbst sind), weil das Funktionsprinzip von Sshuttle mit hoher Wahrscheinlichkeit gegen Firmenrichtlinien verstößt.

Fazit

Shuttle ist ein geniales kleines Tool, mit dem Sie on-the-Fly ein vollwertiges (Userspace-)VPN zu einem entfernten Host oder Server aufbauen, ohne dort Root-Rechte besitzen oder irgend etwas installieren zu müssen. Dabei setzt es auf der Gegenseite lediglich einen laufenden Sshd sowie Python voraus. In unserem Test erwies sich Sshuttle im Vergleich zum SSH-Tunnel als rasant schnell und sehr stabil.

Sshuttle ist relativ neu und in seiner Funktion bisher einzigartig. Daher dürfte es nur eine Frage der Zeit sein, bis es sich zum Lieblingswerkzeug vieler Administratoren entwickelt. Doch wohlgemerkt: Die von Sshuttle verwendeten Methoden sind vorsichtig formuliert fragwürdig. Da sich das Tool zudem noch in einem relativ frühen Entwicklungsstadium befindet, gilt: Benutzung nur auf eigene Gefahr. 

Glossar

VPN

Virtual Private Network. Bezeichnung für abgeschlossene virtuelle Teilnetze innerhalb eines öffentlichen Netzwerks. VPNs binden meist entweder externe Rechner an ("End-to-Site", "Roadwarrior") oder koppeln zwei Netze ("Site-to-Site").

SOCKS

Abkürzung für Sockets. Internet-Protokoll, welches Client/Server-Anwendungen erlaubt, protokollunabhängig und transparent die Dienste eines Proxyservers zu nutzen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

Kommentare