Inhalt
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.
1 2 3 4 5 6 7 8 |
#!/usr/bin/python #coding=UTF-8 import requests from ftplib import FTP r = requests.get("http://whatismyip.akamai.com") actip = r.text r.close() |
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.
1 2 3 4 5 6 7 |
# letzten bekannten Wert lesen try: lastaddr=open('/home/pi/lastip.dat','r') lastip=lastaddr.readline() lastaddr.close() except IOError: lastip="0.0.0.0" |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
if actip != lastip: print "ungleich" lastaddr=open('/home/pi/ownprog/lastip.dat','w') lastaddr.write(actip) lastaddr.close() # generiere html Link Seite htmlfile=open('/home/pi/piip.html','w') #html header info htmlfile.write("<html><head><title>Raspberry Pi Link List</title></head><body><span style=\"font-family:'Verdana', sans-serif\"><h2>" + actip + " Link List</h2>") #erstes Link htmlfile.write("<a href=\"http://"+actip+"/webVerzeichnis/htmlDatei/\">erstes Link</a><br>") #zweites Link htmlfile.write("<a href=\"http://"+actip+"/webVerzeichnis/andereHtmlDatei/\">zweites Link</a><br>") # html Footer htmlfile.write("<br></body></html>") htmlfile.close() # FTP handling htmlfile=open('/home/pi/piip.html','rb') ftp = FTP('dein.ftp.server') ftp.login(user='deinUsername', passwd='DeinPasswort') #set passive mode ftp.set_pasv(1) ftp.storbinary("STOR piip.html", htmlfile) ftp.quit() ftp.close() htmlfile.close() |
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:
- zuerst die Admin Oberfläche aufrufen
- Menüpunkt Internet und dann Freigaben auswählen
- 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:
1htmlfile.write("<a href="http://"+actip+":9000/webVerzeichnis/htmlDatei/">erstes Link</a><br>") - 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
- 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.
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
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
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
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