Tunnelblick

Einrichtung eines ssh-Tunnels durch das Internet zwischen einem Android-Smartphone und einem Linux-Host.

Firewall-Mechanismen

Nutzt man unterwegs mit seinem Smartphone einen öffentlichen Hotspot, so besteht die Gefahr, dass der Datenverkehr durch den Betreiber ausgewertet, also auch evtl. unverschlüsselt gesendete Daten mitgelesen und missbraucht werden. Nun besteht prinzipiell die Möglichkeit, auf dem heimischen PC, der über einen Breitbandanschluß mit dem Internet verbunden ist, einen sshd zu installieren und den Datenverkehr des Smartphones über einen ssh-Tunnel zum heimischen PC zu leiten.
Oft schützen die Provider der Breitbandanschlüsse ihre Kunden jedoch durch eine Firewall vor unerwünschten Zugriffen aus dem Internet. Während man auf die Firewall des heimischen Routers normalerweise vollen administrativen Zugriff hat, ist dies naturgemäß bei der Firewall des Providers nicht der Fall. Dies bedeutet, dass die vom heimischen PC angebotenen Server-Dienste nicht aus dem Internet erreichbar sind (es sei denn, das die providerseitige Firewall die Ports dafür standardmäßig offen hält, was selten der Fall ist). Nun muß prinzipiell jede Firewall auch Pakete von außen hereinlassen und zwar die Antwortpakete zu Anfragen an Web- und Mailserver etc. die der Nutzer durch Browser oder Email-Clients an die Server im Internet richtet. Damit die Firewall entscheiden kann, ob ein Paket von außerhalb die Antwort auf ein ausgehendes Paket ist, wird im Router Buch darüber geführt, welcher interne Rechner mit welchem Rechner außerhalb kommuniziert und welche Ports dabei angesprochen wurden.

Die Rolle von Vermittlungsservern

Um nun eine Client-Server-Kommunikation durch eine restriktive Firewall hindurch zu ermöglichen, bedient man sich eines Vermittlungsservers: Beide Kommunikationspartner, also Server und Client nehmen periodisch Kontakt mit dem Vermittlungsserver auf. Somit kennt dieser die IP-Adressen der Teilnehmer und die Ports auf denen sie zu kommunizieren wünschen. Will ein Teilnehmer nun die Verbindung aufnehmen, meldet er diesen Wunsch beim Vermittlungsserver an, erhält von ihm die IP-Adresse und den Port der Gegenstelle und kann nun seine Anfrage losschicken. Diese wird zwar von der Firewall der Gegenstelle verworfen, aber der Router von dem die Anfrage stammt wartet dennoch auf die Antwort. Der Vermittlungsserver teilt nun der Gegenstelle die Daten der Anfrage mit und läßt sie antworten. Das Antwortpaket passiert nun die auf Antwort wartende Firewall und nun können beide Kommunikationspartner ohne den Vermittlungsserver weiter Daten austauschen. Dieses Verfahren ist auch unter dem Begriff Hole Punching bekannt. Eine grobe Simulation dieser Arbeitsweise mit einfachen Netzwerktools zeigt ein Artikel in der c’t und erläutert diese Problematik ausführlicher.

NeoRouter Mesh und Co.

Ein prominentes Beispiel eines solchen Vermittlungsservers ist Skype. Es gibt jedoch auch Anbieter, die Vermittlungsdienste für allgemeinere Aufgaben bereitstellen. Einer von ihnen ist die Firma NeoRouter Inc.. Der Einsatz ihres Dienstes NeoRouter Mesh zum Aufbau eines ssh-Tunnels zwischen Smartphone und einem hinter einer Firewall verborgenen Linux-Hosts, der einen Proxy für den Internetzugriff bereitstellt, soll hier demonstriert werden. Die folgende Vorgehensweise benötigt keine Root-Rechte auf dem Smartphone, dieses muß also nicht gerootet werden.

Schritt für Schritt

Auf der Herstellerseite der Firma NeoRouter Inc. kann man die notwendige Mesh Domain und den Account beantragen. Anschließend kann die Software für die verschiedenen Endgeräte auf der Download-Seite heruntergeladen und installiert werden.
Auf dem Linux-Host, der als Server dienen soll, wird nach der Installation nrserver gestartet. Anschließend kann die App NeoRouter Mesh auf dem Android-Smartphone aufgerufen werden.

Konfiguration der App NeoRouter Mesh

Konfiguration der App NeoRouter Mesh


Nach der Authentifizierung sollte die App den Linux-Host nun unter My Computers auflisten. Tippt man länger auf den Host, zu dem der Tunnel aufgebaut werden soll, öffnet sich ein Auswahlfenster und man kann nun den Dienst ssh 22 auswählen. Durch diese Auswahl richtet die App eine Port-Weiterleitung vom Port 32973 des lokalen Hosts (also des Smartphones) zum Port 22 des entfernten ausgewählten Linux-Host ein (bzw. teilt sie diesen Wunsch dem Vermittlungsserver mit).

