DynDNS mit Plesk, IPv4, IPv6 und PHP7

Datacenter

Das letzte Projekt habe ich gestartet, da ich mich durch „Bestätigen Sie ihren DynDNS-Domainnamen“ E-Mails, gestört gefühlt habe. Diese kamen – gefühlt – in immer kürzeren Abständen, natürlich mit den Angebot für nur 25$/Jahr nicht mehr gestört zu werden.

Daher habe ich ein mit Plesk Onyx und PHP7 kompatiblen DynDNS Dienst/Script geschrieben.

Was ist DynDNS?

Fangen wir einfach an. Die Internetverbindung von einen Server – beispielsweise von 1&1 – unterscheidet sich nicht wesentlich von unserer Privaten Internetverbindung.

Die meisten Internet Dienste können – mit den heutigen Leitungen – auch von zuhause betrieben werden. Das Problem ist jedoch, das sich bei fast allen Privaten Internetanschlüssen, die IPs alle 24 Stunden ändern.

Der Dienst DNS ist letztendlich nur ein Verzeichnis von IP Adressen – vergleichbar mit einen Telefonbuch. Wir können diesen Dienst benutzen, um mittels unseres Routers den DNS-Eintrag schnell zu ändern.

Hierfür gibt es viele Dienste, jedoch können wir dies auch selber – und das kostenlos – realisieren.

Implementierung von DynDNS

Bei der Implementierung von einen Dynamischen DNS Eintrag ist einiges zu beachten:

  • Die Time-to-Life von der Domain muss relativ kurz eingestellt werden.
  • Es muss ein Script auf den Server abgelegt werden.
  • Der Server muss für mindestens eine Domain den Dienst DNS bereitstellen
  • Es muss mit den gängigen Routern z.B. eine Fritz!Box kompatibel sein.
  • Es sollte möglichst wenige Angriffspunkte haben, da es im Zweifel andere DNS Einträge überschreiben könnte. Im Falle von Plesk auch Datenbank zugriff benötigt.

Folgende Überprüfungen habe ich eingebaut

  • Ist die IPv4 Adresse Valide?
  • Ist die IPv6 Adresse Valide?
  • Wurde ein korrekter Hostname angegeben?
  • Eine rudimentäre Authentifizierung
  • Speicherung der Daten in einer Cache-Datei um unnötige Datenbank Zugriffe zu vermeiden.
  • Verwaltet Plesk diese Domain?

Das haben ich doch schon mal gesehen?

Es gibt einige Beiträge, die dies schon gelöst haben. Unter anderem im viisauksenas Blog oder im Server Support Forum. Diese funktionierten jedoch nicht mit PHP7 oder IPv6. Jedoch haben Sie mir bei der schnelleren Lösungsfindung geholfen. Danke dafür.

Was benötige ich, um den Dienst zu benutzen?

Aktuell kann mein Skript nur mit Plesk benutzt werden. Da ich mittelfristig den E-Mail Dienst auslagern will und dann auf Plesk verzichten werde – habe ich jedoch Vorbereitungen für individuelle Hooks eingebaut.

  • Einen eigenen Virtuellen oder Dedizierten Server mit Fester IP
  • Mindestens eine Domain die zu 100% über Plesk DNS verwaltet wird
  • PHP7
  • Root Zugriff (bzw. Plesk Adminzugriff)
  • MySQL
  • Plesk
    • Die Git Erweiterung ist sinnvoll

