Dynamische IP Adresse mit Bordmitteln

Dynamic IP für Arme 🙂

Hat man auf dem Pi einen Webserver installiert und dazugehörige Seiten entwickelt, möchte man sie natürlich auch von "außen" zugänglich machen. Der sauberste Weg wäre, eine Dynamische IP Adresse von einem Provider zu besorgen. Es geht für einfache Anwendungsfälle aber auch mit Bordmitteln. Wie, das zeige ich euch in diesem Beitrag:

Voraussetzungen:

  • ein bisschen Ahnung von Python
  • Webspace, der mit FTP zugänglich sein muss – z.B. bei space4free.net oder so.
  • Router mit Portfreischaltung

Gebt in euren Browser mal folgende Adresse ein: http://whatismyip.akamai.com
Im Browser erscheint die IP Adresse, unter der euer Netzwerk von "außen" sichtbar ist.
Diese Information können wir mit Python auslesen, in einen in Python erzeugten html Code einbauen und auf unseren Webspace hochladen.

los gehts

Der erste Teil unseres Progrämmchens ist der übliche Shebang Kram und der Import der Libraries für FTP und Requests. Requests und wie man es installiert habe ich schon in diesem Beitrag vorgestellt.

actip enthält jetzt die von Akamai zur Verfügung gestellte IP Adresse als Unicode-String

Diese vergleichen wir jetzt mit der im vorherigen Aufruf ermittelten IP Adresse, welche wir weggeschrieben haben.

Die Except IOError Schleife hilft, einen Programmfehler zu vermeiden wenn das Programm das erste Mal läuft und noch keine "historische" IP Adresse weggespeichert wurde. Die Variable lastip enthält die bis zum letzten Lauf noch gültige IP Adresse als String. In den meisten Fällen wird sie sich nur einmal täglich ändern, wenn euer DSL Provider die Verbindung nachts unterbricht. Bei IP über Kabel ist die Adresse oft über Monate hinweg konstant.

Der folgende und letzte Teil wird nur abgearbeitet, wenn die beiden IP Adressen unterschiedlich sind:

Im Prinzip wird html Code erzeugt und überall wo die Adresse eures Pi gefragt ist, wird die vorhin ermittelte IP Adresse reingeschrieben. Anschließend wird die Datei in euren Webspace hochgeladen. Da html viel mit doppelten Anführungszeichen arbeitet, müssen die zum html Code gehörenden Anführungszeichen mit einem vorangestellte Backslash als Escape in den Python String eingebaut werden.

Ihr könnt auf diese Weise beliebig viele Links erzeugen.  Anstatt auf ein html Dokument zu verweisen, kann man auch einfach nur ein Verzeichnis auf dem Webserver angeben. Dann wird ein dort liegendes Default Dokument (z.B. index.html oder index.php) aufgerufen.

Achtung: bei Python Version 3 und höher muss beim FTP schreiben mit storbinary eine Binärdatei übergeben werden. Diese bekommt man, indem die Ausgangsdatei piip.html mit dem Parameter 'rb' eingelesen wird.  Bei Python 2.7 hat hier noch ein 'r' für Read gereicht. Siehe gelb markierte Zeile im Code oben.

Was ich immer noch nicht herausgefunden habe, ist wie man ein Objekt – unsere erzeugte html Datei – direkt in FTP hochladen kann. So muss ich sie erst speichen, nur um sie hinterher wieder zu laden und in meinen Webspace hoch zu laden.

Regelmäßige Durchführung

Ab in die Crontab mit crontab -e
Dort in die unterste Zeile
*/10 * * * * /home/pi/ip.py
eintragen. Damit wird das Programm ip.py oder welchen Namen auch immer ihr ihm gegeben habt, alle 10 Minuten ausgeführt.

Portfreischaltung (Beispiel Fritz!Box)

Um einen Port bei der Fritz!Box freizuschalten geht man wie folgt vor:

  1. zuerst die Admin Oberfläche aufrufen
  2. Menüpunkt Internet und dann Freigaben auswählen
    Portfreigabe
  3. Ich empfehle, wie folgt vorzugehen: Bei "Portfreigabe aktiv für"Andere Anwendungen auswählen. So habt ihr die Möglichkeit, außen eine andere Portadresse als die Standardadresse 80 zu verlangen. Bei von Port und bis Port die gleiche, beliebige, freie Portnummer (größer 1024) eintragen. Damit sind zumindest einfache Portscan Attacken erschwert. Die Portnummer muss sich immer auch in den oben erklärten Linkadresse wiederfinden. Das sähe dann für Portnummer 9000 wie folgt aus:
  4. Dann bei an Computer euren Raspberry Pi auswählen oder falls er nicht angezeigt wird manuelle Eingabe der IP Adresse auswählen und ins Feld darunter die interne(!)  IP Adresse eures Pi eintragen
  5. Bei an Port würde ich die 80 stehen lassen, da dies die Standard HTML Adresse eures Webservers auf dem Pi ist.