ConnectBot: ein ssh-client für Android

Nun kann die ssh-App ConnectBot gestartet werden. Aus einer Dropdown-Liste kann man die Dienste ssh, telnet und local auswählen.

Konfiguration der App ConnectBot

Konfiguration der App ConnectBot

Wir wählen ssh (local gestattet die Einrichtung eines ssh-Zugangs zum Smartphone) und geben im Eingabefenster siegel@localhost:32973 als Ziel ein. Wir erinnern uns, daß durch NeoRouter Mesh eine Weiterleitung vom lokalen Port 32973 zum Port 22 des Linux-Hosts eingerichtet wurde. Nachdem man auf dem Linux-Host angemeldet wurde, kann man in der Werkzeugleiste (ganz unten rechts) den Punkt Port-Weiterleitung aufrufen.

Einrichten einer Port-Weiterleitung mit ConnectBot

Einrichten einer Port-Weiterleitung mit ConnectBot

Hier kann man unter Vergabe eines Spitznamen eine Weiterleitung vom Typ Lokal mit dem Quellport: 8080 zum Ziel localhost:3128 einrichten. Der Port 3128 ist der Standard-Port des Proxy-Programms squid, welches auf dem Linux-Host installiert und konfiguriert werden mußte. Bei der Auswahl des Quellports ist zu bedenken, dass unter Unix-artigen Betriebssystemen (also auch unter Android) nur root Dienste betreiben darf, die Portnummern kleiner 1024 benötigen (sogenannte Systemports).

Der Proxy-Server squid

Wie bereits erwähnt, muß auf dem Linux-Host ein Proxy-Server eingerichtet werden. Nach dessen Installation sind in der Datei /etc/squid/squid.conf noch einige Kleinigkeiten einzutragen. So muß dem Proxy noch ein Name über das Schlüsselwort visible_hostname zugewiesen werden, dieser kann beliebig gewählt werden. Außerdem muß das Disk Cache Directory durch das Schlüsselwort cache_dir bezeichnet werden und es sollte die Zeile http_access deny to_localhost in der Config-Datei vorhanden sein. Im übrigen ist die Datei squid.conf sehr gut kommentiert und man muss eigentlich nur den dort gemachten Empfehlungen folgen. Vor dem ersten Start von squid ist die Cache-Verzeichnisstruktur durch den Aufruf von squid -z anzulegen. Nun kann man mit squid -NCd1 den Dämon probeweise starten, ohne ihn in den Hintergrund zu schicken. So kann man evtl. Fehlermeldungen besser beobachten. Später kann man den Dämon dann durch /etc/init.d/squid start aktivieren. Für weitere Konfigurations-Details sei auf den Eintrag bei selflinux.org und das HOWTO der Seite www.linuxhomenetworking.com verwiesen.

Eintrag des Proxy-Servers im Browser

Um nun durch den eingerichteten Tunnel über den Linux-Host surfen zu können, muß in Opera (Chrome für Android unterstützte zum Verfassungszeitpunkt des Artikels die Angabe eines Proxy-Servers noch nicht) auf dem Smartphone die Adresse des Proxy-Servers angegeben werden. Dies kann durch Aufruf von opera:config geschehen.

Mit Opera die Benutzung eines Proxy-Servers einrichten

Mit Opera die Benutzung eines Proxy-Servers einrichten

Als HTTP-Server muß dann 127.0.0.2:8080 eingetragen werden, denn der lokale Port 8080 wird ja durch die mit ConnectBot eingerichtete Port-Weiterleitung an den Proxy-Port 3128 des fernen Linux-Host weitergereicht. Nach dem Speichern dieser Angaben und einem Neustart von Opera, wird nun jede Anfrage von Opera durch den Tunnel an den Proxy weitergeleitet.

Hat man bspw. bei dem Dienst no-ip für seine eigene, vom Provider dynamisch zugeteilte IP-Adresse einen Domainnamen eingerichtet, so lassen sich unter diesem Domainnamen nun auch Seiten aus dem Internet aufrufen. Da sich hinter der vom Provider vergebenen IP-Adresse normalerweise der heimische Router verbirgt, man aber mit dem Domainnamen eigentlich einen Rechner hinter dem eigenen Router (also im eigenen lokalen Netz) erreichen möchte, ist im Router eine entsprechende Port-Weiterleitung (oft unter dem Menü-Punkt Virtueller Server erreichbar) zu dem gewünschten Rechner und Port zu konfigurieren. Handelt es sich zum Beispiel um eine Webcam und ist für diese im eigenen Router eine entsprechende Port-Weiterleitung konfiguriert, so könnte eine Abfrage des gerade sichtbaren Bildes z.B. durch http://dcs-900.no-ip.org:8080/IMAGE.JPG erfolgen, wenn der bei no-ip registrierte Domainname dcs-900.ni-ip.org lautet und in der Webcam der Port 8080 als Dienstport konfiguriert wurde.

