Diese Seite wurde vor mehr als 2 Jahren erstellt und vor über einem Monat zuletzt bearbeitet. Eventuell ist längst ihr Mindesthaltbarkeitsdatum überschritten!
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:
host-record=eltern.ddns.example.com,88.64.203.167
Die soa.conf
im selben Verzeichnis so:
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
Download (Version 2.0): privater-ddns_2.0.tar.bz2