BIND DNS-Abfragen mit PRTG erfassen

Wer eine eigene DNS-Infrastrutkur betreibt, möchte natürlich auch wissen was die einzelne DNS-Server den ganzen Tag „zu tun“ haben. Interessant ist natürlich auch welche Typen von Records (un)regelmäßigen Abständen abgefragt werden. In meiner Testumgebung nutze ich BIND9 unter Ubuntu 16.04 LTS. Für das Monitoring kommt die kostenlose Variante von Paessler PRTG zum Einsatz.

BIND bringt standardmäßig einen Statistikchannel, welcher XML Werte zurückgibt. Damit dieser verwendet werden kann, muss die Konfiguration (/etc/bind/named.conf.options) des Nameservers ergänzt werden.

options {
...
        statistics-file "/var/log/named/named.stats";
};

statistics-channels {
        inet 192.168.80.10 port 8053 allow { 192.168.80.3; };
};

Die IP-Adresse 192.168.80.10 gehört der VM, auf der Nameserver läuft. Die 192.168.80.3 gehört den PRTG-Coreserver. Somit ist sichergestellt, dass keine anderen Geräte die Daten abgefragen können. Abschließend die geänderte Konfiguration speichern und neu laden (service bind9 reload). Wer iptables nutzt, sollte nicht vergessen das Regelwerk zu ergänzen.

Als nächstes wird der Sensor für PRTG angelegt. Dazu auf dem PRTG-Coreserver unter „C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML“ eine leere Datei mit dem Namen „bind9-statistiken.ps1“ erstellen. Diese mit einem Editor deiner Wahl öffnen und folgenden Inhalt einfügen.

$curStats = New-Object System.Xml.XmlDocument
$curStats.Load( $("http://"+$args[0]+":8053")) 
 
$prevStats = New-Object System.Xml.XmlDocument
$prevStats.Load("C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\bind9stats.xml")
 
$output = "<prtg>`n"
 
# Incoming Requests by DNS
for ($i = 0; $i -lt ($curStats.statistics.server.counters[0].counter | Where {$_.name -notlike 'RESERVED*'}).count; $i++) {  
    $output += "`t<result>`n"
    $output += "`t`t<channel>$(($curStats.statistics.server.counters[0].counter | Where {$_.name -notlike 'RESERVED*'}).name[$i])</channel>`n"
    
    $value = ($curStats.statistics.server.counters[0].counter | Where {$_.name -notlike 'RESERVED*'}).'#text'[$i] - ($prevStats.statistics.server.counters[0].counter | Where {$_.name -notlike 'RESERVED*'}).'#text'[$i]
    if($value -lt 0 ) { $value = ($curStats.statistics.server.counters[0].counter | Where {$_.name -notlike 'RESERVED*'}).'#text'[$i] }
 
    $output += "`t`t<value>$($value)</value>`n"
    $output += "`t</result>`n"
}
 
# Incoming Queries by Query Type
for ($i = 0; $i -lt ($curStats.statistics.server.counters[1].counter).count; $i++) {
   
    $output += "`t<result>`n"
    $output += "`t`t<channel>$(($curStats.statistics.server.counters[1].counter).name[$i])</channel>`n"
 
    $value = ($curStats.statistics.server.counters[1].counter).'#text'[$i] - ($prevStats.statistics.server.counters[1].counter).'#text'[$i]
    if($value -lt 0 ) { $value = ($curStats.statistics.server.counters[1].counter).'#text'[$i] }
 
    $output += "`t`t<value>$($value)</value>`n"
    $output += "`t</result>`n"
}
 
# Zone Maintenance Statistics
for ($i = 0; $i -lt ($curStats.statistics.server.counters[3].counter).count; $i++) {
   
    $output += "`t<result>`n"
    $output += "`t`t<channel>$(($curStats.statistics.server.counters[3].counter).name[$i])</channel>`n"
 
    $value = ($curStats.statistics.server.counters[3].counter).'#text'[$i] - ($prevStats.statistics.server.counters[3].counter).'#text'[$i]
    if($value -lt 0 ) { $value = ($curStats.statistics.server.counters[3].counter).'#text'[$i] }
 
    $output += "`t`t<value>$($value)</value>`n"
    $output += "`t</result>`n"
}
$output += "</prtg>"
 
# Output XML
$output
 
# Save BIND Stats in XML file
$curStats.Save("C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\bind9stats.xml")

Quelle: Git Repository

Falls PRTG abweichenden von Standard Installationspfad installiert wurde, so muss in dem Powershell-Skript jeweil die Zeil 5 und 52 angepasst werden. Abschließend die Änderungen speichern und die Datei schließen.

Nun kann in PRTG für jeden DNS-Server der Sensor hinzugefügt werden.


Wird der Sensor nicht direkt dem Gerät, welches als DNS-Server fungiert zugeordnet, so muss die Variable %device durch die IP-Adresse der VM ersetzt werden. Anderenfalls sind die Einstellungen aus den Screenshots richtig.

Der Sensor sieht im Betrieb so aus:

Viel Spaß damit… 🙂