Screenshots auf dem Samsung Galaxy Nexus

Das Android-Handy Samsung Galaxy Nexus bietet eine einfache Möglichkeit zur Anfertigung von Screenshots an: Gleichzeitiges Drücken der Lautstärke-Leiser-Taste und der Power-Taste bis eine verkleinerte Darstellung des Screenshots erscheint. Der Screenshot wird unter /sdcard/Pictures/Screenshots/ im png-Format abgelegt.

Konfiguration zertifikatbasierter SSH-Zugänge

SSH bietet die Möglichkeit der Zugangs-Authentifizierung mittels öffentlicher Schlüssel (Public Key Authentication). Bei der konventionellen Zugangskontrolle durch Username und Passwort liegt die Schwachstelle beim Passwort, läßt es sich erraten, so ist der Zugang hergestellt.
Bei der zertifikatbasierten Zugangskontrolle wird durch das Dienstprogramm ssh-keygen ein Schlüsselpaar, bestehend aus einem öffentlichen und einem privaten Schlüssel, erzeugt. Anschließend verbleibt der private Schlüssel auf dem Client, während der öffentliche Schlüssel auf den Server übertragen wird. Schlüssel lassen sich prinzipiell schwieriger kompromittieren als Kennwörter. Ein weitere Vorteil dieser Methode ist, daß sie (entsprechende Konfiguration vorausgesetzt) den Zugang ohne Benutzerinteraktion herstellen kann, zusätzlich läßt sie sich als einzig legitime Art der Anmeldung (Authentifizierung) festlegen. Der private Schlüssel wird üblicherweise nochmals mit einer Passphrase gesichert (von Passphrase spricht man, da sie aus mehreren Worten bestehen kann). Diese wird dann beim Zugang abgefordert. Um die Angabe der Passphrase nicht bei jedem Zugang vornehmen zu müssen, läuft normalerweise ein ssh-agent, der die Angabe der Passphrase stellvertretend übernimmt.
Die Anmeldung erfolgt nun sinngemäß etwa folgendermaßen: Auf dem Client wird mittels des hier vorhandenen privaten Schlüssels eine Signatur erzeugt, diese wiederum kann der Server mit dem bei ihm hinterlegten öffentlichen Schlüssel des Client prüfen.

Praxis:

Erzeugen des privaten und öffentlichen Schlüssels (der Option -t wird der Typ des Schlüssels übergeben, die möglichen Werte nennt die Manualseite):
# ssh-keygen -t rsa

Es entstehen Dateien mit den Schlüsselpaaren:
~/.ssh/id_rsa und ~/.ssh/id_rsa.pub.

Die *.pub-Dateien können nun auf den Server kopiert werden und dort an ~/.ssh/authorized_keys angehängt werden, diesen Schritt übernimmt das Dienstprogramm ssh-copy-id:

# ssh-copy-id -i ~/.ssh/id_rsa.pub user@server

Schlangengrube: Python-Skripte auf dem Android-Smartphone

Wie einem Artikel im Linux Journal zu entnehmen war, ist Java nicht die einzige Möglichkeit eine App für Android-Smartphones zu erstellen. Einen sehr interessanten Weg eröffnet die Installation des Scripting Layer for Android (SL4A). SL4A stellt Skript-Sprachen ein High-level Interface zur Android-API zur Verfügung. Genaugenommen wird nur eine Untermenge des Android API zugänglich gemacht. Dabei unterstützt SL4A nicht nur Python, sondern auch Perl, JRuby, Lua, BeanShell, JavaScript und Tcl. Die erforderlichen Installationsschritte sind im o.g. Artikel ausführlich erläutert, ergänzend soll lediglich gesagt werden, dass ein Skript unter Linux durch den Aufruf von ./platform-tools/adb vom Wurzelverzeichnis des Android SDK aus auf das virtuelle Android-Device übertragen wird und nicht durch Aufruf von tools/adb, wie im Artikel genannt.
Um Dateien zu einem realen Smartphone zu Übertragen hat sich sftp bewährt, dazu muß lediglich ein sshd auf dem Smartphone installiert werden (über Google-Play möglich).

Eine Übersicht zur API-Referenz, sowie einige Tutorials zum SL4A, sind über den Link erhältlich.

Welche Leistung über die API zur Verfügung steht, läßt das Beispiel eines Barcode-Scanners in 6 Zeilen Python-Code erahnen.