Hallo zurück zu: Jannik konfiguriert seine Server. Heute geht es darum, einen DynDNS-Dienst über seine IP-Adresse zu informieren.

Warum möchte ich das?

Meine Wohnung hat keine konstante Internet-Adresse, sondern bekommt mehrmals (1 bis n mal) eine neue von NetCologne. Während es bestimmt viele Gründe gibt, warum das eine gute Idee ist, kommt es mir in die Quere. Denn mein NAS soll regelmäßig ein Backup von dem Storage zuhause empfangen und muss darum für diesen erreichbar sein. Weit vor meiner Zeit hat man dafür DNS/DynDNS-Dienste erfunden, die genau diesem entgegenwirken.

Mehr dazu lässt sich auf Wikipedia lesen.

Dann mal los?

Ich benutze:

  • Namecheap, austauschbar: Der Domain-Dienst deiner Wahl.
  • Mein NAS als Push-Service, austauschbar: Jede /.+NIX/-Umgebung, die ständig läuft.
  • PHP als Script-Sprache, austauschbar: Meinetwegen schreib dir das Programm auf Lochkarten.
  • ipv4, austauschbar? Sicherlich.

Schritt 1: Eigene IP herausfinden mit externem Service

Zunächst muss das NAS wissen, wie man es überhaupt erreicht. Dazu nimmt man sich einen Rechner - möglichst außerhalb seines eigenen Netzwerkes - und lässt ihn die IP-Adresse der Anfrage zurückgeben. Für meinen Fall habe ich dieses PHP-Scriptlein auf einen meiner Web-Hosts geladen:

<?php

echo $_SERVER['REMOTE_ADDR'];

Sicherlich könnte ich diesen Service publik machen, aber ich möchte nicht, dass Deine Infrastruktur umfällt, weil du dich auf die Präsenz meines Servers verlassen hast.

Schritt 2: DNS-Service anpollen

Nun kommen wir zur eigentlichen Aufgabe, nämlich dem Dynamic-DNS-Service zu melden, wie wir erreichbar sind. Dafür suchen wir uns das Passwort und die Update-URL aus dem Kunden-Interface des Domain-Betreibers.

Achtung! Das Interface, dass bedient werden muss, ist bei jedem Anbieter leicht unterschiedlich.
<?php

$subdomain = "nas";
$domain = "jannik.io";
$password = base64_decode("MeIN+PASSwort+in+base64==");
$ip = file_get_contents("https://iamjannik.me/my-ip.php");

if(filter_var($ip, FILTER_VALIDATE_IP) == FALSE) {
	die("Remote host unavailable.");
}

$url = "https://dynamicdns.park-your-domain.com/update?host=%s&domain=%s&password=%s&ip=%s";
$url = sprintf($url, $subdomain, $domain, $password, $ip);

$res = file_get_contents($url);

if (stripos($res, "<Done>True</Done>")) {
	// Everything went great. Stay calm, so there won't be an email.
} else {
	echo "Failed to update dynamic DNS. " . PHP_EOL
	. "Request URL: " . $url . PHP_EOL
	. " DNS host answered: " . PHP_EOL . PHP_EOL
	. $res;
}

Dieses Skript muss natürlich angepasst werden, kann dann (irgendwo) auf dem NAS abgelegt werden und als Crontab gestartet werden:

*/20 * * * * /usr/local/apache/bin/php /share/Web/dyndns.php

Die Frequenz musst Du selber nach Deinen Belieben einstellen. Ich leide momentan unter häufigen Verbindungsabbrüchen, sodass ich mitunter mehrmals in einer Stunde eine neue IP-Adresse bekomme und häufig diese Änderung kundtun muss.

Zwei Tipps noch, wenn du ein QNAP-NAS benutzt:

  1. Der /home/admin-Ordner ist ein schlechter Ort für das Skript, da er bei Neustarts geleert wird. Benutze lieber einen Netzwerk-Ordner wie /share/Web.
  2. Das Admin-Panel arbeitet mit PHP und darum ist PHP schon vorinstalliert unter diesem Pfad: /usr/local/apache/bin/php - jedoch nicht in der $PATH-Variable!
  3. Den Crontab zu setzen, ist nicht ganz so einfach wie unter “normalen” systemd-Servern. Stattdessen:
    1. Crontab-Datei bearbeiten: sudo vi /etc/config/crontab. Es öffnet sich vi, mit welchem Du die Zeile einfügst. Anschließend mit ESC, dann :wq beenden.
    2. Konfiguration laden und Server neustarten: crontab /etc/config/crontab && /etc/init.d/crond.sh restart

    Siehe dafür auch: Das QNAP-Wiki.

Avatar

Veröffentlicht am von Jannik

Technik Open Source

19 | der blasse, dünne Junge aus der Nachbarschaft | Macht Web Design, Theatertechnik und Pfadfinder | Ist #Wö‑Leiter | Studiert was mit Medien