{"id":1936,"date":"2018-05-07T08:15:39","date_gmt":"2018-05-07T07:15:39","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=1936"},"modified":"2020-12-19T14:06:07","modified_gmt":"2020-12-19T13:06:07","slug":"mit-einem-reverse-ssh-tunnel-zum-offsite-backup","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/mit-einem-reverse-ssh-tunnel-zum-offsite-backup\/","title":{"rendered":"Update 2018-05-21: Mit einem Reverse-SSH-Tunnel zum Offsite-Backup"},"content":{"rendered":"<p>Im heutigen Beitrag aus der Kategorie Wochenend-Projekte geht es darum, wie man mit Hilfe eines Reverse-SSH-Tunnels ein Offsite-Backup f\u00fcr die heimische Datensammlung realisieren kann. Der Beitrag soll mir als Dokumentation und euch als Anregung f\u00fcr \u00e4hnliche Projekte dienen.<\/p>\n<h2 id=\"Anwendungsfall\">Anwendungsfall (Use Case)<\/h2>\n<p>In meinem Heimnetzwerk gibt es ein <a href=\"https:\/\/de.wikipedia.org\/wiki\/Network_Attached_Storage\" target=\"_blank\" rel=\"noopener\">NAS<\/a>, welches der Familie als allgemeines Datengrab dient. Lagen hier anfangs nur Datensicherungen anderer Ger\u00e4te, verwalten wir heute, neben anderen Daten, unsere Familien- und Urlaubsfotos auf diesem Ger\u00e4t. Es existiert eine lokale Datensicherung dieser Daten, die vor versehentlichem L\u00f6schen sch\u00fctzt.<\/p>\n<p>Nun sind uns einige dieser Daten so wichtig, dass wir sie auch gern gegen Verlust durch z.B. Feuer oder Diebstahl sch\u00fctzen m\u00f6chten. Dazu m\u00f6chte ich die betreffenden Daten gern au\u00dferhalb der eigenen vier W\u00e4nde an einem anderen Standort sichern. Diese Form der Datensicherung bezeichne ich im Folgenden auch als Offsite-Backup.<\/p>\n<h2 id=\"anforderungen\">Anforderungen<\/h2>\n<p>An das Offsite-Backup stelle ich folgende Anforderungen:<\/p>\n<ol>\n<li>Die Daten\u00fcbertragung erfolgt \u00fcber gesicherte Verbindungen<\/li>\n<li>Die Daten werden in einem Format gespeichert, welches das Lesen ohne Abh\u00e4ngigkeit zu bestimmten Programmen erm\u00f6glicht<\/li>\n<li>Die Daten\u00fcbertragung soll manuell angesto\u00dfen werden und optional zeitgesteuert ausgef\u00fchrt werden k\u00f6nnen<\/li>\n<li>Eine Wiederherstellung der Daten soll \u00fcber den gleichen Kanal wie die Datensicherung m\u00f6glich sein<\/li>\n<li>Die Daten sollen nicht bei einem kommerziellen Anbieter gespeichert werden<\/li>\n<li>Die Daten sollen nicht in einem Speicher abgelegt werden, der sich des unmittelbaren Zugriffs entzieht<\/li>\n<li>In den Routern der beteiligten Heimnetzwerke sollen keine eingehenden Portweiterleitungen konfiguriert werden m\u00fcssen<\/li>\n<\/ol>\n<p>Alles was ich ben\u00f6tige, um die obigen Anforderungen umzusetzen sind:<\/p>\n<ol>\n<li>Ein Raspberry Pi<\/li>\n<li>Eine externe USB-Festplatte zum Anschluss an den Pi<\/li>\n<li>Einen Linux-Root-Server im Internet<\/li>\n<li>Einen LAN-Port und Stromanschluss im Elternhaus<\/li>\n<\/ol>\n<p>Zu meinem Gl\u00fcck sind all diese Dinge bereits vorhanden und ich muss nicht erst eine Einkaufstour unternehmen.<\/p>\n<h2 id=\"loesung\">Die L\u00f6sung<\/h2>\n<p>In groben Z\u00fcgen erkl\u00e4rt, sieht die L\u00f6sung wie folgt aus. An den Raspberry Pi wird eine USB-Festplatte angeschlossen, welche als Speicher f\u00fcr die zu sichernden Daten dient. Der Pi wird in meinem Elternhaus an das dortige Heimnetzwerk angeschlossen. Von dort ausgehend baut er einen Reverse-SSH-Tunnel zu meinem Linux-Server auf, welcher bei einem Hoster l\u00e4uft und auf eingehende SSH-Verbindungen lauscht. So kann ich von dem Linux-Server aus auf den Pi zugreifen, ohne dass im DSL-Router in meinem Elternhaus eine Portweiterleitung eingerichtet werden muss. Dar\u00fcber hinaus entf\u00e4llt auch die Notwendigkeit, die Gegenstelle \u00fcber die sich \u00e4ndernde dynamische IP-Adresse auf dem Laufenden zu halten.<\/p>\n<div id=\"attachment_1934\" style=\"width: 749px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2017\/12\/offsite-backup.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1934\" class=\"size-full wp-image-1934\" src=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2017\/12\/offsite-backup.png\" alt=\"model of an offsite backup\" width=\"739\" height=\"217\" srcset=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2017\/12\/offsite-backup.png 739w, https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2017\/12\/offsite-backup-300x88.png 300w, https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2017\/12\/offsite-backup-624x183.png 624w\" sizes=\"auto, (max-width: 739px) 100vw, 739px\" \/><\/a><p id=\"caption-attachment-1934\" class=\"wp-caption-text\">SSH-Verbindungen \u00fcber eine Vermittlungsstelle f\u00fcr ein Offsite-Backup<\/p><\/div>\n<p>Nun kann ich von dem NAS aus meinem Heimnetzwerk eine SSH-Verbindung \u00fcber den Linux-Server zum Raspberry Pi in meinem Elternhaus aufbauen und Daten dorthin \u00fcbertragen. Auch in meinem Heimnetzwerk muss dazu keine Portweiterleitung geschaffen werden.<\/p>\n<h3>Konfiguration auf dem Pi<\/h3>\n<p>Auf dem Raspberry Pi habe ich das Betriebssystem Raspbian installiert. Anschlie\u00dfend habe ich ein <a href=\"https:\/\/wiki.ubuntuusers.de\/SSH\/#Authentifizierung-ueber-Public-Keys\" target=\"_blank\" rel=\"noopener\">SSH-Schl\u00fcsselpaar<\/a> erstellt und den \u00f6ffentlichen SSH-Schl\u00fcssel auf dem Linux-Server hinzugef\u00fcgt, um ohne die Eingabe eines Passworts eine SSH-Verbindung herstellen zu k\u00f6nnen. F\u00fcr die Verbindung verwende ich normale Linux-Benutzer ohne besondere Privilegien. Nun kann mit dem Befehl <code>ssh -R 22222:localhost:22 user@Linux-Server<\/code> ein Reverse-SSH-Tunnel zum Raspberry Pi aufgebaut werden. Der Reverse-SSH-Tunnel erm\u00f6glicht es, vom Linux-Server aus mit dem Befehl <code>ssh -p22222 localhost<\/code> eine Verbindung zum Raspberry Pi aufbauen zu k\u00f6nnen.<\/p>\n<p>Damit der Reverse-SSH-Tunnel nach der Provider-Zwangstrennung automatisch wieder aufgebaut wird, habe ich auf dem Raspberry Pi folgende <a href=\"https:\/\/wiki.ubuntuusers.de\/systemd\/Service_Units\/\" target=\"_blank\" rel=\"noopener\">Service-Unit<\/a> erstellt:<\/p>\n<pre>[Unit]\r\nDescription=\"Reverse ssh tunnel to proxy\"\r\nAfter=network.target\r\n\r\n[Service]\r\nUser=pusemuckel\r\nExecStart=\/usr\/bin\/ssh -NTi \/home\/pusemuckel\/.ssh\/id_rsa -o ServerAliveInterval=60 -R 22222:localhost:22 user@Linux-Server\r\nRestartSec=73\r\nRestart=always\r\n\r\n[Install]\r\nWantedBy=multi-user.target\r\n<\/pre>\n<p>Die Option <em>RestartSec<\/em> gibt an, dass bei einem Verbindungsabbruch 73 Sekunden gewartet wird, bevor ein erneuter Verbindungsversuch gestartet wird. Damit m\u00f6chte ich dem DSL-Router Zeit f\u00fcr die Wiedereinwahl geben.<\/p>\n<h3>Konfiguration auf dem NAS<\/h3>\n<p>Auf dem NAS erstelle ich im HOME-Verzeichnis des Benutzers, welcher sp\u00e4ter die Datensicherung ausf\u00fchren wird, die Datei <em>~\/.ssh\/config<\/em> mit folgendem Inhalt, um auf einfache Weise eine SSH-Verbindung zum Raspberry Pi im entfernten Standort herstellen zu k\u00f6nnen.<\/p>\n<pre>Host raspi\r\n        HostName localhost\r\n        Port 22222\r\n        ProxyCommand ssh -i ~\/.ssh\/nas_rsa -A -W %h:%p user@linux-server\r\n        IdentityFile ~\/.ssh\/nas_rsa\r\n<\/pre>\n<p><em>ProxyCommand<\/em> gibt an, dass der Linux-Server als Proxy bzw. Zwischenpunkt der Verbindung dient. In neueren SSH-Versionen kann man statt dessen auch die etwas einfacher zu handhabende Option <em>JumpHost<\/em> verwenden.<\/p>\n<p>Neben der obigen Datei wurde auf dem NAS ein SSH-Schl\u00fcsselpaar erstellt, dessen \u00f6ffentlicher Schl\u00fcssel auf dem Linux-Server und dem Raspberry Pi im entfernten Standort hinterlegt wurde. Dadurch ist f\u00fcr die Durchf\u00fchrung der Datensicherung keine Passworteingabe erforderlich. Da beide Endpunkte der Verbindung in vertrauensw\u00fcrdigen Netzen liegen, halte ich diese Vorgehensweise f\u00fcr vertretbar.<\/p>\n<h2>Probleme<\/h2>\n<p>Leider l\u00e4uft das Ganze noch nicht so rund und st\u00f6rungsarm, wie ich es mir w\u00fcnsche. Bei der Zwangstrennung rei\u00dft die Verbindung ab, ohne dass der Raspberry Pi eine Chance h\u00e4tte, den Socket auf dem Server zu schlie\u00dfen.<\/p>\n<p>Da der verwendete Port noch auf dem Linux-Server gebunden ist, schl\u00e4gt eine erneute Einwahl fehl. Erst wenn der Socket nach einem Timeout geschlossen wurde, ist eine erneute Wiederherstellung der Verbindung m\u00f6glich.<\/p>\n<p><strong>Update 2018-05-21:<\/strong> Danke an Christian F., welcher mich auf die Optionen ClientAliveCountMax und ClientAliveInterval hingewiesen hat. Mit diesen Optionen kann der SSH-Server erkennen, dass die Verbindung zum Client abgerissen ist und den Socket schlie\u00dfen.<\/p>\n<p>Der Standardwert f\u00fcr ClientAliveCountMax betr\u00e4gt 3. Dabei handelt es sich um <em>client alive messages<\/em>, welche der Server zum Client sendet. Bleiben alle drei unbeantwortet, baut der Server die Verbindung ab und gibt den Socket frei. Den Wert f\u00fcr ClientAliveInterval habe ich auf 15 gesetzt. Er gibt an, dass nach 15 Sekunden Inaktivit\u00e4t eine <em>client alive message<\/em> vom Server an den Client gesendet wird, um zu \u00fcberpr\u00fcfen, ob der Client noch antwortet.<\/p>\n<p>Antwortet der Client nicht, wird mit der obigen Konfiguration die Verbindung vom Server nach 45 Sekunden abgebaut und der Socket freigegeben. Der Client kann sich anschlie\u00dfend wieder neu verbinden. Auf dem Client habe ich den Parameter RestartSec auf 73 Sekunden gesetzt (einfach weil mir die Zahl so gut gef\u00e4llt). Nach dem Abriss der Verbindung durch die Zwangstrennung wird der Tunnel nach 73 Sekunden wieder aufgebaut.<\/p>\n<h2>Fazit<\/h2>\n<p>Mit dieser kleinen Bastell\u00f6sung kann ich meine Daten \u00fcber einen gesicherten Kanal in einen entfernten Standort sichern. Das manuelle Offsite-Backup klappt bereits gut, wenn der SSH-Tunnel zwischen Linux-Server und Raspberry Pi steht.<\/p>\n<p>Da das Problem mit der Zwangstrennung nun etwas entsch\u00e4rft werden konnte, steht auch einem zeitgesteuerten Backup grunds\u00e4tzlich nichts mehr im Wege. Es bleibt lediglich das Restrisiko, dass sich der Zeitpunkt der Zwangstrennung \u00e4ndert und diese dann das zeitgesteuerte Backup unterbricht. Mit diesem Risiko komme ich jedoch zurecht.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im heutigen Beitrag aus der Kategorie Wochenend-Projekte geht es darum, wie man mit Hilfe eines Reverse-SSH-Tunnels ein Offsite-Backup f\u00fcr die heimische Datensammlung realisieren kann. Der Beitrag soll mir als Dokumentation und euch als Anregung f\u00fcr \u00e4hnliche Projekte dienen. Anwendungsfall (Use Case) In meinem Heimnetzwerk gibt es ein NAS, welches der Familie als allgemeines Datengrab dient.<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/mit-einem-reverse-ssh-tunnel-zum-offsite-backup\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[57],"tags":[496,430,305,494,161,493,495],"class_list":["post-1936","post","type-post","status-publish","format-standard","hentry","category-wochenend-projekte","tag-offsite-backup","tag-osbn","tag-planet","tag-reverse","tag-ssh","tag-ssh-reverse-tunnel","tag-tunnel"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=1936"}],"version-history":[{"count":11,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1936\/revisions"}],"predecessor-version":[{"id":2677,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1936\/revisions\/2677"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=1936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=1936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=1936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}