Fernzugriff auf den Raspberry Pi via Internet und DuckDNS.org

7 Kommentare Autor: Jürgen (jdo)

Hast Du einen Raspberry Pi zu Hause, auf den Du aus dem Internet zugreifen willst? Das ist gar nicht so schwer. Hast Du allerdings keine fixe IP-Adresse von Deinem Provider, dann kommt sogenanntes DDNS ins Spiel. Das steht für dynamisches DNS und ist schnell erklärt. Es gibt diverse kostenlose DDNS-Services und einer davon ist DuckDNS.org.

Ich erkläre Dir, warum ich mich für diesen Anbieter entschieden habe und warum ich wegen Let’s Encrypt wechseln musste. Stichwort: DNS TXT Record

Werfen wir aber zunächst einen Blick auf eine ganz normale DNS-Abfrage. Die läuft so ab:

DNS-Anfrage einfach dargestellt

So läuft eine DNS-Anfrage ab

Da die IP-Adressen von fast allen ISP (Internet Service Provider) dynamisch vergeben werden, können wir uns nicht wie in der Abfrage oben auf immer die gleiche IP-Adresse verlassen.

Wichtiger Hinweis! Ist Dein Raspberry Pi über das Internet erreichbar, dann ändere auf jeden Fall Dein Passwort! Benutze ein sicheres Passwort und überlege Dir auch die Installation von fail2ban, um Brute-Force-Angriffe abzuschwächen. Machst Du Deinen Raspberry Pi oder einen anderen Rechner öffentlich erreichbar, ist das mit Risiken verbunden! Über die solltest Du Dir im Klaren sein!

Was ist DDNS?

Das ist einfach erklärt. Du darfst Dir bei einem DDNS-Anbieter eine Subdomain aussuchen. Auf Deinem Raspberry Pi läuft eine Routine, die den DDNS-Anbieter regelmäßig kontaktiert.

Ich habe mir zum Beispiel die Adresse meinbeispiel.duckdns.org reserviert und muss dem DDNS-Anbieter, also duckdns,org, nun sagen, welche IP-Adresse mir der ISP zugewiesen hat. Sobald das hinterlegt ist, werden alle Anfragen an meinbeispiel.duckdns.org an meine temporäre IP-Adresse weitergeleitet.

Port Forwarding im Router

Nun landen die Anfragen also bei meinem Router. Allerdings weiß der Router nicht, was er damit machen soll und verwirft sie in der Regel. Deswegen muss ich dem Router sagen, welcher Port auf welche Maschine intern weitergeleitet werden soll. In meinem Fall ist es Port 443, weil ich https auf meine interne Nextcloud auf dem Raspberry Pi* oder einen anderen internen Server weiterleiten will. Der interne Rechner hat in meinem Fall die IP-Adresse 192.168.100.3.

Port Forwarding im Router

Port Forwarding im Router

Rufe ich also nun die Adresse https://meinbeispiel.duckdns.org/nextcloud/ auf, dann lande ich im Bild oben auf der Nextcloud-Installation des internen Rechners mit der IP-Adresse 192.168.100.3.

Willst Du auf Deinem Raspberry Pi oder eine andere Linux-Maschine via SSH zugreifen, dann musst Du per Standard Port 22 auf die entsprechende Maschine weiterleiten.

Hinweis: Ich habe die DDNS Domain in meinem Pi-hole unter DNS als Local domain name hinterlegt und kann nun auch aus dem LAN auf die Domain zugreifen. Da gibt es mehrere Methoden und auch in einigen Routern kannst Du das konfigurieren. Ich wollte es nur ansprechen, weil es nicht selbstverständlich ist, dass Du aus dem LAN auch auf die Domain Zugriff hast. Da kann es zu komischen Phänomenen kommen, wenn Anfragen nach außen und dann über den Router wieder nach innen geleitet werden sollen.

Bei DuckDNS.org muss man sich anmelden

Was Datenschützer nun anprangern könnten: Bei Duck DNS musst Du Dich anmelden. Es stehen allerdings mehrere Optionen zur Verfügung. Derzeit kannst Du Dich via Twitter, GitHub, reddit, Google oder sogar noch mit Persona anmelden / registrieren. Zu Persona muss man aber sagen, dass der Service nicht mehr weitergeführt wird. Deswegen ist es ratsam, eine andere Methode zu benutzen.