Warnung – Disclaimer – sonstiges

  • Durch die Portfreischaltung hat eure Firewall ein Loch bekommen. Also Vorsicht und den Pi zusätzlich absichern z.b. wie bei Kampis-Elektroecke beschrieben – hier findet ihr auch eine Anleitung zur Installation des Lighttpd Webservers und – weiter unten – eine Anleitung zum Passwortschutz.
  • Anstatt eine komplette html Seite zu übertragen, könnte man auch auf dem Webspace ein Javascript einbauen, das die hochgeladene IP Adresse dann in die Links einbaut – war mir zu mühsam. Ebenso ginge eine Lösung mit php.
  • Der Aufruf funktioniert nur mit einfachen Webseiten und nur mit relativen Hyperlinks – komplette Applikationen wie WordPress werden auf die Nase fallen. Da braucht ihr wirklich eine professionelle Dyn IP Adresse.
  • Eine direkte Lösung für Putty habe ich auch nicht, aber ihr könnt zumindest die in der erzeugten Website angezeigte IP Adresse in Putty übernehmen und so auf den Pi zugreifen. Allerdings nur, wenn ihr im Router einen Port für SSH (standardmäßig: 22) freischaltet. Siehe auch meinen Beitrag  SSH Portadresse ändern.

4 Gedanken zu „Dynamische IP Adresse mit Bordmitteln

  1. Hallo Chris,

    eine schöne Seite mit vielen interessanten Artikeln hast du da. Besonders die Seite mit dem Rverese SSH Tunnel hat mir sehr weitergeholfen. Zu deiner Frage wie man das Html direkt auf den FTP server hochladen kann:

    es gibt die python library:

    https://docs.python.org/2/library/stringio.html

    Sie bietet ein file ähnliches interface an, nur dass die daten dann in strings im ram liegen und nicht auf der platte.

    Auch wenn der gewinn bei deinen paar bytes, die du da von zeit zu zeit schreibst eigentlich irrelevant ist … wenn du aber alle paar sekunden disk access hättest und das auf einer HDD, würdest du verhindern, dass diese sich schlafen legen kann.

    Das kannst du dann mit dem modul gut verhindern.

    Viele Grüße
    Stephan

    1. Hi Stephan,
      ahhh super! Da der Pi ja alles auf seine SD Karte schreibt, verschleißt diese relativ schnell. Ich bin deshalb dazu übergegangen, Scratchfiles etc. in eine "Ramdisk" (tmpfs) im Hauptspeicher zu schreiben. Mit strinio kann ich mir das in diesem Fall sparen.
      Der Beitrag über den Reverse Tunnel ist in der Tat sehr gefragt (so um die 75 Besucher/Tag). Nachdem ich monatelang herumgebastelt hatte und dabei x-mal meine Installation vergurkt habe, wollte ich den Weg für andere User dokumentieren und habe dieses Blog hier geschrieben – läuft übrigens auf einem Raspberry Pi III bei mir zuhause.
      Viele Grüße aus München
      Chris

  2. Guter Artikel ! Ich hätte einen ähnlichen Anwendungsfall unter Linux: Es sollen zwei Kubuntu Laptops, jeweils mit Aldi SIM Karten, über ssh verbunden werden. Für File transfer, remote Wartung, etc. Bieten Sie hierfür Unterstützung an? Wenn ja, rufen Sie mich bitte an. MfG R. Mayer-Bachmann

    1. Hallo,
      erstmal danke für das freundliche Lob! Allerdings schreibe ich das alles ja nur aus Spaß an der Freude in meiner Freizeit – d.h ich bin kein Profi nur ein Amateur. Das allerdings hilft dabei, die Tutorials etc. so zu schreiben, dass ein engagierter Laie sie auch versteht.
      Wie man auf einen über Mobilfunk mit dem Internet verbundenen Linux Rechner (in meinem Beispiel Raspberry Pi) über SSH zugreifen kann, ist in diesem Post beschrieben: http://chriskrz.selfhost.bz/index.php/reverse-ssh-tunnel-schritt-fur-schritt/
      Ich nehme an, Sie wollen einen entfernten Rechner mit einem anderen Rechner (den jemand bedient) koppeln. d.h. ein Rechner im Mobilfunknetz baut den Tunnel auf, der andere greift über den Tunnel auf ihn zu – egal, ob der nun über Kabel oder per Mobilfunk im Internet ist. Für diesen Anwendungszweck ist meine Anleitung geschrieben. Ob das nun Debian, Raspian oder Kubuntu oder eine andere Linux Distribution ist, dürfte wenig Unterschied machen.
      Bei Problemen einfach melden.
      Freundliche Grüße Chris

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert