Zum Inhalt springen

DynDns im Selbstbau (erster Versuch)

  • von

Hier eine kleine Skriptsammlung, welche bei mir DynDns ersetzt. Sie setzt einen funktionierenden Webserver mit aktivem und korrekt konfiguriertem Bind Nameserver voraus.
Eine Anpassung an andere Nameserver sollte nicht sonderlich schwierig sein.

Auf dem Server läuft folgendes kleines PHP-Skript

Server:

<?
$dateiname = "ip.txt";
$ip = getenv ("REMOTE_ADDR");
echo $ip;
$handler = fOpen($dateiname , "r+");
fWrite($handler , $ip);
fClose($handler);
?>

Ebenso auf dem Server läuft  folgendes kleines Skript, welches den Nameserver mit der neuen Ip-Adresse füttert. Dafür braucht es:

#!/bin/bash
clientip=`cat /var/customers/webs/patrickwebs/seiten/www.bloy.biz/dyndns/ip.txt`
serverdnsip=`cat /home/skripte/dyndns/ip.dns.aktiv.txt`
# Problem bei der Art der Berechnung wenn mehr als eine Aenderung pro Stunde, daher Loesung mit Statusdatei besser
serial=$(date +%Y%m%d%H)

#prüfen ob sich die Datei geändert hat
# ip.dns.aktiv.txt vgl. mit /var/customers/webs/patrickwebs/seiten/www.bloy.biz/dyndns/ip.txt
if [ "$clientip" != "$serverdnsip" ]; then
#wenn ja

#test
echo $clientip;

#Musterdatei öffnen, Dateigrundwert ersetzen
cat patrick-bloy.de.zone.muster | sed -e s/aktuelle_ip/$clientip/ > patrick-bloy.de.zone.new

#serial berechnen
#Serial pro Tag um einen erhoehen, jedoch Pruefung ob neues Tagesdatum nicht vergessen
#dafuer Rahmen if Pruefung auf neues Tagesdatum,
#                               wenn nein = serial +1
#                               wenn ja = tagesdatum inkl. Stunde

#serial anpassen
cat patrick-bloy.de.zone.new | sed -e s/aktuelle_serial/$serial/ > patrick-bloy.de.zone.fertig

#veränderte Datei an den richtigen Ort bringen, Rechte anpassen
cp /home/skripte/dyndns/patrick-bloy.de.zone.fertig /etc/bind/domains/patrick-bloy.de.zone
#chgrp bind /etc/bind/domains/patrick-bloy.de.zone

#bind neu laden
/etc/init.d/bind9 reload
#Datei als aktuellen Eintrag setzen (ip.dns.aktiv.txt)
cp /var/customers/webs/patrickwebs/seiten/www.bloy.biz/dyndns/ip.txt  /home/skripte/dyndns/ip.dns.aktiv.txt

#Reinigung
rm patrick-bloy.de.zone.new
rm patrick-bloy.de.zone.fertig

else
# nein, keine Änderung, Ende des Programms
echo "keine Änderung notwendig, DNS-Record bereits aktuell"
fi

exit 0

Eine Bind Grunddatei je Domain:

$TTL 604800
@ IN SOA ns admin.bla.blub.de. (
2011121800 ; serial
2H ; refresh
1H ; retry
1D ; expiry
3h) ; minimum
@       IN      NS      ns
ns      IN      A       aktuelle
@       IN      MX      10 mail
mail    IN      A       aktuelle
@       IN      A       aktuelle
www     IN      A       aktuelle
*       IN      A       aktuelle

Auf dem LinuxClient läuft folgendes kleines Skript.

Linux-Client:

rm -rf ip.php
wget -c "https://www.bloy.biz/dyndns/ip.php" --http-user  --http-passwd
mv ip.php ip.aktuell

Der Client ruft nun, mit dem Passwort über eine https Verbindung, das PHP-Skript auf. Dieses schreibt die aktuelle Ip-Adresse in eine Textdatei.
Diese Textdatei nun wiederum nimmt sich das bash-Skript vor, entnimmt ihr die Ip-Adresse und schreibt und erstellt aus ihr und einer Musterdatei eine Zone Datei für Bind, kopiert diese an
die entsprechende Stelle und veranlasst Bind mittels „reload“ dazu die neuen Daten einzulesen.

Ich warne jedoch vor dem produktiven Einsatz des Skriptes. Es gibt noch einige Probleme die ich aus dem Weg räumen muss.

  1. Sicherheit: Es wird an keiner Stelle irgendein Parameter überprüft

2. Stundeneinteilung: Der Serial nimmt die Tagesstundenzahl als letzten Wert, wenn es mehr als eine Änderung der Ip-Adresse pro Stunde gibt könnte es hiermit Probleme geben. In der nächsten Fassung will ich
das Serial anders erzeugen(siehe Kommentare im Skript). Das Problem sollte dann nicht mehr auftreten.

Schreibe einen Kommentar

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