Weiterhin wird DuckDNS.org auf AWS gehostet. Auch da könnten einige die Nase rümpfen. Ich sehe das in diesem Fall etwas entspannter, weil irgendwo muss der Service ja gehostet sein. Ich benutze den Service schon länger und muss sagen, dass er mich noch nie im Stich gelassen hat. Er funktioniert zuverlässig und ich habe keinen Grund zur Annahme, dass meine Daten irgendwie missbraucht werden. Muss aber jeder für sich entscheiden, Du kannst Dir ja die Datenschutzrichtlinie des Anbieters durchlesen. Klar sollte Dir schon sein, dass der Anbieter die IP-Adresse speichern muss, um den Service anbieten zu können.

DuckDNS.org bietet mehrere Möglichkeiten, sich anzumelden

DuckDNS.org bietet mehrere Möglichkeiten, sich anzumelden

Sobald Du angemeldet bist, bekommst Du zwei Bereiche zu Gesicht. Oben befinden sich Deine Konto-Informationen und auch der Token, den Du später wieder brauchst. Weiter unten ist noch ein Bereich, bei dem Du bis zu 5 Domains anlegen darfst. Das ist ganz praktisch, solltest an mehreren Stellen Maschinen haben, die Du via DDNS erreichen möchtest oder musst. Vielleicht steht ja irgendwo ein Raspberry Pi mit einem Sense Hat, der Dich über Wetterdaten auf dem Laufenden hält.

Duck DNS auf dem Raspberry Pi oder unter Linux einrichten

Das Schöne an Duck DNS ist, dass Du keinen speziellen DDNS Client brauchst, um die IP-Adresse zu aktualisieren. Es funktioniert über einen Web-Aufruf und funktioniert bequem über curl und einen Cronjob.

Die Entwickler stellen Anleitung für viele Systeme zur Verfügung. Du wählst einfach Deine Subdomain aus und klickst dann auf das System, für das Du den DDNS Service einrichten möchtest.

DuckDNS.org auf einem Raspberry Pi einrichten

DuckDNS.org auf einem Raspberry Pi einrichten

Im Endeffekt ist die Prozedur sehr einfach. Öffne eine URL, die Deinen Token und Deine Subdomain enthält und die IP-Adresse aktualisiert sich. Auf einem Raspberry Pi oder einem anderen Linux-System erstellst Du am besten einen Ordner und eine Datei mit dem relevanten Befehl:

mkdir duckdns
cd duckdns
vi duck.sh

Taugt Dir vi nicht, dann nimm nano oder einen anderen Text-Editor. Dort hinterlegst Du folgende Zeile:

echo url="https://www.duckdns.org/update?domains=<DeineDomain>&token=<DeinToken>&ip=" | curl -k -o ~/duckdns/duck.log -K -

Folgst Du einer Anleitung wie oben im Screenshot zu sehen, sind die Werte bereits richtig hinterlegt. Du musst also wirklich nur kopieren und einfügen. Im Anschluss machst Du die Datei ausführbar:

chmod 700 duck.sh

Nun richtest Du den Crobjob ein, der alle 5 Minuten laufen soll. Du kannst das auch weniger oder mehr Zeit zwischen den Aufrufen lassen. Der Cronjob muss übrigens nicht als root laufen!

crontab -e

Füge am Ende der Datei diese Zeile ein:

*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

Ich persönlich mag das mit der Tilde nicht und gebe eigentlich immer komplette Pfade ein. Also zum Beispiel:

*/5 * * * * /home/pi/duckdns/duck.sh >/dev/null 2>&1

Es funktioniert in dem Fall aber beides.

Datei manuell testen

Rufst Du die Datei manuell auf, wird die IP-Adresse sofort erneuert.

./duck.sh

Die Ausgabe ist wenig aufschlussreich, aber das kleine Skript erzeugt eine Datei, die sich duck.log nennt. Ist die Anfrage erfolgreich, steht OK drin. Ist etwas schiefgelaufen, dann ist sie mit KO gefüllt.

Wurde die IP-Adresse bei Duck DNS erfolreich aktualisiert, erreichst Du Dein Netzwerk nun von außen über die Subdomain. Testen kannst Du das gut, indem Du die mobilen Daten auf Deinem Smartphone nutzt und einfach einen ping auf die Domain absetzt. Gibt ja genügen Tools dafür.

DuckDNS.org unterstützt DNS TXT Records

Die Unterstützung von DNS TXT Records sind ein weiterer Grund, warum ich duckdns.org mag. Die Erneuerung meines Let’s-Encrypt-Zertifikats bei meinem alten DDNS hat nicht mehr funktioniert, weil ein Token nicht per http erreichbar ist. Mein interner Server leitet alle Anfragen direkt auf https um und ich will ihn auch nicht öffnen. Die Fehlermeldung sieht so aus:

Kann Zertifikat nicht erneuern

Kann Zertifikat nicht erneuern

Nach ein bisschen Recherche stellte sich heraus, dass ich nicht der einzige bin, der das Problem hat. Ich habe sogar ausprobiert, das über Port 80 und http zu machen, aber auch das scheiterte. Grund ist wohl, dass man bei Let’s Encrypt nun beweisen muss, dass einem die Domain auch wirklich gehört.

Eine Möglichkeit ist, das über einen sogenannten DNS TXT Record zu machen. Dazu muss ich aber Certbot anweisen, die Challenge via DNS durchzuführen. Das sieht bei mir so aus:

certbot -d <MeineDomain>.duckdns.org --manual --preferred-challenges dns certonly

Damit bekommst Du eine Ausgabe wie die Folgende:

Wert für den DNS TXT Record

Wert für den DNS TXT Record

Wichtig ist nun der Wert für den DNS TXT Record. Trage das nun bei duckdns.org mit einem Link wie diesem ein. Ersetze dafür die Werte in <> und lasse die Klammern weg!

https://www.duckdns.org/update?domains=<MeineDomain>.duckdns.org&token=<MeinDuckDNSToken>&txt=<WertVonOben>

 Die URL kannst Du einfach im Browser aufrufen und solltest dann ein OK bekommen.

DNS TXT Record bei duckdns.org hinterlegt

DNS TXT Record bei duckdns.org hinterlegt

Nun kannst Du Dein Zertifikat wie gewohnt erneuern und auch über einen Cronjob automatisch erneuern lassen. Es war zwar etwas Arbeit, meine Nextcloud Clients auf die neue DDNS Domain umzustellen, aber dafür bekomme ich wieder ein frisches Zertifikat.

Nicht hübsch, funktioniert aber

Sehr schick sieht der Service nicht aus, das muss man zugeben. Dafür funktioniert er hervorragend und hat mich noch nicht im Stich gelassen.

Du musst keinen zusätzlichen Client installieren und der DDNS Service ist außerdem kostenlos. Die Unterstützung für DNS TXT Records schätze ich außerdem sehr. Nun aktualisiert sich mein Zertifikat von Let’s Encrypt wieder automatisch und es gibt keine Fehlermeldung, beziehungsweise muss ich nicht mit einem selbst signierten Zertifikat hantieren.

Gibt es Alternativen zu DuckDNS.org?

Oh ja, jede Menge. Einige kosten Geld, die anderen sammeln natürlich ebenfalls gewisse Daten wie zum Beispiel die IP-Adresse. Wieder andere Anbieter setzen die Installation einer zusätzlichen Software wie zum Beispiel ddclient voraus.

Ich habe mir schon Mal Gedanken gemacht, meinen eigenen Server zu benutzen. Dorthin könnte ich meine externe IP-Adresse ja einfach übermitteln. Derzeit ist es mir den Aufwand aber nicht wert, einen eigenen Service dafür zu nutzen. DuckDNS.org funktioniert und bis auf die DNS-Anfragen laufen ja keinerlei Daten drüber. Somit ist das in Ordnung, wie es derzeit ist.

Wenn es ähnliche und bessere Alternativen gibt, bin ich natürlich immer für Tipps dankbar.

Als VPN-Eigenbau nutzen

Hier ist noch eine Idee. Hast Du Fernzugriff auf Deinen Raspberry Pi via Port 22, könntest Du damit auch Dein eigenes VPN basteln. Mit Android würde das zum Beispiel über Ki4a funktionieren. Hast Du eine Linux-Maschine, wäre sshuttle ein VPN für Arme. Klar funktioniert auch SSH-Tunnel, den Du dann über einen SOCKS Proxy nutzt. Hier eine Kurzanleitung, wie das funktionieren würde.

Erstelle zunächst einen Tunnel von Deinem Client wie zum Beispiel:

ssh -D 8234 -f -C -q -N <benutzername>@<MeineDomain>.duckdns.org

Hier noch eine kurze Erklärung der Schalter:

  • Hinter -D steht der Port, den Du später für die SOCKS-Konfiguration nimmst. Du darfst eine Zahl zwischen 1025 und 65536 wählen. Das ist der Port für die lokale Maschine. Der SSH-Zugriff auf Deinen Pi erfolgt per Standard über Port 22, den Du im Router weiterleiten musst.
  • -f schiebt den Prozess in den Hintergrund. Also die Kommandozeile wird wieder freigegeben und Du musst sie nicht offen halten.
  • Durch -C werden die Daten vor dem Verschicken komprimiert.
  • Das -q lässt die Software weniger geschwätzig sein (quiet).
  • -N teilt SSH mit, dass nach dem Etablieren des Tunnels kein Befehl geschickt wird. Willst Du wie in meinem Fall nur ein Port Forwarding durchführen, ist das genau, was wir wollen.

