Eigener DynDNS mit dnsmasq, Apache und PHP

In Computer und Netzwerk | Erstellt: 08.02.2016, 14:48 | Editiert: 26.10.2018, 09:51 | 2.628 mal angesehen | Seite drucken

Aktualisiert am 11. Februar 2016: Verwendung von inotify statt eines Cronjobs.

Analog zum DynDNS mit Bind hier die Anpassungen für dnsmasq als Authoritative DNS:

Um die Haupt-Konfigurationsdatei /etc/dnsmasq.conf in Ruhe zu lassen, wird ein Include-Verzeichnis für zusätzliche Dateien angegeben, z.B.

# Read *.conf from this folder (DynDNS A records and SOA config/zone serial)
conf-dir=/var/www/dyndns-vhost/dnsmasq/,*.conf

Das PHP des DynDNS-VHosts (Funktion in include/functions.php) muss dann statt einem nsupdate mit dem Key der Zone lediglich die .conf-Dateien im Dateisystem schreiben – Eine für den geänderten Host, eine für die neue Seriennummer der Zone.

Eine clientname.conf in /var/www/dyndns-vhost/dnsmasq/ sieht z.B. so aus:

# 20160207 (20:09)
host-record=eltern.ddns.example.com,88.64.203.167

Die soa.conf im selben Verzeichnis so:

# 20160207 (20:09)
auth-soa=2016021152,hostmaster.example.com,1200,120,604800

Als Seriennummer der Zone wird den Integer-Anteil von (MinuteDesTages / 14.41) – also 00..99 – verwendet. Auszug der Funktion update_dns($host, $ip) in PHP:

// dnsmasq: Dateien schreiben
// -------------------------------------------------------------------
// Serial: YYYYMMDDNN
$zone_serial_base = date('Ymd');
$current_hour     = date('H');
$current_minute   = date('i');
$minute_of_day    = ((60 * $current_hour) + $current_minute);
$zone_serial_tag  = floor($minute_of_day / 14.41);
$zone_serial      = $zone_serial_base.$zone_serial_tag;
$file_timestamp   = date("Ymd")." (".date("H:i").")";

// Hosts-Datei schreiben
//    host-record=$host.DDNS_ZONE,$ip
$file_name        = DNSM_FOLDER.$host.".".DDNS_ZONE.".conf";
// Inhalt
$file_host_record  = "# ".$file_timestamp."\n";
$file_host_record .= "host-record=".$host.".".DDNS_ZONE.",".$ip."\n";
$write_result = file_put_contents($file_name, $file_host_record);
if ( $write_result === false ) {
   // Schreiben fehlgeschlagen
   write_debug("Write file '".$host.".".DDNS_ZONE.".conf' failed");
} else {
   // Schreiben OK, N Bytes geschrieben
   write_debug("Write file '".$host.".".DDNS_ZONE.".conf' OK");
}

// SOA - Datei schreiben
//    auth-soa=$zone_serial,SOA_RNAME,SOA_REFRESH,SOA_RETRY,SOA_EXPIRY
$file_name        = DNSM_FOLDER."soa.conf";
// Inhalt
$file_soa_record  = "# ".$file_timestamp."\n";
$file_soa_record .= "auth-soa=".$zone_serial.",".SOA_RNAME;
$file_soa_record .= ",".SOA_REFRESH.",".SOA_RETRY.",".SOA_EXPIRY."\n";
$write_result = file_put_contents($file_name, $file_soa_record);
if ( $write_result === false ) {
   // Schreiben fehlgeschlagen
   write_debug("Write file 'soa.conf' failed");
} else {
   // Schreiben OK, N Bytes geschrieben
   write_debug("Write file 'soa.conf' OK");
}

In /etc/iwatch/iwatch.xml eine neue watchlist anlegen:

<watchlist>
	<title>dnsdmasq</title>
	<contactpoint email="root@example.com" name="Administrator"/>
	<path type="single" syslog="off" events="modify" alert="off" exec="/data/scripts/inotify_ddns.sh">/var/www/dyndns-vhost/dnsmasq/soa.conf</path>
</watchlist>

Iwatch überwacht live die Datei soa.conf und führt bei einem "modify"-Event das Skript /data/scripts/inotify_ddns.sh aus.

Bei der Verwendung von incron erledigt folgende /etc/incron.d/dnsmasq-dyndns das Ausführen:

/var/www/dyndns-vhost/dnsmasq/soa.conf IN_CLOSE_WRITE /data/scripts/inotify_ddns.sh

Dieses Skript startet dnsmasq nach einer Syntax-Prüfung der Konfiguration und der Include-Dateien neu:

#!/bin/bash
#
# dnsmasq bei DynDNS-Updates neu starten
# Client -> PHP -> Dateien -> iwatch -> dieses Bash-Skript
#
# Syntax-Check der dnsmasq-Konfiguration
DNSMASQ_SYNTAX=$(/usr/sbin/dnsmasq --test 2>&1)
# Logdatei
LOGFILE="/var/log/inotify.log"
# Timestamp
TIMESTAMP=`date +"%Y-%m-%d %H:%M:%S %Z"`

# Loggen
echo "${TIMESTAMP} [inotify_ddns] Started" >> ${LOGFILE}
logger "[inotify_ddns] inotify detected changed file"

if [ "${DNSMASQ_SYNTAX}" = "dnsmasq: syntax check OK." ];
then
   # Syntax-Check OK
   echo "${TIMESTAMP} [inotify_ddns] Syntax of /etc/dnsmasq.conf is OK, restarting dnsmasq" >> ${LOGFILE}
   logger "[inotify_ddns] Syntax of /etc/dnsmasq.conf is OK, restarting dnsmasq"
   # Dienst dnsmasq neu starten
   /usr/sbin/service dnsmasq restart > /dev/null 2> /dev/null
   if [ "$?" != 0 ];
   then
      # Fehler beim Neustart
      echo "${TIMESTAMP} [inotify_ddns] Restart of dnsmasq FAILED" >> ${LOGFILE}
      logger "[inotify_ddns] Restart of dnsmasq failed"
   else
      # Neustart OK
      echo "${TIMESTAMP} [inotify_ddns] Restart of dnsmasq OK" >> ${LOGFILE}
      logger "[inotify_ddns] Restart of dnsmasq done"
   fi
else
   # Syntax-Check nicht OK
   echo "${TIMESTAMP} [inotify_ddns] Syntax of /etc/dnsmasq.conf is NOT OK" >> ${LOGFILE}
   logger "[inotify_ddns] Syntax of /etc/dnsmasq.conf is not OK, sending mail"
   /data/scripts/mailer.sh "${HOST_NAME}: /etc/dnsmasq.conf Syntax-Check nicht OK" "Datei pruefen!"
fi

In /var/log/inotify.log kann die Funktion überwacht werden:

2016-02-11 12:38:22 [inotify_ddns] Started
2016-02-11 12:38:22 [inotify_ddns] Syntax of /etc/dnsmasq.conf is OK, restarting dnsmasq
2016-02-11 12:38:22 [inotify_ddns] Restart of dnsmasq OK

Dateien

Download (Version 2.0): privater-ddns_2.0.tar.bz2

Weitere Seiten in 'Computer und Netzwerk'

Schreibe einen Kommentar

Captcha * Time limit is exhausted. Please reload CAPTCHA.