Eigener DDNS Dienst über ein PHP Script

https://www.netzwelt.de/avm-fritzbox/136891_2-dyndns-kostenlose-alternative-fritz-box-selber-bauen.html

Dieser Artikel beschreibt, wie die eigene Fritzbox ein PHP Script auf einem Webspace kontaktiert, die aktuelle IP-Adresse übermittelt und man somit keinen DDNS Dienstleister benötigt.
Der Artikel ist von 2014 und da ich keine Ahnung von PHP hab, ich wollte euch fragen, ob das Script sicher ist, besonders da ja ein Passwort im Klartext im Script zu sehen ist.

Hier das Script für alle, die den Link nicht extra aufrufen wollen:

<?
$pwort = 'ihr-passwort';
$dyntxt = "textdatei.txt";
$port = ":8080";
$pwortcontrol = $_GET["pass"];
$IP = $_GET["meineip"];
$FW = $_GET["FW"];
if (file_exists($dyntxt))
{
if ($pwortcontrol==$pwort)
{
$a = fopen("$dyntxt", "w");
fwrite($a, $IP);
fclose($a);
}
else {
$a = fopen("$dyntxt", "r+");
$dynip = fread($a,filesize($dyntxt));
fclose($a);
if ($FW == 1) {
$url="https://".$dynip;
} else {
$url="http://".$dynip."".$port;
}
header("Location: $url");
}
}
?>

Weitere Erläuterungen zum Script (wie das Ganze in der Fritzbox einzurichten ist, steht in dem Link):

Die ersten drei Werte müssen Sie anpassen: „$pwort = ‚ihr-passwort‘;“ legt Ihr gewünschtes Passwort fest und „$dyntxt = „textdatei.txt“;“ bestimmt den Namen der leeren Textdatei. Sofern Sie nicht direkt auf der Fritz!Box landen wollen, sondern beispielsweise auf Ihrem NAS, komplettiert "$port = „:8080"“ die IP-Adresse. Aus der Beispieladresse „70.80.90.5“ würde also „70.80.90.5:8080“. Das Beispiel „8080“ ist der Standard-Port der NAS-Systeme der Firma Qnap, hier tragen Sie natürlich eigene Werte ein, die von Anwendung zu Anwendung unterschiedlich sind. Die Port-Angabe lässt sich auch noch über Pfadangaben präzisieren. Um etwa den Dateimanager einer Qnap-NAS direkt aufzurufen, würde der Eintrag „$port = „:8080/cgi-bin/filemanager“;“ lauten.
Laden Sie anschließend die angepasste PHP- sowie eine leere Textdatei in ein eigenes Verzeichnis auf Ihrem Webspace hoch, sodass das Skript beispielsweise unter www.ihr-webspace.de/dns/dyndns.php erreichbar ist. Achten Sie darauf, dass die Textdatei beschreibbar ist - die meisten Provider bieten eigene Tools, um Dateiberechtigungen zu setzen

Passwörter in Klartext sind immer unschön, lässt sich aber hier leider nicht vermeiden. Von außen kann man diese Variablen nicht abfragen. Das Skript wird beim Aufruf vom Server verarbeitet und das Ergebnis an den Client ausgegeben - oder wie hier einen Header mit einem neuen Ziel.

Grundsätzlich ist es so, dass alles was per GET-Methode übertragen wird, für jeden sichtbar in der URL enthalten ist, d.h. mit Wireshark und in Logfiles sieht jeder diesen Aufruf:

https://ihr-webspace.de/dns/dyndns.php?pass=meinPasswort&meineip=xxx.xxx.xxx.xxx&FW=1

Das ist unschön, aber einen anderen Weg gibt es über die FRITZ!Box leider nicht.

Sofern du eine eigene Domain und Zugriff auf die DNS-Einträge hast, würde ich das etwas anders aufbauen:

  1. Auf dem Webspace würde ich ein Skript ablegen, welches nur die aktuelle IP-Adresse des anfragenden ausgibt (kann öfters mal nützlich sein).
  2. Ein beliebiges Gerät (z.B. Raspberry Pi) in deinem Heimnetz ruft dieses Skript z.B. alle 5 Minuten auf und speichert diese IP-Adresse in einer Datei.
  3. Bei einer neuen IP-Adresse (mit der gespeicherten abgleichen) führt dein Client ein lokales Skript aus, welches den DNS-Eintrag aktualisiert (A-Record).

Wie genau dieses Skript im letzten Punkt aussehen muss, ist abhängig vom Hoster. Hetzner, netcup, Strato und Co. bieten dafür häufig APIs an. Die notwendigen Informationen findet man normalerweise über eine Suchmaschine (Name des Hosters + DNS + API). Der Vorteil wäre, dass du dann auch z.B. ein LetsEncrypt-Zertifikat einrichten könntest, was mit dem o.g. Skript nicht möglich ist.

Nachtrag: Man kann in der FRITZ!Box unter DynDNS auch eine lokale IP-Adresse angeben (z.B. deinen Raspberry Pi) und das Skript im Punkt 3 direkt ausführen lassen, sobald die FRITZ!Box eine neue IP-Adresse bekommt. Dann spart man sich den Webspace und das 5-Minuten-Intervall.