Betreibt man einen hosting DNS-Server kann es vorkommen das ein User seine Domain auf einen anderen DNS-Server zügelt, oder die Domain löscht, ohne dies dem DNS-Admin mitzuteilen. Die Folge sind verwaiste Zonenfile-Einträge auf dem DNS-Server.
Mittels dem Script: check_orphaned_dns_zones kann man einfach herauskriegen ob eine domain auf dem eigenen Nameserver wirklich noch diesen eingetragen hat und ggf. das Zonenfile der Domain entfernen.
Inhalt
Das Script
#!/bin/bash VIEW=$1 RNDC="/usr/sbin/rndc" command -v rndc dumpdb -zones $VIEW >/dev/null 2>&1 || { echo >&2 "The rndc command is required but not installed. Aborting."; exit 3; } $RNDC dumpdb -zones $VIEW until grep -q "Dump complete" "/var/named/data/cache_dump.db"; do sleep 1s; done PRIMARY_NAMESERVER="ns1.tech-island.com" NAMESERVERS=( ns1.tech-island.com ns2.afraid.org google-public-dns-a.google.com ) ZONEFILE="/var/named/data/cache_dump.db" if [ -r $ZONEFILE ] then for ZONE in `grep -iv '\.arpa' $ZONEFILE | grep -oP "'.*\/IN" | tr -d "'" |tr -d "/IN"`; do for NAMESERVER in ${NAMESERVERS[@]} do NS_RECORD=$(dig @$NAMESERVER +short $ZONE ns) if [[ $NS_RECORD != *$PRIMARY_NAMESERVER* ]] then RECORDS_FOUND="$RECORDS_FOUND $ZONE\n $NS_RECORD (our NS not listed on: $NAMESERVER)\n\n" fi done done else echo "Zonefile $ZONEFILE is not readable!" exit 3 fi if [[ $RECORDS_FOUND != "" ]] then echo -e "Orphaned zones found\n\n$RECORDS_FOUND" exit 1 else echo "No orphaned zones found." exit 0 fi |
Bei PRIMARY_NAMESERVER gibt man seinen primären Nameserver an (hier: ns1.example.com)
Bei NAMESERVERS gibt man alle seine eigenen Nameserver ein (hier: ns1.example.com und ns2.example.com), so wie einen externen Nameserver (hier: google-public-dns-a.google.com).
Bei ZONEFILE gibt man die Zonen Dump Datei des rndc Kommandos an (hier: /var/named/data/cache_dump.db)
Das Script fragt zuerst alle Zonen mit dem rndc
Kommando ab, filtert die reverse lookup Zonen heraus und überprüft dann für jede Domain im Zonefile, ob unser primärer Nameserver bei den anderen Nameservern eingetragen ist. Ist das nicht der Fall, wird eine Warnung ausgegeben. So kann man z.B. auch gut erkennen, wenn vergessen wurde eine Domain in den Backup-NS einzutragen.
Als Paramater lässt sich zudem noch eine view
mit angeben, falls man in bind einen Split-DNS Server realisiert hat.
Um beispielsweise nur die extenren Zonen miteinzubeziehen kann man mit folgendem Aufruf die view
external-zone
abfragen:
/usr/local/lib/nagios/plugins/check_orphaned_dns_zones external-zone
Alternatives Script
Dieses Script benötigt das rndc Programm nicht und holt sich die Zonen direkt aus einer Zonen definitions Datei.
Es ist jedoch etwas fragiler, weil es auf eine korrekte Formatierung dieser Datei angewiesen ist und funktioniert beispielsweise nicht, wenn die Trennungen statt mit spaces mit TABs gemacht sind.
#!/bin/bash PRIMARY_NAMESERVER="ns1.tech-island.com" NAMESERVERS=( ns1.tech-island.com ns2.afraid.org google-public-dns-a.google.com ) ZONEFILE="/etc/named/zones.d/zones.ext" if [ -r $ZONEFILE ] then for ZONE in `cat $ZONEFILE | grep -vh '^[ ]*#' "$@" | grep -v '^[ ]*$' | cut -d" " -f2`; do ZONE=${ZONE//\"/} for NAMESERVER in ${NAMESERVERS[@]} do NS_RECORD=$(dig @$NAMESERVER +short $ZONE ns) if [[ $NS_RECORD != *$PRIMARY_NAMESERVER* ]] then RECORDS_FOUND="$RECORDS_FOUND $ZONE\n $NS_RECORD (our NS not listed on: $NAMESERVER)\n\n" fi done done else echo "Zonefile $ZONEFILE is not readable!" exit 3 fi if [[ $RECORDS_FOUND != "" ]] then echo -e "Orphaned zones found\n\n$RECORDS_FOUND" exit 1 else echo "No orphaned zones found." exit 0 fi |
Dieses Script überprüft nun für jede Domain im Zonefile, ob unser primärer Nameserver bei den anderen Nameservern eingetragen ist. Ist das nicht der Fall, wird eine Warnung ausgegeben. So kann man z.B. auch gut erkennen, wenn vergessen wurde eine Domain in den Backup-NS einzutragen.
Zonefile
Das Zonenfile muss folgendes format haben:
zone "example.org" in { type master; file "/etc/named/zones/example.org"; allow-query { any; }; };
Verwendung in NRPE (auf dem Nameserver)
Das script auf den Nameserver kopieren (z.B. in: /usr/local/lib/nagios/plugins/check_orphaned_dns_zones.sh) und im nrpe daemon folgende Zeile einfügen:
command[check_orphaned_dns_zones]=/usr/local/lib/nagios/plugins/check_orphaned_dns_zones.sh
In icinga/nagios auf dem monitoring Server dann ein entsprechendes command definieren:
define command{
command_name check_orphaned_dns_zones
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -p 5666 -t 60 -c check_orphaned_dns_zones
}
Und ebenfalls einen Check:
define service {
use generic-service
name check_orphaned_dns_zones
host_name ns1.example.com
service_description Orphaned DNS-Zones
check_command check_orphaned_dns_zones
}
Ausgabe
Die Ausgabe sieht dann so aus: