Funktion des Proxy-Servers
Achtung! Die Anleitung wird aktuell überarbeitet. Deshalb können doppelte Einträge vorhanden sein und noch mehr Fehler enthalten sein als üblich.
Da weder der Spring selbst noch der Dacia-Server in der Lage sind, zeitgesteuert zu arbeiten, und ein Handy für Maschinensteuerung nicht ideal ist, wurde aus diesem Grund der Proxy-Server entwickelt. Er kann mehrere Springs gleichzeitig managen und übernimmt die Kommunikation mit dem Dacia-Server.
Damit das funktioniert, benötigt der Proxy eine Datenbank. Und zwar keine relationale Datenbank wie MariaDB, sondern eine dokumentenorientierte Datenbank. Ich hatte mich für MongoDB entschieden. Sie lässt sich leicht installieren und konfigurieren. Diese Datenbank läuft bei mir auf einem Linux-System mit ARM-Prozessor, also einem kleinen Raspberry Pi. Der ist sehr sparsam im Stromverbrauch und ausreichend schnell für diese Aufgabe. es hat sich jedoch herausgestellt das für meine Anforderungen die Datenbank nicht Optimal war. So wird ab der Version 1.3 eine neue Datenbank, die SimpleDataBase verwendet. Eine Datenbank die ich speziell für dieses Programm entwickelt habe. Sie ist sehr schnell, braucht kaum Resourcen, und läuft ohne probleme auf einem kleinen pi.
Die Datenbank ist der Dreh- und Angelpunkt. Der Client kommuniziert mit dem Proxy-Api, und der Proxy-Api kommuniziert mit der Datenbank. Der Proxy-Dacia wiederum kommuniziert mit dem Dacia-Server und der Datenbank.
App <=> Proxy-Api <=> SimpleDataBase <=> Proxy-Dacia <=> DaciaServer
Die Verbindung zwischen der App und dem Proxy-Api ist TLS-verschlüsselt. Das Ganze funktioniert nur mit öffentlichen Zertifikaten. Deshalb wird auch ein Domainname benötigt, über den auf die Datenbank zugegriffen werden kann. Dieser Name ist dann über ein Zertifikat abgesichert. Da ich keine feste IP habe, benutze ich einen DynDNS-Dienst. Welcher Dienst verwendet wird, ist egal; ich habe mich für ydns entschieden. Es geht aber auch jeder andere Dienst. Das Zertifikat wird von Let's Encrypt erstellt, das genauso wie der DynDNS-Dienst, die Datenbank und das Linux nichts kostet. Folgende Schritte müssen durchgeführt werden.
Damit das funktioniert, benötigt der Proxy eine Datenbank. Und zwar keine relationale Datenbank wie MariaDB, sondern eine dokumentenorientierte Datenbank. Ich hatte mich für MongoDB entschieden. Sie lässt sich leicht installieren und konfigurieren. Diese Datenbank läuft bei mir auf einem Linux-System mit ARM-Prozessor, also einem kleinen Raspberry Pi. Der ist sehr sparsam im Stromverbrauch und ausreichend schnell für diese Aufgabe. es hat sich jedoch herausgestellt das für meine Anforderungen die Datenbank nicht Optimal war. So wird ab der Version 1.3 eine neue Datenbank, die SimpleDataBase verwendet. Eine Datenbank die ich speziell für dieses Programm entwickelt habe. Sie ist sehr schnell, braucht kaum Resourcen, und läuft ohne probleme auf einem kleinen pi.
Die Datenbank ist der Dreh- und Angelpunkt. Der Client kommuniziert mit dem Proxy-Api, und der Proxy-Api kommuniziert mit der Datenbank. Der Proxy-Dacia wiederum kommuniziert mit dem Dacia-Server und der Datenbank.
App <=> Proxy-Api <=> SimpleDataBase <=> Proxy-Dacia <=> DaciaServer
Die Verbindung zwischen der App und dem Proxy-Api ist TLS-verschlüsselt. Das Ganze funktioniert nur mit öffentlichen Zertifikaten. Deshalb wird auch ein Domainname benötigt, über den auf die Datenbank zugegriffen werden kann. Dieser Name ist dann über ein Zertifikat abgesichert. Da ich keine feste IP habe, benutze ich einen DynDNS-Dienst. Welcher Dienst verwendet wird, ist egal; ich habe mich für ydns entschieden. Es geht aber auch jeder andere Dienst. Das Zertifikat wird von Let's Encrypt erstellt, das genauso wie der DynDNS-Dienst, die Datenbank und das Linux nichts kostet. Folgende Schritte müssen durchgeführt werden.
Vorbereitung
Damit nicht nur Daten von innen nach außen gelangen, sondern auch umgekehrt, brauchen wir eine Portweiterleitung. Das bedeutet, dass die Daten, die von außen kommen, im Heimnetz genau auf dem Gerät landen, auf dem auch der Proxy installiert ist. Des weiteren werden für die Verschlüsselung Zertifikate benötigt. Und zwar brauchen wir offizielle Zertifikate, keine selbstsignierten. Damit das funktioniert, wird auch ein Domainname benötigt. Da die IP-Adresse bei den meisten von uns regelmäßig wechselt, brauchen wir einen DynDNS-Dienst, der die wechselnde IP-Adresse mit dem Namen abgleicht. Fangen wir an mit der Portweiterleitung.Die Portweiterleitung
Damit die Kommunikation von außen (also aus dem Internet) zu eurem Proxy-Server zu Hause funktioniert, muss der Router wissen, welches Gerät die Datenpakete erhalten soll. Das erreicht man mit einer Portweiterleitung.Der Router bekommt eine Anfrage für Port 6443. Mit der Weiterleitung wird ihm gesagt: "Schicke alle Pakete für diesen Port bitte an den Computer mit der IP-Adresse 192.168.1.100 (wenn der Proxy auf dieser IP installiert ist)".
Portweiterleitung am Beispiel einer Fritz!Box:
- Gehe in das Webinterface deiner Fritz!Box (meist fritz.box oder 192.168.178.1).
- Navigiere zu Internet -> Freigaben -> Portfreigaben -> Gerät für Freigaben hinzufügen.
- Wähle den Proxy-Server aus der Liste der Geräte aus oder trage seine IP-Adresse manuell ein.
- Wähle bei Protokoll die Option TCP (und ggf. zusätzlich UDP).
- Trage bei Von Port und Bis Port die benötigte Portnummer ein (z.B. 6443).
- Speichere die Einstellung.
Wichtig für Let's Encrypt: Für die Einrichtung muss Port 80 (HTTP) auf den Server weitergeleitet werden. Dieser kann nach erfolgreicher Zertifikats-Einrichtung wieder geschlossen werden. Da der Port jedoch für jede Erneuerung, die ca. alle 60 Tage stattfindet, benötigt wird, kann er auch offen gelassen werden.
Es wird ein zweiter Port benötigt für den Datenaustausch. Dieser kann beliebig bis 65535 sein. Der Standardport für HTTPS, das ist das Protokoll, das wir verwenden, ist 443. Es kann jedoch jeder beliebige andere Port, normalerweise über 1024, verwendet werden. Da die Standard-Ports meistens als erste angegriffen werden, kann es durchaus Sinn machen, einen anderen Port zu verwenden. Ich verwende gerne die Ports 4443, 5443, etc. So ist für mich auch deutlich, wofür die Ports gebraucht werden.
Wie finde ich meine IP-Adresse?
Auf deinem Proxy-Server in der Konsole den Befehl
ip address
eingeben. Dann nach der Zeile suchen, die mit "inet" beginnt und deine lokale IP (z.B. 192.168.xxx.xxx) anzeigt.DynDNS - Deine Adresse im Internet
Die meisten Internet-Anschlüsse haben eine sich ändernde (dynamische) IP-Adresse. Damit man den Server trotzdem immer unter der gleichen Adresse erreichen kann, braucht man einen DynDNS-Dienst.Die einfache Lösung (für Fritz!Box-Nutzer):
Jede Fritz!Box hat einen kostenlosen DynDNS-Dienst integriert. Du findest deine Adresse unter:
Internet -> Freigaben -> FritzBox Dienste.
Dort steht der persönliche Name der Box, z.B. wirreszeuch.myfritz.net. Diesen Namen kannst Du verwenden.
Alternative (für alle anderen Router):
Falls der Router keinen eigenen Dienst anbietet, muss man sich bei einem DynDNS-Anbieter (z.B. noip.com oder duckdns.org) registrieren. Dort bekommt man einen Domainnamen (z.B. meinserver.ddns.net). Diesen Namen und die Zugangsdaten kann man dann meist im Router eintragen, damit er die Änderungen deiner IP-Adresse automatisch an den Anbieter meldet. Bei mir hat das nie funktioniert. Ich lasse alle 15 Minuten ein Script auf dem Proxy laufen, welches die Adresse abgleicht. Dies ist auch bei IPv6 die einzige Möglichkeit. Bei Fragen: Das Forum hilft gerne, und ich auch.
Wichtig: Ein Scriot welches die IP-Adresse abgleicht muß auf dem gleichen Rechner ausgeführt werden auf dem der Name auch gebraucht wird sobald IPV6 verwendet wird. Begründung: Jeder IPV6 Rechner wird über seine IP aus dem Internet angesprochen. Nicht so wie bei IPV4, bei der die Rechner die IP des Routers bekommen!
Aufgrund meiner Erfahrungen in den letzten Tagen, als ich mehrere Dienste getestet habe, werde ich hier genauer darauf eingehen und verschiedene Dienste kurz erläutern. Besonders das Erneuern der Adresse wird teilweise unnötig kompliziert beschrieben. Deshalb gehe ich hier auf einige Dienste kurz ein.
duckdns.org
duckdns.orgNachdem man sich registriert hat, kann man sich in der GUI bis zu 5 Adressen aussuchen und testen. Das geht folgendermaßen:
- Anmelden/Account erzeugen
- Die Domain eingeben und auf Add Domain klicken
- Oben im Menü auf Install klicken
- Unten bei first step - choose a domain. Die entsprechende Domain auswählen
- Nun wird für die Domain unten einiges angezeigt. Das ist eine Anleitung, nach der man gehen kann. Oder man kopiert den Token und die Domain und setzt sie in den Vorschlag in der Textbox ein. Der oberste Eintrag sollte reichen. Wenn es Probleme mit IPv6 gibt, dann können auch die beiden unteren Einträge genommen werden.
- curl -s "https://www.duckdns.org/update?domains=meinedomain&token=meintoken" - Update von IPv4 und eventuell IPv6
- curl -s "https://www.duckdns.org/update?domains=meinedomain&token=meintoken&ipv4=auto" - Updaten von IPv4
- curl -s "https://www.duckdns.org/update?domains=meinedomain&token=meintoken&ipv6=auto" - Updaten von IPv6
ydns
Der ydns Dienst hat sich als sehr zuverlässig erwiesen. Meine Erfahrung ist, dass er zuverlässiger ist als duckdns. Da ich aber aufgrund der nicht so guten Erfahrungen mit duckdns länger nicht gearbeitet habe, kann sich das natürlich auch geändert haben. Auch hier muss man sich anmelden. Sobald man eine Domain erzeugt hat, wird angezeigt, welche IP aktuell hinterlegt ist. Ein A steht für IPv4, AAAA für IPv6.- Anmelden/Account erzeugen
- Auf Add Host klicken
- curl -s -u "meine@anmeldeadresse:meinPasswort" "https://ydns.io/api/v1/update/?host=meinedomain.ydns.eu&ipv6=auto"
- curl -s -u "meine@anmeldeadresse:meinPasswort" "https://ydns.io/api/v1/update/?host=meinedomain.ydns.eu&ipv4=auto"
Ein Nachteil soll nicht verschwiegen werden: Es kann sein, dass das Erzeugen von Let's Encrypt-Zertifikaten nicht funktioniert, da die maximale Anzahl von ydns.eu-Zertifikaten erreicht wurde. Dann muss man warten und es später noch einmal versuchen. Das habe ich weder bei duckdns noch bei ipv64 erlebt. Es wird angezeigt, ab wann man es wieder versuchen kann. Das bedeutet, dass eventuell 12 Std. gewartet werden muss. Wenn das Installationsscript für den Proxy-Server ausgeführt wird, dann kommt irgendwann eine rote Warnmeldung. Das kann eventuell auch bei den anderen passieren.
ipv64
ipv64 ist auch kostenlos, hat dabei einige Beschränkungen. So darf die IP maximal 64x am Tag upgedatet werden. Das sollte jedoch keine Rolle spielen, da normalerweise die IP nur einmal je Tag gewechselt wird.- Anmelden/Account erzeugen
- Auf linken Button DynDNS-Add Domains klicken
- Dann rechts die neue Domain eingeben und eine Endung auswählen
- Nun auf Add Domain klicken
- Nun erscheint links die Domain. Als Ziel sollte die eigene IP-Adresse eingetragen sein. Ist Typ A ausgewählt, so ist das Ziel eine IPv4-Adresse, ist Typ AAAA ausgewählt, so ist das Ziel eine IPv6-Adresse. Möchte man beide verwenden, so muss jeweils Typ A und Typ AAAA ausgewählt werden mit der entsprechenden IP. Sollte die IP im Ziel-Feld nicht automatisch erscheinen, so muss man sie selbst herausfinden und eintragen. Unten steht ein Script zum Herausfinden der eigenen IP-Adressen.
- Dann auf Create Record klicken
- Nun erscheint unten bei der Domain einige Informationen. Unter dem zweiten Punkt Domain Update-URL - Security Level 2 (Mid) recommended kann man dann auf der rechten Seite die entsprechende URL kopieren
- curl -G "https://ipv64.net/nic/update?key=meinKey&ipv6=auto" - sollte IPv4 und IPv6 updaten
- curl -G "https://ipv64.net/nic/update?key=meinKey" - sollte IPv4 updaten
- curl -G "https://ipv64.net/nic/update?key=meinKey&ipv4=auto" - sollte IPv4 updaten
Ein Problem bei ipv64 ist, dass nur 64x ein DNS-Update pro Tag gemacht werden darf. Oben rechts befindet sich ein Zähler DynDNS Update Limit / 24h. Führt das Script aus und beobachtet, wie der Zähler hochgeht. Ein Refresh der Webseite nicht vergessen! Das bedeutet, dass man bei ipv64 nur alle 22,5 Minuten ein Update machen darf. Aber auch dafür gibt es eine Lösung: Man testet, ob die eigene IP mit der Namensauflösung übereinstimmt. Wenn nicht, genau dann wird das Script ausgeführt. Mehr dazu unten.
Ein weiteres Problem bei IPv64, das ich festgestellt habe: Es dauert teilweise Stunden, bis eine Änderung sich rumgesprochen hat. Das geht bei den beiden anderen wesentlich schneller.
Automatisierung des Abgleiches
Ziel ist es, dass der Befehl in eine Datei geschrieben wird, und diese Datei wird dann z.B. alle 15min aufgerufen und es wird geschaut, ob die IP sich geändert hat.Zuerst erzeugen wir eine Datei mit entsprechendem Inhalt. Nehmen wir an, mit curl -G "https://ipv64.net/nic/update?key=meinKey" wird die Namensauflösung angepasst. Nun einfach in der Kommandozeile im Home-Verzeichnis des Users eingeben:
nano update.sh
Nun folgenden Text eingeben:#!/bin/bash
curl -G "https://ipv64.net/nic/update?key=meinKey"
und mit Ctrl+x wird der Editor beendet und das Ganze wird gespeichert.Damit die Datei ausführbar gemacht wird, muss noch
chmod 775 update.sh
eingegeben werden.Um zu testen, ob es funktioniert:
./update.sh
eingeben. Wenn ich mich im selben Ordner befinde, in dem auch die Datei ist, die ich ausführen möchte, dann muss ein ./ vorangestellt werden.Angenommen wir haben eine Datei update.sh, die in unserem Home-Verzeichnis liegt, und die soll alle 15 min aufgerufen werden. Dann wird das gemacht mit:
crontab -e
wird der Editor für die wiederholenden Ereignisse geöffnet.*/15 * * * * /home/username/update.sh
Bedeutet, dass alle 15 min das Script ausgeführt wird. Wichtig: die Zeile mit einem Return abschließen!Nun F10 drücken zum Speichern.
Nun wird alle 15min die Datei update.sh aufgerufen werden.
Wichtig! Die Datei update.sh muss ausführbar sein. Es muss also ./update.sh funktionieren.
Test der Namensauflösung
Um zu testen, ob alles auch funktioniert mit der Domain und der eigenen IP-Adresse, kann es getestet werden. Am besten auf dem Computer testen, auf dem die Domain auch gebraucht wird. Besonders wenn auch IPv6 verwendet wird, wird es sonst nicht funktionieren. Hier wird die v4 und v6 Adresse angezeigt:wget -4 -O - -q http://icanhazip.com
curl icanhazip.com
Mit ping domainname kann man feststellen, ob der Name korrekt aufgelöst wird.Ein etwas besseres Script. Es teste zuverlässiger und vergleicht auch geich. Das ist grade bei IPV6 teilweise nicht so einfach.
Download[ datei|@=Proxy-Server:dnstest.sh=@]
Die Proxy-Installation
Dies war die Einlaitung. Nun geht es weiter. Es gibt zwei wege den Proxy zu installieren.Die Komplette Installation
Wenn ihr gerne wissen wollt wie ales funktioniert und etwas Ahnung habt, nicht scheut selbst einen webserver zu installieren und konfigurieren, dann könnt ihr den Proxy mit allem selbst installieren:Installation-ab 1.3
Docker. Der bequeme Weg
Das ganze geht auch sehr sehr sehr viel einfacher. Es muß nur docker auf einem Linux-System installiert werden. Dann wird die docker.tar.gz raufkopiert, und entpackt. In einer datei werden die Domain und eine Mailadresse eingetragen. Dann kann es auch schon losgehen.- Ein Script läd die aktuellen Proxy-Api und Proxy-Dacia herunter
- EinScript testet ob die Gruppe und Rechte für Docker vorhanden sind. Wenn nicht, wird das korrigiert
- Ein Webserver
- Das Zertifikat
- Die Zertifikatserneuerung
- Den Proxy-Api
- Den Proxy-Dacia
Was noch kommen wird ist die Integration der DynDNS-Anpassung für ipv64, duckdns, ydns.
Aktuell wird Docker noch getestet. Sobald das abgeschlossen ist, wird es freigegeben werden.