Einleitung
Oft realisiert man mit dem Raspberry Pi Projekte, die man auch aus dem Internet aufrufen möchte.
Beispielsweise eine Webseite mit Statusinformationen - Sensoren, Kameras (zum Beispiel mit MotionEyeOS), ... oder man möchte einen eigenen kleinen Webserver auf Raspberry Pi Basis realisieren, um zum Beispiel owncloud laufen zu lassen.
Wie kann ich also auf den eigenen Pi aus dem Internet zugreifen? Es folgt eine Anleitung für Anfänger, ich bemühe mich hier die Technik sehr ausführlich zu erklären und einige bequeme Möglichkeiten vorzuschlagen. Wer sich also schon gut auskennt kann gerne einiges der Erklärung (Grundlagen) überspringen.
Grundlagen
Das DNS System
Wenn ich bspw. die Webseite duckduckgo.com (auch "Domain" genannt) in den Webbrowser (zum Beispiel Google Chrome) eingebe (eine Suchmaschine die die eigene Privatsphäre respektiert), verbindet sich mein Webbrowser zu einem sogenannten DNS Server (Domain Name System). Dieser Server, also spezialisierter Computer, ist dafür zuständig den von Menschen lesbaren Namen duckduckgo.com in eine sogenannte IP Adresse umzuwandeln.
IP Adressen
Die IP Adresse ist eine Reihe von Zahlen die mit Punkten getrennt sind. Diese schaut für duckduckgo.com beispielsweise wie folgt aus:
46.51.179.90
Ist also für einen durchschnittlichen Menschen schwerer in Erinnerung zu behalten als der Domain Name, oder?
IPv4 Adressen, IPv6 Adressen
Das (46.51.179.90) ist übrigens eine sogenannte IPv4 IP Adresse. Es gibt nicht nur sehr viele Menschen die online sind, sondern auch noch viel mehr Geräte ("Stichwort IoT, Internet of Things"), die alle idealerweise eine eigene IP Adresse haben wollen. Wenn Sie hören, dass die IP Adressen knapp werden, ist das Problem dass im modernen Internet die maximal vier Milliarden möglichen IP Adressen in diesem IPv4 Format heutzutage nicht ausreichen.
Daher wurden IPv6 Adressen eingeführt:
2001:0db8:0000:0000:0000:ff00:0042:8329
Diese sind noch komplizierter zu merken, aber man könnte mit ihnen jedem einzelnen Atom der gesamten Menschheit 7 IPv6 Adressen zuteilen. Oder jedem Millimeter in einer geraden Linie von einer Seite des gesamten Universums zur anderen 3,6 Milliarden IPv6 Adressen. Diese IPv6 Adressen werden uns also nicht ausgehen (Stand 2019).
Diese IP v4 und IP v6 Adressräume existieren unabhängig nebeneinander, ich kann beim DNS Server für meine Domain (bspw. www.duckduckgo.com) beide Adresstypen abfragen (falls der Administrator der Domain beide hinterlegt hat).
Im Moment werden von den meisten Nutzern und von fast allen Webseiten / Webservices noch die "herkömmlichen" IPv4 Adressen verwendet und unterstützt, daher spreche ich im folgenden nur von diesen IP-Adressen.
Geografische Vergabe von IP Adressen
Alle Geräte die im Internet miteinander kommunizieren möchten benötigen eine IP Adresse. Genauso wie die Postadressen müssen diese Adressen einzigartig sein, damit die Nachrichten (bspw. Resultate meiner Google bzw. DuckDuckGo Suche) richtig zugestellt werden. Wie bereits erwähnt, da heutzutage sehr viele Menschen online sind, und auch viele Geräte eine eigene IP Adresse haben möchten, ist das aber leider nicht möglich. Zumindest nicht direkt.
IP-Adressen werden "geografisch" vergeben. D.h. in Afrika gibt es Adressen die anders beginnen als in Europa, in Leipzig gibt es andere IP-Adressen als in München. Anhand der IP-Adresse kann man mit einer gewissen Genauigkeit bestimmen wo sich ein Mensch, Computer, oder Gerät befindet. Beispielsweise:
In meinem - diesem - Fall ist die Genauigkeit nicht 100 %, ich bin deutlich näher an Markranstädt dran während ich das schreibe - aber die Stadt in der ich mich befinde wurde schon mal korrekt bestimmt.
Lokale IP Adressen, Router und Gateway
Wie bereits gesagt benötige ich wenn ich eine Webseite aufrufen möchte eine IP-Adresse.
Anfangs aus der Lust am Sparen der IP Adressen geboren, später aus anderen (kommerziellen Gründen? oder geht es vielleicht gar um den Schutz unserer Privatsphäre?) fortgeführt, weisen die Internet Provider (bspw. Vodafone, Telekom, Kabel Deutschland, M-NET, und wie sie alle heißen) jedem Haushalt bzw. Betrieb eine ständig wechselnde "öffentliche" IP-Adresse aus einem bestimmten Adressraum (stadtabhängig, siehe oben) zu. Damit kann nun ein Gerät "online" gehen. Üblicherweise ist das der Router - das Gerät was man vom Provider erhält, also beispielsweise in Deutschland oft die Fritz!Box.
Die Aufgabe des Routers ist, die Geräte im lokalen Netzwerk mit dem Internet zu verbinden.
Nachdem jedes Gerät das mit anderen Computern (Servern, z.B. dem Webserver von duckduckgo.com) im Internet kommunizieren möchte eine IP-Adresse benötigt, haben auch die Geräte in unseren lokalen Heimnetzwerken alle eine IP-Adresse. Diese IP-Adresse stammt allerdings aus einem besonderen dafür reservierten Bereich:
- 0.0.0 - 10.255.255.255 oder
- 16.0.0 - 172.32.255.255 oder
- 168.0.0 - 192.168.255.255
Vielleicht erkennen Sie die übliche IP-Adresse der Fritz!Box hier wieder: 192.167.178.1?
In den meisten Fällen vergeben die Router zu Hause / auf der Arbeit auch diese lokalen oder "privaten" IP Adressen mit einem Service der sich DHCP nennt. Ich muss nichts konfigurieren - ich stecke einfach meinen Computer an das Netzwerk, und er verbindet sich mit dem Router und dann mit dem Internet.
Mein lokaler Computer, beispielsweise, auf dem ich den Web Browser ausführe hat natürlich auch eine IP Adresse von meinem Router bekommen.
In meinem Fall (Desktop Windows Rechner) beispielsweise 192.168.1.202
Wie man in dem Screenshot sieht ist der IPv4 Standardgateway 192.168.1.1
Was ist ein Gateway? Ein Gateway ist eine Möglichkeit, in ein anderes Netzwerk zu kommen. Der Computer oder das Gerät mit der IP Adresse 192.168.1.1 (in meinem Fall) - üblicherweise der Router - kann in andere IP-Adressbereiche vermitteln. Beispielsweise auf die vorhin als Beispiel angeführte IP Adresse von Duck Duck Go (46.51.179.90).
Wenn ich also die Webseite aufrufe, verbindet sich mein Computer mit dem Router (der sich selbst per DHCP als Gateway eingetragen hat), und dieser wiederum kann die Anfrage an die Webseite weiterleiten.
Es ist übrigens auch möglich IP Adressen "statisch" zu konfigurieren. Das heißt, man weist dem Computer lokal eine feste IP Adresse zu, die sich in unserem eigenen Netzwerk nicht ändert. Das ist üblicherweise eine fortgeschrittene Konfiguration, aber für unsere Raspberry Pi's vielleicht sinnvoll, damit wir uns einfach zu ihnen verbinden können und sie später ins Internet freigeben können (siehe Informationen weiter unten).
NAT = Network address translation, TCP und UDP, Ports
Und ist Ihnen daran das Problem aufgefallen? Wir wissen zwar mit welchem Kommunikationspartner wir sprechen wollen, aber wenn der Router einfach unsere lokale IP Adresse weitergibt - also bspw. meine 192.168.1.202, dann weiß der Server im Internet nicht welcher Computer aus den Myriaden von Heimnetzwerken das ganze angefragt hat. Diese lokalen / privaten Adressen sind ja mehrfach im Einsatz, da man sonst dem IPv4 Adressmangel nicht mehr Herr werden könnte.
Um das Problem zu lösen wurde eine Technologie namens NAT erfunden. Das steht für Network address translation. Der Router nimmt die Anfragen von den lokalen Computern, Smartphones, Smart TVs und so weiter, entgegen, und bearbeitet diese so dass eine Zuordnung eindeutig möglich wird.
Ein Feature von TCP und UDP ist dabei hilfreich für uns. TCP und UDP sind die zwei Kommunikations-Protokolle die besonders häufig im Internet eingesetzt werden. Wenn ich beispielsweise ein YouTube Video abspiele, werden die Daten vom Video in vielen vielen TCP-Paketen transportiert.
Diese TCP bzw. UDP Pakete haben jeweils eine Quell-(IP-)Addresse und Quell-Port, sowie eine Ziel-(IP-)Adresse und einen Ziel-Port. Der Router kann jetzt einfach verschiedene Quellports für verschiedene Computer in seinem Netzwerk nutzen, um die Anfragen später wieder richtig zuordnen zu können. Auch wenn YouTube Videos von zwei Computern aus angeschaut werden.
Spielen wir das für eine Anfrage durch:
Ich rufe ein YouTube Video von Madonna auf, bspw. "Hung Up": https://www.youtube.com/watch?v=EDwb9jOVRtU
Mein Computer spricht mit einem DNS Server, findet die IP Adresse von YouTube heraus (z.B. 216.58.206.14) . Er schickt dann mittels des Routers eine Anfrage in Form eines oder mehrerer TCP Pakete an den Server von YouTube. Als Quell-IP gibt mein Computer seine eigene IP an, als Port einen beliebigen Port, bspw. 38556. In dem Paket ist in irgendeiner Form enthalten was mein Computer von dem Server will (also dass er die Daten für das Video zurückgibt), aber wie genau das geht sprengt den Rahmen dieses Artikels. Es funktioniert offensichtlich :-)
Ich möchte youtube.com aufrufen, also beispielsweise ist 216.58.206.14 die Ziel IP. (Große Seiten verteilen Anfragen oft über viele Server und IPs). Der Ziel Port ist für https (verschlüsselter Webseitenaufruf) standardmäßig 443.
Der Router schreibt das TCP Paket um. Er wählt einen beliebigen Port als Quellport aus, zum Beispiel 2020, die Quell-IP ist meine vom Provider zugewiesene öffentliche IP, bspw. 95.90.37.99.
Der Server beantwortet meine Anfrage an den Quellport den ich ausgewählt habe. Der Router erhält diese Anfrage, und hat sich gemerkt dass er eine Antwort unter diesem Port an meinen Computer weiterleiten soll.
Er schreibt das Antwort-Paket mit der IP meines Computers um, und verschickt es im lokalen Netzwerk. Das Video kann jetzt dargestellt werden (oder ein winzig kleiner Teil davon, ein Video besteht aus Millionen von Paketen).
Da es bis zu 65.536 Ports gibt, kann der Router mehrere Anfragen mehrerer Computer / Endgeräte aus dem lokalen Netzwerk gleichzeitig verarbeiten.
Übrigens funktioniert das ganze intern für die Anfragen unserer Rechner an die DNS Server genauso. DNS nutzt primär UDP, in manchen Fällen aber auch TCP Pakete. Die Anfrage/Antwort-Pakete werden vom Router "genat'ed", falls ein externer DNS Server eingestellt ist. Mein Computer kommuniziert nicht direkt mit dem Internet - kann er auch gar nicht, falls er nicht zum Beispiel direkt an das DSL Modem angeschlossen ist.
In den meisten Fällen ist der Router als Nameserver (DNS Server) eingestellt, der dann wiederum anfragen die er nicht gespeichert hat an Internet-Server weitergibt. Das Pi Hole funktioniert beispielsweise auf dem Prinzip, dass es DNS Anfragen filtriert und selektiv Server blockiert die Werbung ausspielen.
DS-Lite-Hinweis
Es ist wichtig zu wissen dass nicht alle IP-v4 Adressen die vom Provider für mein Netzwerk / meinem Router zugewiesen werden wirklich "öffentlich" sind. Mit anderen Worten, die IP-Adressen sind so knapp dass manche Provider dazu übergegangen sind auf ihrer Seite ebenfalls ein NAT zu machen. D.h. ich erhalte in Wirklichkeit auch nur eine End-Adresse aus dem privaten Netzwerk das der Provider betreibt, die Daten werden zweimal übersetzt / genatted. Einmal von meinem Router für das Heimnetzwerk, einmal vom Router des Providers für das Internet.
Das ganze wird als Dual-Stack Lite bezeichnet und ist eine Übergangstechnologie "bis wir komplett auf IPv6 umsteigen".
Der große Nachteil von DS Lite ist, dass ich nur noch öffentliche IPv6 Adressen habe, und keine eigene IPv4 Adresse, auch keine "dynamische". Ich kann damit keine Ports in das Internet freigeben.
Freigabe von Ports des Raspberry Pi für das Internet
Einleitung
Nun möchten wir das ganze anders herum aufsetzen. Wir möchten aus dem Internet auf den Raspberry Pi zugreifen, um zum Beispiel den aktuellen Wert eines Sensors per Browser aufrufen zu können.
Wenn ich über den GPIO Port einen Sensor auslese, kann ich zum Beispiel in Python einen kleinen Webserver bauen (wie das geht sprengt leider auch den Rahmen dieses Artikels), der den Sensorwert ausgibt. Oder gleich ein Diagramm im Zeitverlauf. Ich kann die Daten auch erst nach einem Login bereitstellen - wobei hier empfehlenswert wäre, eine verschlüsselte https-Verbindung, unter Port 443 anzubieten bzw. zu erzwingen (da Passwörter übertragen werden).
Port 80 ist der Standard-Port für http-Verbindungen (unverschlüsselte Webseiten). Mein Programm stellt also am Raspberry diese Daten unter diesem Port bereit.
Der Beispielscreenshot zeigt den Zugriff auf den Pi aus dem lokalen Netzwer - ein Webserver läuft auf Port 80, mein Pi hat die IP 192.168.1.57.
Ich kann die IP auf dem Pi herausfinden mittels ip -4 addr show:
Viele weitere Ports sind für andere Anwendungen interessant, beispielsweise Port 22 für SSH (Terminalverbindungen zum Raspberry Pi, ...), Port 21 für FTP, 587 für SMTP, ...
Ich kann ohne weiteres, sofern ich weiß welche IP-Adresse der Raspberry Pi hat, im lokalen Netzwerk diese IP aufrufen. Der Browser öffnet standardmäßig bei Eingabe von http:// 192.168.1.57 (in meinem Fall - bei Ihnen sicher anders) die Verbindung zu Port 80. Wie kriege ich das aber von außen hin? Wie kann ich den Webservice auf meinem Raspberry Pi für das Internet freigeben?
Dazu gibt es zwei grundsätzliche Möglichkeiten:
DynDNS Service & Ports öffnen
Das ist die klassische Methode, die mit mehr Aufwand verbunden ist, und in vielen Fällen heute leider nicht mehr funktioniert (da Sie keine "echte" eigene dynamische IPv4 mehr bekommen, bzw. Ihr Router nicht in der Lage ist Ports zu öffnen).
Beispielsweise kann ich bei Vodafone / Kabel Deutschland mit dem von ihnen gestellten Router keine Ports von innen aus öffnen, und muss auf die zweite Methode ausweichen. Es lohnt sich daher, den letzten Schritt (Freigabe der Ports) als erstes im Router anzuschauen, bzw. bei dem eigenen Internetprovider zu erfragen ob man eine dynamische IPv4 Adresse hat, oder einen DS-Lite oder ähnlichen Anschluss hat.
Dynamischer DNS Service
Da die meisten Provider, wie oben erwähnt, uns wechselnde IP Adressen zuweisen, die man sich nicht merken / nicht vorhersagen kann, nutzen wir einen speziellen Service der uns eine eigene Subdomain gibt, die auf unsere jeweils aktuelle IPv4 Adresse führt.
Beispielsweise ist NO-IP ein populärer Service der dafür benutzt wird. Im folgenden zeige ich, wie man damit seine eigene dynamische IP Adresse auf eine "statische" Subdomain (d.h. menschenlesbare Internet-Adresse) von No-IP legen kann.
No-IP bietet eine kostenlose Option, bei der man allerdings den DNS Namen alle 30 Tage neu bestätigen muss.
Legen Sie sich hier einen Account an, und notieren Sie sich die Zugangsdaten, sowie die ausgewählte Subdomain. Diese werden gleich benötigt.
(Bitte beachten Sie, dass man nur einen kostenlosen Account anlegen darf gemäß den Geschäftsbedingungen von No-IP).
Nun installieren wir auf dem Pi den Dynamic Update Client (DUC) von No-IP.
Wir müssen auf dem Raspberry Pi dazu einige Kommandozeilen-Operationen durchführen, gemäß diesem Artikel:
https://www.noip.com/support/knowledgebase/install-ip-duc-onto-raspberry-pi/
- wir verbinden uns per SSH zum Pi, oder nutzen das lokal angeschlossene Keyboard und Maus und öffnen ein Terminal Fenster
- anschließend geben wir folgende Kommandos ein:
mkdir /home/pi/noip
cd /home/pi/noip
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar vzxf noip-duc-linux.tar.gz
Das nachfolgende Kommando muss angepasst werden, wenn sich die Version von DUC geändert hat (man sieht in welches Verzeichnis ausgepackt wird anhand der Ausgabe von tar)
cd noip-2.1.9-1
Jetzt installieren wir das Programm:
sudo make
(es ist normal, dass hier einige Warnungen ausgegeben werden)
sudo make install
Nach Eingabe von sudo make install muss man den No-IP account Benutzernamen und das Passwort angeben. Beantworten Sie die Fragen, die DUC an Sie stellt. Für das Update-Intervall sollten mindestens 5 Minuten angegeben werden. Die Eingabe von 5 entspricht 5 Minuten, die Eingabe von 30 einem Updateintervall von 30 Minuten. (Eine Angabe von 5 Minuten ist empfehlenswert um das Zeitfenster nach Zwangs-IP-Wechsel durch den Provider klein zu halten, in dem man nicht auf die richtige IP zugreift.)
Anschließend starten wir den Service:
sudo /usr/local/bin/noip2
Wir verifizieren dass der Service korrekt läuft, mittels:
sudo noip2 -S
Hinweis: standardmäßig wird der Service bei reboot nicht automatisch wieder gestartet.
Daher können wir das mit folgenden Kommandos nachrüsten:
sudo nano /etc/systemd/system/noip2.service
hier geben wir folgendes ein:
[Unit]
Description=No-ip.com dynamic IP address updater
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
Alias=noip.service
[Service]
ExecStart=/usr/local/bin/noip2
Restart=always
Type=forking
Wir speichern mit Ctrl + O, und beenden Nano mit Ctrl + X.
Wir aktivieren den Service:
sudo systemctl enable noip2.service
Der Service kann jetzt mittels
sudo systemctl start noip2.service
gestartet werden. (manchmal wird zusätzlich ein sudo systemctl daemon-reload benötigt). Der noip2 Daemon wird jetzt automatisch mit dem Pi gestartet, und er aktualisiert unsere bei No-IP hinterlegte IP Adresse.
Referenzen:
- http://www.shanegibney.com/shanegibney/raspberry-pi-3-running-noip2-systemd-part-9/
- https://gist.github.com/NathanGiesbrecht/da6560f21e55178bcea7fdd9ca2e39b5#file-noip2-service
Wichtig: bei No-IP muss bei kostenlosen Accounts die Subdomain alle 30 Tage aktualisiert werden.
Raspberry Pi statische IP Adresse zuweisen
Der Pi benötigt eine statische IP Adresse, damit der Router im nächsten Schritt korrekt zur richtigen Weiterleitung des Ports eingestellt werden kann. (Sonst würde evtl. der Port mit der Zeit an einen anderen Computer weitergeleitet werden, was natürlich ein Sicherheitsrisiko darstellt, und nicht im Sinne des Erfinders ist!)
Wir analysieren zunächst die IP die per DHCP automatisch eingestellt wurde:
ip -4 addr show | grep global
Bei bestehender WLAN Verbindung wird statt eth0 wlan0 angezeigt, bzw. es könnten zwei Zeilen auftauchen.
192.168.1.57 ist in meinem Fall die IP des Pis, und /24 die Netzwerk Größe.
192.168.1.255 ist die Broadcast Adresse des lokalen Netzwerks.
Nun finden wir die IP Adresse des Routers heraus:
ip route | grep default
die Standard-Route ist via 192.168.1.1, was die IP des Routers ist.
Und noch den Nameserver (lokaler DNS Server):
cat /etc/resolv.conf
Der Nameserver ist 192.168.1.1
Um die statische IP einzurichten, beispielsweise 192.168.1.6, editieren wir /etc/dhcpcd.conf:
sudo nano /etc/dhcpcd.conf
und bearbeiten die Einträge weiter unten in der Datei, dass sie so aussehen:
# Example static IP configuration:
interface eth0
static ip_address=192.168.1.6/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8
Hier müssen bei routers die IP Adresse des Routers (s.o.) eingetragen werden, und bei domain_name_servers ebenso. 8.8.8.8 ist Google's DNS Server, und kann zusätzlich eingetragen bleiben. Wichtig ist außerdem, dass der Adress-Pool des DHCP Servers des Routers außerhalb (bspw. oberhalb) dieser neuen statischen IP Adresse ist. Diesen Pool kann man im Webinterface des Routers nachschauen. Bei mir bspw:
Nach einem Neustart hat der Pi dann die neue statische IP Adresse:
sudo reboot
Freigabe des Ports in das Internet
Das Vorgehen zur Freigabe in das Internet hängt von Router zu Router ab.
Es muss ein öffentlicher Port auf der Box (bspw. Port 80 ) auf den von uns vorbereiteten Port des Raspberry Pis im lokalen Netzwerk weitergeleitet werden.
Ich verweise hier beispielhaft auf folgenden Artikel:
Bei DS-Lite Anschlüssen ist das leider nicht möglich.
An meinem Anschluss habe ich es beispielsweise nicht geschafft, die Ports freizugeben.
Weiterleitung mittels eines Services
Das ist die einfachere Variante, und die einzige die bei DS-Lite Anschlüssen möglich ist (die keine echte IPv4 Adresse an Endkunden vergeben).
Bei dieser Variante verbindet sich der Raspberry Pi mit einem Anbieter, der die Verbindung auf seinem Server in das Internet freigibt. Es gibt mehrere verschiedene Anbieter, ich möchte hier zwei vorstellen die auch in begrenztem Maße kostenlosen Service mit anbieten.
Es ist keine Anlage von einem No-IP Account nötig, die Subdomain wird in diesem Fall von den Services mit gestellt.
Wichtig ist hier ebenfalls vorsichtig vorzugehen, und nur die Ports freizugeben die man freigeben möchte. Standardmäßig ist beim Raspberry Pi für den Nutzer "pi" das Passwort "raspberry" eingestellt. Da der Nutzer pi per sudo Administratorrechte auf dem Pi wahrnehmen kann, ist die Freigabe des SSH Zuganges ohne ein sicheres Passwort eine massive Sicherheitslücke.
Ich bespreche hier das Szenario, eine Webseite die auf dem Pi gehosted wird (bspw. mit Anzeige von ausgelesenen Sensordaten) freizugeben. Auch hier sollte man entsprechend mehr auf Absicherung achten, als man es beispielsweise im eigenen Heimnetzwerk tun würde - ggf. können Sicherheitslücken von Angreifern ausgenutzt werden, um Zugriff auf das gesamte Heimnetzwerk zu bekommen.
Dataplicity
Dataplicity verspricht, dass man den eigenen Pi "von überall steuern" kann.
Die Freigabe erfolgt mittels eines Python Programms das als "PEX" Datei ausgeliefert wird (also eine Art virtueller Umgebung für Python).
Das Skript wird nach Eingabe der e-Mailadresse personalisiert, vermutlich um Konfigurationsarbeit sparen zu können:
Nun muss man auf dem Raspberry Pi unter der Konsole die von Dataplicity angegebene Codezeile ausführen. Das führt zu folgender Ausgabe:
unter dem Link erhält man sofort Zugriff auf eine Konsole, mit einem Benutzer dataplicity:
Rechts unten erhält man folgende Nachricht:
Hi there,
To run commands as superuser, you must first switch to an account with sudo privileges.
On a Raspberry Pi, you can usually do this by running 'su pi', and entering the 'pi' account password which, unless you have changed it, is normally "raspberry". From there you can run sudo as normal.
For more information, here is the tutorial: http://docs.dataplicity.com/docs/superuser/
Best,
Elliot.
Spätestens jetzt sollte man das Passwort für den Nutzer pi ändern.
Sonst hat man eine aus dem Web erreichbare Konsole, aus der der Nutzer zum root auf dem Pi werden kann, und somit Zugriff auf das lokale Netzwerk und am pi angeschlossene Geräte erhält.
Rechts erhält man einen Überblick über den momentanen Speicherplatz, und kann per einem Klick den Port 80 auf dem Pi freigeben.
Freigabe von Port 80:
Und ich kann jetzt bequem auf den Webservice auf dem Pi zugreifen:
Mehr muss man nicht machen, hier ist noch das Tutorial von dataplicity zu dem Thema:
https://docs.dataplicity.com/docs/host-a-website-from-your-pi
Nginx ermöglicht auch als Reverse Proxy zu arbeiten, und weitere Services unter Port 80 zu kombinieren.
Dataplicity ist aus meiner Sicht einfach und empfehlenswert! Ich finde es vor allem super, dass man nicht erst Nutzer & Passwort anlegen muss, sondern quasi sofort starten kann.
Im Backend von Dataplicity sieht man die eigenen Raspberry Pi's und kann per Klick auf eine Konsole zugreifen:
Das einzige Problem das ich mit Dataplicity hatte war das eintragen meines initialen Passwortes im Webinterface - ich kannte das für mich hinterlegte Passwort nicht, da ich es nie angelegt hatte. Daher musste ich mich ausloggen, und das Passwort mit dem I forgot my password Link zurücksetzen:
https://www.dataplicity.com/profile/passwordreset/
Nachdem ich das Passwort gesetzt habe, muss ich mich unter dem speziellen Link der beim Setup ausgegeben wird erst anmelden. Er scheint also nur für die erste Anmeldung zu funktionieren.
Der Dataplicity Client (auf dem Raspberry Pi) läuft auch nach Neustart, ohne dass man weitere Konfiguration tätigen müsste. Man sollte das im Hinterkopf behalten, falls man die Webseite nur für eine Sitzung freigeben möchte.
Wie schaut es mit den Kosten für Dataplicity aus?
Der Gratis-Plan auf ein Gerät beschränkt, man erhält ein Terminal und kann SSH, VNC und Port 80 weiterleiten. Man kann dabei bis zu 512 MB pro Tag mit bis zu 10 MBps+ übertragen, darüber hinaus 1.5 Mbps. Perfekt für Hobbyisten, und vor allem komplett gratis!
3 $ pro Monat und Gerät kostet "Dataplicity Standard" mit weiteren Features, oder wenn man mehr als ein Gerät haben möchte, wobei es ab dem 51sten Gerät Rabatt gibt. "Dataplicity Pro" kostet 4 $ pro Gerät pro Monat, ebenfalls mit Staffelung ab dem 51sten Gerät. Der größte Vorteil des Pro Accounts ist dass man sein eigenes Prefix für das "Wormhole" aussuchen kann (so heißt die Weiterleitung auf Port 80 vom Raspberry Pi bei Dataplicity).
Für die meisten Anwender dürfte Dataplicity Standard ausreichend sein, wenn man nicht mit dem Gratis-Plan bereits hinkommt.
Dataplicity deinstallieren
Eine Anleitung dafür findet man hier: https://docs.dataplicity.com/docs/uninstalling
Pagekite
Pagekite ist primär darauf ausgerichtet, Webseiten einfach im Internet freizugeben. Es unterstützt neben Linux auch Windows und Mac Systeme. Hier zeige ich den Weg für den Raspberry Pi.
Wir öffnen die Konsole, und geben folgendes ein (als Nutzer pi):
sudo apt-get install pagekite
pagekite 80 meinprefix.pagekite.me
Dabei sollten Sie meinprefix selbst aussuchen. Ich habe mich hier für das Prefix gagarin, zu Ehren des ersten Astronauten der Welt entschieden.
Wir erhalten einen interaktiven Dialog:
Durch Eingabe der e-Mailadresse meldet man sich bei pagekite an.
Nach Bestätigung startet pagekite:
Jetzt kann man einfach auf die Webseite unter der ausgesuchten Subdomain zugreifen:
Man sollte innerhalb von 15 Minuten den Account mit dem Link aus der zugeschickten e-Mail bestätigen, sonst wird der "Kite" (also die Web-Freigabe) beendet. Das ist um Mißbrauch des Service zu verhindern.
Negativ fällt mir auf: Pagekite schickt das Passwort im Klartext per e-Mail. Das ist aus Security-Sicht nicht gut, und sollte gleich geändert werden. Das Webinterface ist etwas altbacken und unübersichtlich.
Beenden kann man den Kite durch drücken von Ctrl + C (D.h. Strg und C). Eine Kontrolle unter gagarin.pagekite.me zeigt, dass tatsächlich der Kite / die Webfreigabe abgeschaltet wurde:
Pagekite.net hat ein Wiki mit vielen Tipps, unter anderem wie man per CNAME die eigene Domain auf den richtigen Server zeigen lassen kann:
https://pagekite.net/wiki/HowTo/
Man sollte sich auch mit einigen Sicherheitstipps und Möglichkeiten von Pagekite (z.B: Passwortschutz) vertraut machen:
https://pagekite.net/support/security/
Um pagekite das nächste mal zu starten, kann man einfach
pagekite
eingeben, die Einstellungen werden aus der vorher erstellten Datei gelesen.
Hilfe erhält man online, und durch eingabe von
pagekite --help
Um pagekite im Hintergrund laufen zu lassen, rufen wir folgendes auf:
pagekite --daemonize
Nach einem Neustart muss pagekite allerdings neu gestartet werden. Um es automatisch zu starten, legen wir (als User pi, falls pagekite als User pi konfiguriert wurde wie von mir vorgeschlagen) eine crontab Datei an:
crontab -e
Hier fügen wir folgende Zeile hinzu:
@reboot pagekite --daemonize &
pagekite wird jetzt mit den Voreinstellungen (in der Datei /home/pi/.pagekite.rc ) bei jedem Systemneustart ausgeführt. Um es wieder zu entfernen, löscht man diese Zeile wieder aus der Crontab (mit crontab -e bearbeitet man die Crontab jeweils).
Idealerweise könnte man einen komplett eigenen Nutzer für pagekite hinzufügen, der kein sudoer ist, und die crontab Datei dort erstellen.
pagekite ist für Anfänger vielleicht etwas schwieriger, vor allem um eine dauerhafte Freigabe zu erhalten. Es richtet sich an ein "technischeres" Publikum. Die Online Dokumentation ist nicht besonders aufgeräumt, ich konnte nicht auf Anhieb herausfinden wie man es dauerhaft freigibt (daher habe ich es weiter oben für Sie aufgeschrieben.)
Positiv ist gegenüber Dataplicity, dass man sich sein prefix von Anfang an selbst aussuchen kann (und nicht den 4 $ Plan nehmen muss :-)) Auch kann man andere Ports freigeben.
Dataplicity hat gegenüber Pagekite den Vorteil, dass der Zugriff auf das Wormhole von Anfang an verschlüsselt erfolgt (d.h. Dataplicity baut eine https Verbindung). Das ist mit pagekite auch möglich, allerdings müsste man sich hier vermutlich um Zertifikate etc. kümmern, und den Port 443 (https) freigeben.
Zu den Kosten:
Pagekite bietet gegenüber Dataplicity keinen dauerhaften kostenlosen Service für alle für ein Gerät. Man erhält eine Trial-Periode für ein Kite (d.h. eine Web-Freigabe) im Laufe von 31 Tagen, und kann insgesamt ca 2,5 GB übertragen.
Es hat einen interessanten "Pay what you want" Ansatz:
Je mehr man zahlt, desto mehr erhält man (maximal 12 Monate Service, aber das Datenvolumen steigt auf bis zu 363 GB).
Es gibt auch Abo-Pläne, bei denen man ab 5.99 $ pro Monat dabei ist:
Damit kann man auch mehrere Kites starten.
Yaler.net
Ich will Yaler.net nur kurz am Rande erwähnen. Diese Plattform bietet zwar keinen kostenlosen Testaccount oder Testperiode, allerdings ist der Preis bei CHF 10 netto pro Jahr (~ 8,81 € im Moment zzgl. Mehrwertsteuer) sehr günstig.
Die Raspberry Pi Foundation listet auf Ihrer Seite noch einige weitere Alternativen auf, von denen ich Dataplicity (als meiner Meinung nach das Verständlichste) bereits ausführlich vorgestellt habe:
https://www.raspberrypi.org/documentation/remote-access/access-over-Internet/
Fotos:
Photo by Ben White on Unsplash
Photo by Thomas Jensen on Unsplash
9 comments
Stephanie
@sussybaka: Wir können für Dataplicity leider keinen Support anbieten, vielleicht gibt es da ein temporäres Problem. Danke für den Hinweis!
Liebe Grüße aus Leipzig,
Stephanie
sussybaka
Wenn ich mich mit Dataplicity verbinden möchte steht da:
Unable to connect to remote device
Click to retry
(Unable to open terminal)
RolKu
Der Zugriff aus den Internet z.b über ein Mobilfunknetz auf den Raspberry Pi mit installierten Octopi geht am besten über den VPN über die Fritzbox alles andere funktioniert nicht so gut. Hier die Anleitung: https://avm.de/service/vpn/tipps-tricks/vpn-verbindung-zur-fritzbox-unter-android-einrichten/?fbclid=IwAR1imfOljUzvwrvbefbHTL_W1eS12NM_LIyJG91g64k8XYrS1EnPxPYjkEc
Johannes
Ich habe dataplicity ausprobiert (Übrigens: Passwortfestlegung wird nach bestätigen der E-Mail Adresse angefordert), aber ich nutze nun pagekite, da ich Port 8080 und 8181 freizugeben habe, da ich eine Webcam programmiert habe, mjpg-streamer=8080, oberfläche=8181. Pagekite hat bei mir auch nur mit pagekite.py funktioniert, und das auch erst nach Registrierung.
Dylan
Super Bescheibung danke Dir.
Ich habe wirklich alles Punkt für Punkt durchgearbeitet, aber am Ende lande immer auf der Seite von Philips Hue.
Max
@tuxpingu: Es stimmt, bei vielen Anschlüssen ist es noch möglich – leider nicht mehr bei DSLite Anschlüssen bzw. anderen Anschlüssen bei denen zweimal genatted wird (Provider Grade NAT).
@Thomas: Danke für den Input wegen IPv6: ja, eine legitime Möglichkeit für Leute die IPv6 haben – und das beste ohne Umwege.
@Jens: bitte suche in der NGINX Dokumentation, bzw. NGINX Walkthroughs. Die Konfiguration ist üblicherweise in /etc/nginx/ drin (es gibt standardmäßig eine Default Konfiguration). Das Thema sprengt den Rahmen dieses Blogposts.
Jens
Hallo,
danke für die Erklärung, aber ich raffe es nicht.
Versuche mich an dataplicity, hab auch alles am laufen, nginx komm auch.
Aber wo sage ich ihm den, welche Webseite er darstellen soll?
wie kann ich nginx konfigurieren?
Meine Idee: Ich möchte eine VIS Darstellung vom iobroker anzeigen lassen…..
DANKE!
tuxpingu
Schade, dass man von der klassischen Methode nur erfährt, dass sie heute nicht mehr überall funktioniert. Dabei kann man das direkt im Router einstellen. Gut dass ich nochmal nach der klassischen Methode gesucht habe und nicht nach dieser Anleitung vorgegangen bin. DynDNS lässt sich direkt im Router einstellen.
Grüße aus der Holsteinischen Schweiz
tuxpingu
Thomas Schäfer
ein weiterer Vorschlag(bei DS-lite): IPv6 nutzen
In der Datei /etc/dhcpcd.conf “slaac private” durch “slaac hwaddr” ersetzen und den Rechner neu starten.
Anschließend in der Fritzbox eine MyfritzFreigabe einrichten – Fertig.
Alternativ geht auch dynv6.com als DNS-Anbieter. (das Skript lässt man dann am besten auf dem Raspberry Pi laufen, im einfachsten Fall als cronjob, die Freigabe muss man in der Fritzbox natürlich trotzdem machen, dann reicht aber einen “normale” Freigabe)
Die Erreichbarkeit via IPv6 ist noch eingeschränkt, aber durchaus möglich aus fast allen Kabelnetzen, dem Mobilfunknetz und dem Festnetz der Telekom sowie vielen Netzen der Universitäten und des Freifunks.