Kurz Anleitung zur Installation des DynDNS Scripts

  • Git Repository https://github.com/TimWeyand/dyndns verwenden.
  • DNS Time-to-Life der jeweiligen Domain auf unter 300 Sekunden setzen.
    • Alle Domains mit niedriger DNS TTL können verwendet werden.
  • MySQL User anlegen mit Rechten auf:
    • SELECT auf `psa`.`domains, `psa`.`dns_zone`
    • SELECT und Update auf  (time_stamp, displayVal, val) ON `psa`.`dns_recs`
  • Config unter private/config.class.php anlegen und anpassen
  • Schreibrechte auf private/data ermöglichen
  • Webroot auf www/ legen
  • Cron einrichten cron/plesk.sh
  • Testen von https://[Domain]/updatedns?hostname=[dyndns-domain]&ip=[ipv4]&ip6=[ipv6]
  • Einrichten auf den Router: DynDNS bei der Fritzbox mittels „Benutzerdefiniert“-Option einrichten
    • https://[Domain]/updatedns.php?hostname=<DOMAIN>&ip=<ipaddr>&ip6=<ip6addr>

Step-by-Step Anleitung

Wir brauchen zuerst eine Domain oder Sub-Domain, die vielleicht nicht zu viel Traffic hat. Durch kürzere DNS Time-to-Life Zeiten könnten jeweilige Webseiten langsamer wirken.

Ich habe mich für eine Sub-Domain entschieden, von einer Domain dessen DNS über meinen Server läuft.

1. Sub-Domain erstellen

Plesk Subdomain anlegen

2. Sub-Domain einrichten

  • Unterstützung von Git aktivieren
  • Git Remote-Hosting wie GitHub oder Bitbucket
  • Git Remote-Repository: https://github.com/TimWeyand/dyndns
  • Achtung: Der Zielpfad von Git muss den „Dokumentenstamm“ entsprechen.

Plesk Subdomain hinzufügen

3. DNS-Server der Subdomain in der Hauptdomain einbinden

Wir müssen nun die Hauptdomain anpassen, damit die DNS Aufrufe an die Sub-Domain funktionieren.

In den Fall von ddns.server-project.info muss server-project.info angepasst werden.

Hauptdomain Anpassen

Nun müssen wir für die Subdomain unsere DNS-Server manuell eintragen. Diese sollten von euren Plesk verwaltet werden.

Wenn die (mindestens) zwei Einträge erfolgreich waren, muss das ganze noch bestätigt werden.

4. Sub-Domain DNS Anpassungen

Nachdem die Sub-Domain nun in der Hauptdomain eingetragen ist, müssen wir diese noch aktivieren und konfigurieren.

Wichtig ist, das wir wirklich auf der Sub-Domain sind.

Sub-Domain DNS Einstellungen

Als erstes aktivieren wir den DNS-Dienst für unsere Sub-Domain.

DNS für Sub-Domain aktivieren

Wir löschen alle Einträge, die wir nicht benötigen. Wir behalten alle NS Einträge, sowie den www und Sub-Domain Eintrag.

Unnötige DNS Einträge entfernen

Sub-Domain DNS Änderungen übernehmen

5. Anlegen von DynDNS Einträgen

Das Script aktualisiert (aktuell) nur bestehende Einträge, daher müssen wir die gewünschten Einträge nun anlegen.

Analog zu den NS-Einträgen, legen wir diese über „Eintrag hinzufügen“ an. Sofern der Anschluss IPv4 und IPv6 unterstützt, sollte ein A und ein AAAA Eintrag hinzugefügt werden.

Wir nehmen hier vorerst nur Platzhalter IP-Adressen.

DynDNS Eintrag für IPv4

DynDNS Eintrag für IPv6

6. SOA TTL stark reduzieren

Unser Anschluss soll auch nach einen IP Wechsel, schnell wieder erreichbar sein. Deswegen passen wir die SOA Einstellungen und reduzieren die Werte an.

SOA DNS Einstellungen aufrufen

7. Let’s Encrypt aktivieren

Wir wollen natürlich Daten nur verschlüsselt an den Server schicken. Wenn dieser Schritt erfolgreich ist, hat der vorherige Punkt auch funktioniert.

Eine längere Anleitung zu diesen Thema, habe ich in „Kostenloses SSL Zertifikat mit Let’s Encrypt“ geschrieben.

8. Hosting-Einstellungen anpassen

DynDNS Hosting Einstellungen aufrufen

Die Applikation ist unterteilt in einen „öffentlichen“ www-directory und private/supported scripts parallel dazu.

Wir müssen daher den „Dokumentenstamm“ um www erweitern. Zusätzlich aktivieren wir noch SSL/TLS.

DynDNS Hosting Einstellungen anpassen

9. Auslieferung des DynDNS Dienstes über nginx

Um den Technik-Stack zu vereinfachen, lassen wir nginx den DynDNS-Dienst direkt ausliefern.

  • Wir öffnen die „Einstellungen für Apache & nginx“ in unserer Domain
  • Deaktivieren „Proxymodus“ in den nginx-Einstellungen.

Für mehr Informationen zum installieren und konfigurieren von nginx, verweise ich auch meine anderen Beiträge.

Plesk Einstellungen Apache und nginx aufrufen

nginx Proxy Modus deaktivieren

10. Website Konfiguration testen

Als erstes sollten wir testen, ob die Domain korrekt funktioniert. Beim Aufruf der Webseite https://[Domain] sollte eine Webseite erscheinen, auf der nur ein Punkt zu sehen ist.

In unseren Beispiel ist dies https://ddns.server-project.info .

DynDNS Website Test

11. MySQL zugriff

Als nächstes benötigen wir SSH Zugriff auf den Server.

MySQL root Zugriff
plesk db

MySQL User anlegen
CREATE USER 'dyndns'@'localhost' IDENTIFIED BY 'someSecretPasswordYouChoose';
GRANT SELECT, UPDATE (time_stamp, displayVal, val) ON `psa`.`dns_recs` TO 'dyndns'@'localhost';
GRANT SELECT (id, name, dns_zone_id) ON `psa`.`domains` TO 'dyndns'@'localhost';
GRANT SELECT ON `psa`.`dns_zone` TO 'dyndns'@'localhost';

12. DynDNS Konfiguration anpassen

Die Beispiel Konfiguration liegt im Sub-Domain-Pfad/private/config.class.example.php

Im Normalfall müssen nur die Fett markierten Einträge angepasst werden.

namespace website\weyand\dyndns;
 
class config {
 
const cacheFile = __DIR__.'/data/dyndns.data';
 
const mysqlServer = 'localhost';
 
const mysqlPort = '3306';
 
const mysqlUsername = 'dyndns';
 
const mysqlPassword = 'YouShouldChangeThis-Aas4vxKA;AB2349ysR';
 
const mysqlDatabase = 'psa';
 
//you can restrict the usage of this module - but you do not have to.
const allowedDynDNSDomains = array();
//const allowedDynDNSDomains = array('dyndns.weyand.biz');
 
const applicationHash = 'YouShouldChangeThis-kasdj93qosB:DUS';
 
//possible values [false,'basic','db']
const authentication = 'basic';
 
//Basic Authentication
const basic_auth_username = 'dynuser';
 
const basic_auth_password = 'password';
}

Hier muss das in Schritt 11 gewählte Passwort eingetragen werden.
const mysqlPassword = 'YouShouldChangeThis-Aas4vxKA;AB2349ysR';

In diesen Abschnitt, kann der Benutzername und Passwort für den Router hinterlegt werden.

const basic_auth_username = 'dynuser';

const basic_auth_password = ‚password‘;

13. DynDNS Script testen

Als nächstes Testen wir unseren eigenen DynDNS Dienst im Webbrowser.

Die Syntax ist wie folgt: https://[Domain]/updatedns.php?hostname=[DynDNS-Hostname]&ip=[IPv4]&ip6=[IPv6]

In unseren Beispiel wäre dies beispielsweise:

https://ddns.server-project.info/updatedns.php?hostname=test.ddns.server-project.info&ip=111.111.111.111&ip6=2003:cb:fbbf:ea5:3631:c4ff:fe4a:a940

Die Benutzerdaten entsprechen der in Schritt 12 angegebenen basic_auth_* Daten.

Bei einen erfolgreichen Aufruf, erscheint die Meldung: „IP changed“.

DynDNS Dienst Erfolgsmeldung

14. Cronjob testen

Als nächstes testen wir den Cronjob. Dafür rufen wir auf unseren Server – mittels ssh – das script [DomainVerzeichnis]/plesk.sh auf.


Tims-MacBook-Pro:~ tim$ ssh root@www.weyand.biz
 
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-21-generic x86_64)
 
* Documentation:  https://help.ubuntu.com
 
* Management:     https://landscape.canonical.com
 
* Support:        https://ubuntu.com/advantage
 
You have mail.
Last login: Wed Jul 12 13:07:20 2017 from 87.157.134.219
This server is powered by Plesk. Log in by browsing
https://217.160.13.41:8443/ or https://server-project.info:8443/
You can log in as user 'root' or 'admin'. To log in as 'admin', use the 'plesk login' command.
Use the 'plesk' command to manage the server. Run 'plesk help' for more info.
root@server-project:~# cd /var/www/vhosts/server-project.info/ddns.server-project.info/
root@server-project:/var/www/vhosts/server-project.info/ddns.server-project.info# ./cron/plesk.sh

Als Ausgabe sollte beim ersten Aufruf folgendes erscheinen:
CronFile does not exist!
Updating: ddns.server-project.info
dnsmng: Some parameters in command string are left unprocessed. Check parameters please.
dnsmng: Some parameters in command string are left unprocessed. Check parameters please.

Als nächstes prüfen wir ob, die Kontrolldatei angelegt werden konnte.

root@server-project:/var/www/vhosts/server-project.info/ddns.server-project.info# ls -lah ./private/data/
total 16K
drwxr-xr-x 2 tim psacln 4.0K Jul 12 13:10 .
drwxr-xr-x 5 tim psacln 4.0K Jul 12 09:35 ..
-rw-r--r-- 1 root root 0 Jul 12 13:10 dyndns.cronrun
-rw-r--r-- 1 tim psacln 135 Jul 12 12:56 dyndns.data
-rw-r--r-- 1 tim psacln 36 Jul 11 22:02 README

Sofern die Dateien nicht vorhanden sind, bitte die Dateirechte von den Verzeichnis prüfen.

15. Cronjob einrichten

Wir fügen in die /etc/crontab folgende – auf euer System angepasste – Zeile hinzu:

* * * * * root /var/www/vhosts/server-project.info/ddns.server-project.info/cron/plesk.sh

16. Einrichtung von DynDNS am Beispiel der AVM Fritz!Box

  • Anmelden auf der Fritz!Box
  • Im Menü „Internet“ auswählen
  • „Freigaben“ aufrufen
  • Den Tab „DynDNS“ aufrufen
  • „DynDNS aktivieren“ auswählen
  • „DynDNS-Anbieter“ benutzerdefiniert auswählen
  • „Update-URL“: https://[DynDNS-Domain]/updatedns.php?hostname=<DOMAIN>&ip=<ipaddr>&ip6=<ip6addr>
    • Meine würde wie folgt aussehen: https://dyndns.server-project.info/updatedns.php?hostname=<DOMAIN>&ip=<ipaddr>&ip6=<ip6addr>
  • „Domainname“ Euren DynDns-Hostname
  • Benutzername und Passwort, wie in Punkt 12 angegeben ausfüllen.
  • „Übernehmen“ auswählen.

DynDNS auf der FritzBox einrichten

17. DynDNS Status überprüfen.

Die Aktualisierung von dem DynDNS-Eintrag kann bis zu 5 Minuten dauern.

Wir prüfen zuerst den Status auf der Fritz!Box:

Im macOS Terminal oder auf den Server prüfen wir mittels nslookup:

nslookup test.ddns.server-project.info

nslookup -query=“AAAA“ test.ddns.server-project.info

Dienst erfolgreich eingerichtet

Ich hoffe es hat alles korrekt funktioniert. Wenn ihr Feedback oder Fragen habt, nutzt gerne die Kommentarfunktion.

Über das Teilen/Verlinken des Beitrags oder ein „Star“ auf GitHub freue ich mich natürlich.

 

 

9 Gedanken zu „DynDNS mit Plesk, IPv4, IPv6 und PHP7“

  1. Ich muss meinen vorherigen Post korrigieren. Der Fehler lag einfach an der falsch aktivierten PHP Version.

    Was mich aber dennoch interessieren würde. Wie kann ich eine bestehende Domain verwenden ohne 2 Sub-Domains zu erstellen.

    Anstatt
    dns.domain.de
    test.dns.domain.de

    Nur
    domain.de << GIT? (bereits in Verwendung bsp. Forumsoftware)
    dns.domain.de

    Gruß, Marius.

  2. Hey danke für dieses Tutorial, aber ich hatte Probleme mit der config.class.php
    Die ganze Zeit zeigte es einen Fehler in Zeile 12 (syntax error, unexpected ‚.‘ etc…).
    Ich änderte:
    const cacheFile = __DIR__.’/data/dyndns.data‘;
    Zu
    const cacheFile = “.__DIR__.’/data/dyndns.data‘;
    und jetzt funktioniert es.

  3. Leider funktioniert dein Kapitel „13. DynDNS Script testen“ bei mir nicht. Wenn ich im Browser die Adresse mit den Variablen angebe, werd ich wie erwartet nach den Basic Authentifikationsdaten (Username, Passwort) gefragt. Allerdings nach der Eingabe von User/Pass, werd ich gleich wieder nach User/Pass gefragt. Ich bekomme nie die Meldung „IP changed“. Des Weiteren fehlt bei mir die Datei /opt/psa/admin/bin/dnsmng, weshalb ich vermute, dass dein Skript cron/plesk.sh nicht laufen kann.

    Mein Server:
    Frisch installierter Ubuntu 16.04 mit Plesk Onyx 17.5.3 Update #31.
    Die von mir in Plesk installierten Erweiterungen sind:
    – DigitalOcean DNS
    – Let’s Encrypt
    Vorinstalliert waren:
    – Firewall
    – Virtual Private Networking

    Irgendeine Idee, was der Fehler sein kann bzw. warum /opt/psa/admin/bin/dnsmng nicht existiert? Workaround?

    1. Hallo Jean,
      das selbe Problem habe ich gerade auch.
      Werde immer wieder auf die Authentifizierung geleitet.
      Konnte bisher noch nicht nachvollziehen warum. Vielleicht ist es auch einfach schon zu spät heute.

      Es wäre super genial wenn Weyand sich zu Wort melden würde. =)

      1. Ich habe gerade einmal in der config die authentication auf ‚false‘ gestellt.
        Hier bekam ich einen error das er die klasse false nciht findet.

        In der worker.class.php muss in der Zeile 38 false in Anführungszeichen gesetzt werden sollte man in der Config false ebenfalls in anführungszeichen geschrieben haben. durch !== besteht ein Typ Prüfung. Hat mich dann gerade auch mal 10 minuten gekostet bis ich das gesehen hatte…. 😛 Auf jedenfall funltioniert ohne die Authentication alles soweit.

        1. Hi,
          die Typ Prüfung ist schon so gewollt – die Lösung wäre eher in der config die Anführungszeichen zu entfernen.

          //possible values [false,’basic‘,’db‘]
          const authentication = false;

          Ich habe jedoch den worker erweitert, das er auch bei „false“ nicht mehr reinspringt. 🙂

          1. den letzten Beitrag einfach ignorieren. Hatte erst zu spät gesehen, das es ja definitiv so gewollt war -> false und nicht ‚false‘. Ok, leider habe ich aktuell immer noch das Problem das ich nicht aus der Authentifizierung herauskomme. Ich gebe user und pw ein und werde immer wieder zur Authentifizierung geleitet.
            Eine Idee was da fehlen könnte?

    2. Es gibt wohl unterschiedliche Pfad Varianten die die Hoster bei der installation verwenden. Eine andere Variante die ich per Google gefunden habe, ist /usr/local/psa/admin/sbin/dnsmng

      Vielleicht hat ja jemand eine Idee, wie die Pfade per bash ermittelt werden können.

      find / | grep ‚dnsmng‘ (oder ähnliches wäre ja sub-optimal)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.