Du findest weitere Informationen zu den Schaltern in der Manpage von SSH: man ssh.

Firefox würdest Du dann zum Beispiel so konfigurieren.

Eigenen Proxy für Firefox nutzen

Eigenen Proxy für Firefox nutzen

Damit benutzt Du die Internet-Verbindung Deines ISPs zu Hause. Das ist ganz in Ordnung, aber Du bist an den Standort oder die IP-Adresse gebunden, die Deinem Router zugewiesen wird. Geoblocking kannst Du dann nur für das Land umgehen, in dem Dein Raspberry Pi steht.

Ja, ich gebe zu, dass diese Methode nur für technisch versierte Leute und nicht für Neulinge attraktiv ist. Sie funktioniert aber.

Nette Pi-Konstellation

Suchst Du ein VPN für den Raspberry Pi? NordVPN* bietet einen Client, der mit Raspberry Pi OS (32-Bit / 64-Bit) und Ubuntu für Raspberry Pi (64-Bit) funktioniert.




 Alle Kommentare als Feed abonnieren

7 Kommentare zu “Fernzugriff auf den Raspberry Pi via Internet und DuckDNS.org”

  1. Patrick says:

    Sehr schöne Dokumentation eines der besten dynamischen DNS Anbieters weit und breit.
    Den Datenschutz hattest du ja bereits angesprochen, finde ich bei DuckDNS aber minimal invasiv. Ohne Protokollierung der IP funktioniert es eben nicht. Etwas umständlicher finde ich dagegen, daß man sich zwangsläufig durch einen Drittdienst wie Twitter oder Google authentifizieren muß. Dadurch entledigt sich der Anbieter natürlich eines großen Problems, finde es trotzdem etwas unschön.

    • jdo says:

      Da gebe ich Dir völlig Recht. Das ist auch der einzige Punkt, der mir etwas sauer aufgestoßen ist. Allerdings überwiegen die Vorteile so stark, dass ich damit leben kann.

  2. flavius says:

    Mein Lieblings-DNS-Anbieter ist he.net, bzw. dns.he.net. Nicht ganz so bunt, und man muss sich etwas einarbeiten, aber dafür ziemlich flexibel und super zuverlässig. Bieten auch eigene Nameserver, die ziemlich gut sind.

  3. Martin says:

    Sehr guter Artikel. Nur leider funktioniert es so nicht 100%. Darum hier der wichtige Tip: Bei der Anpassung der Rechte für duck.sh unbedingt chmod 755 duck.sh eingeben (und nicht chmod 700). Grund: Default user auf dem Raspberry ist pi. Und mit crontab -e editiert man die crontab von user pi. D.h. duck.sh wird von user pi ausgeführt und der hat mit der Zugriffsberechtigung 700 keine X-ecute Berechtigung!

    • jdo says:

      Quatsch ... legt Anwender pi die Datei duck.sh an, dann mach chmod 700 die Datei für den Anwender pi rwx, also auch ausführbar. Schau bitte mal nach, ob Du da mit den Usern irgendwie durcheinander gekommen bist. Bei mir funktioniert das wie beschrieben einwandfrei und das seit langer Zeit.

  4. Martin says:

    Hallo jdo. Hast recht, ist Quatsch was ich oben geschrieben habe. Wenn man es GENAU so macht wie von dir beschrieben, funktioniert es!

    Vermutlich habe ich duck.sh mit "sudo nano duck.sh" erstellt. Somit war der Besitzer der Datei root und Benutzer pi hatte darum keinen Zugriff.
    Als Neuling mit Raspberry Pi und Linux habe ich viele Befehlsbeispiele aus dem Internet ausprobiert. Diese Beispiele beginnen häufig mit "sudo nano..". "sudo" vor jedem Befehl war vermutlich in meinem Linux Gedächtnis "hardcoded" 🙂

    Verwirrt hat mich als Neuling auch die Tatsache, dass es mehrere crontabs gibt, systemweite und pro user. Somit ist "sudo crontab -e" nicht dasselbe wie "crontab -e". Dazu kann ich diesen Artikel empfehlen: http://raspberry.tips/raspberrypi-einsteiger/cronjob-auf-dem-raspberry-pi-einrichten.

    Also entschuldigt bitte meinen irreführenden Hinweis und macht beim Nachvollziehen der Befehle nicht dieselben Fehler wie ich. Duck DNS läuft bei mir nun zuverlässig (auch ohne chmod 755!) und ich kann den dyn dns Dienst wegen der einfachen Konfiguration jedermann empfehlen.