{"id":344,"date":"2015-02-15T16:04:22","date_gmt":"2015-02-15T15:04:22","guid":{"rendered":"http:\/\/chriskrz.selfhost.bz\/?p=344"},"modified":"2025-09-22T09:08:14","modified_gmt":"2025-09-22T07:08:14","slug":"dynamische-ip-mit-bordmitteln","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/dynamische-ip-mit-bordmitteln\/","title":{"rendered":"Dynamische IP Adresse mit Bordmitteln"},"content":{"rendered":"<h3>Dynamic IP f\u00fcr Arme \ud83d\ude42<\/h3>\n<p>Hat man auf dem Pi einen Webserver installiert und dazugeh\u00f6rige Seiten entwickelt, m\u00f6chte man sie nat\u00fcrlich auch von \"au\u00dfen\" zug\u00e4nglich machen. Der sauberste Weg w\u00e4re, eine Dynamische IP Adresse von einem Provider zu besorgen. Es geht f\u00fcr einfache Anwendungsf\u00e4lle aber auch mit Bordmitteln. Wie, das zeige ich euch in diesem Beitrag:<\/p>\n<p><!--more--><\/p>\n<h4>Voraussetzungen:<\/h4>\n<ul>\n<li>ein bisschen Ahnung von Python<\/li>\n<li>Webspace, der mit FTP zug\u00e4nglich sein muss &#8211; z.B. bei <a href=\"http:\/\/space4free.net\">space4free.net<\/a> oder so.<\/li>\n<li>Router mit Portfreischaltung<\/li>\n<\/ul>\n<p>Gebt in euren Browser mal folgende Adresse ein: <a title=\"http:\/\/whatismyip.akamai.com\" href=\"http:\/\/whatismyip.akamai.com\" target=\"_blank\" rel=\"noopener\"><code>http:\/\/whatismyip.akamai.com<\/code><\/a><br \/>\nIm Browser erscheint die IP Adresse, unter der euer Netzwerk von \"au\u00dfen\" sichtbar ist.<br \/>\nDiese Information k\u00f6nnen wir mit Python auslesen, in einen in Python erzeugten html Code einbauen und auf unseren Webspace hochladen.<\/p>\n<h4>los gehts<\/h4>\n<p>Der erste Teil unseres Progr\u00e4mmchens ist der \u00fcbliche Shebang Kram und der Import der Libraries f\u00fcr FTP und Requests. Requests und wie man es installiert habe ich schon in diesem <a title=\"Image Manipulation \u2013 mit PIL Bilddateien ver\u00e4ndern\" href=\"http:\/\/www.rustimation.eu\/index.php\/wetterbericht-und-astrodaten-auslesen-und-mit-json-verarbeiten\/\" target=\"_blank\" rel=\"noopener\">Beitrag <\/a>vorgestellt.<\/p>\n<pre class=\"lang:python decode:true \">#!\/usr\/bin\/python\r\n#coding=UTF-8\r\nimport requests\r\nfrom ftplib import FTP\r\n\r\nr = requests.get(\"http:\/\/whatismyip.akamai.com\")\r\nactip = r.text\r\nr.close()<\/pre>\n<p><code>actip<\/code> enth\u00e4lt jetzt die von Akamai zur Verf\u00fcgung gestellte IP Adresse als Unicode-String<\/p>\n<p>Diese vergleichen wir jetzt mit der im vorherigen Aufruf ermittelten IP Adresse, welche wir weggeschrieben haben.<\/p>\n<pre class=\"lang:python decode:true\"># letzten bekannten Wert lesen\r\ntry:\r\n    lastaddr=open('\/home\/pi\/lastip.dat','r')\r\n    lastip=lastaddr.readline()\r\n    lastaddr.close()\r\nexcept IOError:\r\n    lastip=\"0.0.0.0\"<\/pre>\n<p>Die <code>Except IOError<\/code> Schleife hilft, einen Programmfehler zu vermeiden wenn das Programm das erste Mal l\u00e4uft und noch keine \"historische\" IP Adresse weggespeichert wurde. Die Variable <code>lastip<\/code> enth\u00e4lt die bis zum letzten Lauf noch g\u00fcltige IP Adresse als String. In den meisten F\u00e4llen wird sie sich nur einmal t\u00e4glich \u00e4ndern, wenn euer DSL Provider die Verbindung nachts unterbricht. Bei IP \u00fcber Kabel ist die Adresse oft \u00fcber Monate hinweg konstant.<\/p>\n<p>Der folgende und letzte Teil wird nur abgearbeitet, wenn die beiden IP Adressen unterschiedlich sind:<\/p>\n<p>Im Prinzip wird html Code erzeugt und \u00fcberall wo die Adresse eures Pi gefragt ist, wird die vorhin ermittelte IP Adresse reingeschrieben. Anschlie\u00dfend wird die Datei in euren Webspace hochgeladen. Da html viel mit doppelten Anf\u00fchrungszeichen arbeitet, m\u00fcssen die zum html Code geh\u00f6renden Anf\u00fchrungszeichen mit einem vorangestellte Backslash als Escape in den Python String eingebaut werden.<\/p>\n<pre class=\"expand:true lang:python mark:18 decode:true\">if actip != lastip:\r\n    print (\"ungleich\")\r\n    lastaddr=open('\/home\/pi\/ownprog\/lastip.dat','w')\r\n    lastaddr.write(actip)\r\n    lastaddr.close()\t\r\n    # generiere html Link Seite\r\n    htmlfile=open('\/home\/pi\/piip.html','w')\r\n    #html header info\r\n    htmlfile.write(\"&lt;html&gt;&lt;head&gt;&lt;title&gt;Raspberry Pi Link List&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;span style=\\\"font-family:'Verdana', sans-serif\\\"&gt;&lt;h2&gt;\" + actip + \" Link List&lt;\/h2&gt;\")\r\n    #erstes Link\r\n    htmlfile.write(\"&lt;a href=\\\"http:\/\/\"+actip+\"\/webVerzeichnis\/htmlDatei\/\\\"&gt;erstes Link&lt;\/a&gt;&lt;br&gt;\")\r\n    #zweites Link\r\n    htmlfile.write(\"&lt;a href=\\\"http:\/\/\"+actip+\"\/webVerzeichnis\/andereHtmlDatei\/\\\"&gt;zweites Link&lt;\/a&gt;&lt;br&gt;\")\r\n    # html Footer\r\n    htmlfile.write(\"&lt;br&gt;&lt;\/body&gt;&lt;\/html&gt;\")\r\n    htmlfile.close()\r\n    # FTP handling\r\n    htmlfile=open('\/home\/pi\/piip.html','rb')\r\n    ftp = FTP('dein.ftp.server')\r\n    ftp.login(user='deinUsername', passwd='DeinPasswort')\r\n    #set passive mode\r\n    ftp.set_pasv(1)\r\n    ftp.storbinary(\"STOR piip.html\", htmlfile)\r\n    ftp.quit()\r\n    ftp.close()\r\n    htmlfile.close()<\/pre>\n<p>Ihr k\u00f6nnt auf diese Weise beliebig viele Links erzeugen.\u00a0 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.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #333333;\"><strong>Achtung<\/strong>: bei Python Version 3 und h\u00f6her muss beim FTP schreiben mit storbinary eine Bin\u00e4rdatei \u00fcbergeben werden. Diese bekommt man, indem die Ausgangsdatei <em>piip.html<\/em> mit dem Parameter 'rb' eingelesen wird.\u00a0 Bei Python 2.7 hat hier noch ein 'r' f\u00fcr Read gereicht. Siehe gelb markierte Zeile im Code oben.<\/span><\/p>\n<p>Was ich immer noch nicht herausgefunden habe, ist wie man ein Objekt &#8211; unsere erzeugte html Datei &#8211; 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.<\/p>\n<h4>Regelm\u00e4\u00dfige Durchf\u00fchrung<\/h4>\n<p>Ab in die Crontab mit <code>crontab -e<\/code><br \/>\nDort in die unterste Zeile<br \/>\n<code>*\/10 * * * * \/home\/pi\/ip.py<\/code><br \/>\neintragen. Damit wird das Programm ip.py oder welchen Namen auch immer ihr ihm gegeben habt, alle 10 Minuten ausgef\u00fchrt.<\/p>\n<h4>Portfreischaltung (Beispiel Fritz!Box)<\/h4>\n<p>Um einen Port bei der Fritz!Box freizuschalten geht man wie folgt vor:<\/p>\n<ol>\n<li>zuerst die Admin Oberfl\u00e4che aufrufen<\/li>\n<li>Men\u00fcpunkt Internet und dann Freigaben ausw\u00e4hlen<br \/>\n<a href=\"http:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2015\/02\/Portfreigabe.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-345\" src=\"http:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2015\/02\/Portfreigabe.jpg\" alt=\"Portfreigabe\" width=\"675\" height=\"331\" \/><\/a><\/li>\n<li>Ich empfehle, wie folgt vorzugehen: Bei \"<em>Portfreigabe aktiv f\u00fcr\"<\/em> &#8230; <em>Andere Anwendungen<\/em> ausw\u00e4hlen. So habt ihr die M\u00f6glichkeit, au\u00dfen eine andere Portadresse als die Standardadresse 80 zu verlangen. Bei von Port und bis Port die gleiche, beliebige, freie Portnummer (gr\u00f6\u00dfer 1024) eintragen. Damit sind zumindest einfache Portscan Attacken erschwert. Die Portnummer muss sich immer auch in den oben erkl\u00e4rten Linkadresse wiederfinden. Das s\u00e4he dann f\u00fcr Portnummer 9000 wie folgt aus:\n<pre class=\"expand:true lang:python decode:true \">htmlfile.write(\"&lt;a href=\"http:\/\/\"+actip+\":9000\/webVerzeichnis\/htmlDatei\/\"&gt;erstes Link&lt;\/a&gt;&lt;br&gt;\")<\/pre>\n<\/li>\n<li>Dann bei <em>an Computer<\/em> euren Raspberry Pi ausw\u00e4hlen oder falls er nicht angezeigt wird <em>manuelle Eingabe der IP Adresse<\/em> ausw\u00e4hlen und ins Feld darunter die interne(!)\u00a0 IP Adresse eures Pi eintragen<\/li>\n<li>Bei <em>an Port<\/em> w\u00fcrde ich die 80 stehen lassen, da dies die Standard HTML Adresse eures Webservers auf dem Pi ist.<\/li>\n<\/ol>\n<h4>Warnung &#8211; Disclaimer &#8211; sonstiges<\/h4>\n<ul>\n<li>Durch die Portfreischaltung hat eure Firewall ein Loch bekommen. Also Vorsicht und den Pi zus\u00e4tzlich absichern z.b. wie bei <a title=\"Kampis Elektroecke\" href=\"http:\/\/kampis-elektroecke.de\/?page_id=1626\" target=\"_blank\" rel=\"noopener\">Kampis-Elektroecke<\/a> beschrieben &#8211; hier findet ihr auch eine Anleitung zur Installation des Lighttpd Webservers und &#8211; weiter unten &#8211; eine Anleitung zum Passwortschutz.<\/li>\n<li>Anstatt eine komplette html Seite zu \u00fcbertragen, k\u00f6nnte man auch auf dem Webspace ein Javascript einbauen, das die hochgeladene IP Adresse dann in die Links einbaut &#8211; war mir zu m\u00fchsam. Ebenso ginge eine L\u00f6sung mit php.<\/li>\n<li>Der Aufruf funktioniert nur mit einfachen Webseiten und nur mit relativen Hyperlinks &#8211; komplette Applikationen wie WordPress werden auf die Nase fallen. Da braucht ihr wirklich eine professionelle Dyn IP Adresse.<\/li>\n<li>Eine direkte L\u00f6sung f\u00fcr Putty habe ich auch nicht, aber ihr k\u00f6nnt zumindest die in der erzeugten Website angezeigte IP Adresse in Putty \u00fcbernehmen und so auf den Pi zugreifen. Allerdings nur, wenn ihr im Router einen Port f\u00fcr SSH (standardm\u00e4\u00dfig: 22) freischaltet. Siehe auch meinen Beitrag\u00a0 <a title=\"SSH Portadresse \u00e4ndern\" href=\"http:\/\/www.rustimation.eu\/index.php\/ssh-portadresse-andern\/\" target=\"_blank\" rel=\"noopener\">SSH Portadresse \u00e4ndern<\/a>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dynamic IP f\u00fcr Arme \ud83d\ude42 Hat man auf dem Pi einen Webserver installiert und dazugeh\u00f6rige Seiten entwickelt, m\u00f6chte man sie nat\u00fcrlich auch von \"au\u00dfen\" zug\u00e4nglich machen. Der sauberste Weg w\u00e4re, eine Dynamische IP Adresse von einem Provider zu besorgen. Es geht f\u00fcr einfache Anwendungsf\u00e4lle aber auch mit Bordmitteln. Wie, das zeige ich euch in diesem &hellip; <a href=\"https:\/\/www.rustimation.eu\/index.php\/dynamische-ip-mit-bordmitteln\/\" class=\"more-link\"><span class=\"screen-reader-text\">Dynamische IP Adresse mit Bordmitteln<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,9,10],"tags":[19,41,43,50],"class_list":["post-344","post","type-post","status-publish","format-standard","hentry","category-netzwerk","category-python","category-raspberry-pi","tag-dynamic-ip","tag-router","tag-sicherheit","tag-webservice"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=344"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/344\/revisions"}],"predecessor-version":[{"id":3678,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/344\/revisions\/3678"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=344"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}