Entferntes Verzeichnis hinter NAT Firewall mounten

Bei mir war es der Mangel an Speicherplatz auf meinem (virtuellen) Server, der mich dazu bewogen hat, die Backup Archive gar nicht erst lokal, sondern direkt auf einem entfernten Rechner speichern zu wollen. Die Problemstellung ist dabei

(Bei mir kommt noch erschwerend hinzu, dass ich die Firewall nicht selbst konfigurieren kann, da sie meinem ISP, der Uni Karlsruhe, gehört.)

Zum Glück bringt GNU/Linux mit SSH und FUSE alles mit, was wir zum Stemmen dieser Aufgabe brauchen. Ein SSH reverse tunnel bringt uns von außen vorbei an der NAT Firewall und mit sshfs können wir anschließend ein entferntes Verzeichnis lokal auf dem Server mounten. In meinem Fall steht der entfernte Rechner MyLocal bei mir zu Hause und der Server MyServer in einem Rechenzentrum. Ich gehe davon aus, dass der Server per SSH von dem Rechner aus erreichbar ist. Außerdem muss auch auf dem Rechner ein SSH Daemon laufen, damit wir von dem Server aus per sshfs ein Verzeichnis mounten können.

Bevor es losgehen kann, müssen wir sshfs auf dem Server einrichten. In meinen Beispiel läuft hier ein Ubuntu 12.04 und das Tool lässt sich leicht über die Paketverwaltung installieren.

MyServer:~# apt-get install sshfs

Anschließen laden wir das FUSE Kernelmodul und geben unserem Benutzer MyServerUser über die Gruppe fuse die notwendigen Rechte zur Benutzung von sshfs.

MyServer:~# modprobe fuse
MyServer:~# usermod -a -G fuse MyServerUser

Update: Auf neueren Systemen scheint die Gruppe fuse nicht mehr zu existieren. Der Schritt der Gruppenzuordnung kann dort ersatzlos übersprungen werden.

Wenn wir später nicht nur mit dem Benutzer MyServerUser auf das entfernte Verzeichnis zugreifen können möchten, sondern zum Beispiel auch als root, müssen wir diese Option in der FUSE Konfiguration erlauben.

MyServer:~# echo user_allow_other >> /etc/fuse.conf

Nun können wir uns von unserem Rechner aus auf den Server verbinden und gleichzeitig einen reverse tunnel aufbauen. Auf dem Server wird dann der lokale Port 12345 durch einen verschlüsselten Tunnel auf den Port 22 (SSH) unseres Rechners weitergeleitet.

MyLocal:~$ ssh -R 12345:localhost:22 MyServerUser@MyServer

Wenn wir es wollten, könnten wir uns nun mit MyServer:~$ ssh -p 12345 MyLocalUser@localhost vom Server auf unseren Rechner verbinden, denn hinter localhost befindet sich jetzt auf Port 12345 unser Rechner. Das bedeutet allerdings auch, dass der Fingerprint, den der SSH Daemon raus gibt, nicht der von localhost MyServer, sondern der von unserem Rechner MyLocal ist. Dies kann zu Problemen führen, wenn der tatsächliche Fingerprint von localhost bereits in known_hosts gespeichert ist. Die einfachste Möglichkeit, diesem Problem vorzubeugen, ist, bekannte Hosts und ihre Fingerprints zu verwerfen.

MyServer:~$ rm ~/.ssh/known_hosts

Endlich ist es soweit und wir können von unserem Server aus das entfernte Verzeichnis mounten. In diesem Beispiel sei es das entfernte Verzeichnis /home/MyLocalUser/backup, das auf dem Server als ~/remote_backup gemountet wird. Da mein Backup Script als root läuft, mache ich hier mit dem Parameter -o allow_root das entfernte Verzeichnis auch für root verfügbar.

MyServer:~$ mkdir remote_backup
MyServer:~$ sshfs MyLocalUser@localhost:/home/MyLocalUser/backup remote_backup -p 12345 -o allow_root

Nun kann die eigentliche Arbeit (bei mir das Backup Script) durchgeführt werden. Alle Zugriffe auf MyServer:~/remote_backup werden transparent auf MyLocal:/home/MyLocalUser/backup durchgereicht. Am Ende kann die Verbindung wieder abgebaut werden.

MyServer:~$ fusermount -u remote_backup