Reverse ssh tunnel mit autossh

Eigentlich ist das Port-Forwarding im Router so eingestellt, dass der Remote Zugriff auf den Heimserver problemlos funktioniert. Leider hat der Provider aber die Möglichkeit den Router neu zu initialisieren (und damit meine Forward-Regeln zu löschen) und er macht auch massiv Gebrauch davon. Zwar kann der Server dann weiterhin mit dem Internet kommunizieren (und so auch als nagios-Server andere Server überwachen), der Zugriff von außen funktioniert aber nicht mehr.

Mit einem Server im Internet lässt sich dem Problem ein Schnippchen schlagen, in dem man den Heimserver anweist einen reverse ssh tunnel aufzubauen. Über diesen kann man später auf das Heimnetz zugreifen und die Port-Forwarding Regeln neu einspielen. Damit der Tunnel nach der Unterbrechung durch den Provider wieder hergestellt wird hilft autossh. Mit folgendem Eintrag in /etc/rc.local (Ubuntu Server):

sudo -u meinuser /usr/bin/autossh \
  -R 17777:localhost:22 -N meinserver.tld &

bleibt die Verbindung immer offen. Hier noch kurz die Erklärung der Einzelheiten:

  • sudo -u meinuser: Die Datei /etc/rc.local wird als root ausgeführt, der SSH-Tunnel soll aber unter meinem User aufgebaut werden
  • autossh -R 17777:localhost:22: autossh übergibt alle Parameter an ssh. Hier wird der reverse Tunnel auf Port 17777 zum Port 22 der lokalen Maschine hergestellt.
  • -N: ssh soll keine Shell starten, nur den Tunnel bereit stellen

Natürlich müssen die ssh-Schlüssel für den eigenen Account mit dem Server meinserver.tld zuerst ausgetausch werden, damit ein login ohne Passwort möglich ist. Anschließend kann man mit den Kommandos

ssh meinuser@meinserver.tld
ssh -p 17777 localhost

vom Internet aus auf den Heimserver zugreifen. Der Port 17777 ist dabei nur für Benutzer am Server meinserver.tld zugängig.

Datentransfer mit rsync, openssh und cyanogenmod am Galaxy Nexus

Datentransfer

Um unter Linux Dateien auf das Galaxy Nexus zu kopieren gibt es leider keine einfache und performante Lösung. Mit Airdroid kann man wunderbar ein, zwei Dateien hin und her kopieren, der Transfer läuft über das Wlan, was von haus aus schon eine Geschwindigkeitsbeschränkung mit sich bringt. Alle meine Versuche mit mtp (auch unter Ubuntu 13.04) brachen regelmäßig ab und waren auch nicht von hohen Geschwindigkeiten gekennzeichnet.

cyanogenmod, openssh, rsync

Ganz anders verhält es sich mit rsync über ssh, getunnelt durch adb via USB. Hier erreicht man wirklich sehr zufriedenstellende Transferraten (für große Dateien lesend 15 MB/s). Eine ausführliche Anleitung dazu gibt es bei alainwolf.ch. Hier eine Kurzfassung, wie ich den Kopiervorgang starte. Voraussetzungen:

  • Android Debug Bridge am PC installieren (apt-get install android-tools-adb)
  • Handy per USB anstecken
  • am Handy:
    • Cyanogenmod 10.1 (momentan noch einen nightly build) installieren
    • Einstellungen - Entwickleroptionen: Root-Zugriff für Apps & ADB aktivieren
    • Einstellungen - Entwickleroptionen: USB debugging aktivieren

Dann am PC:

#pc:# adb root
#pc:# adb remount
#pc:# adb -d forward tcp:8090 tcp:8090
#pc:# adb shell
root@android:/ # /system/bin/sshd -D -p 8090

Mit dem letzten Kommando wird der SSH-Dienst am Handy auf Port 8090 gestartet. Der Dienst wird absichtlich nicht im Hintergrund ausgeführt, er läuft nur während die adb shell aktiv ist. Das adb -d forward tunnelt den IP port 8090 durch USB auf den PC.

Jetzt funktioniert der Zugriff via rsync. Um ein Backup der virtuellen sdcard zu machen kann man folgendes Kommando verwenden:

rsync -e 'ssh -p 8090' -rv root@127.0.0.1:/mnt/sdcard/ ./ 
  --exclude=Android/data/info.snowhow/files/tilestore/ 
  --exclude=osmand/

Update 2015

Mit dem wunderbaren gratis App SSHelper wird das etwas einfacher: SSHelper am Handy starten, den SSH-Port via adb am PC weiterleiten

bernd@pc > adb -d forward tcp:2222 tcp:2222

und schon können die Fotos mit

bernd@pc > rsync -e 'ssh -p 2222' -av localhost:~/SDCard/DCIM/Camera/ ~/handypics/

synchronisiert werden.