BIND9 DNS-Abfragen mit PRTG erfassen

Letzte Aktualisierung am 22.10.2023, 11:10:17 Uhr

Wer eine eigene DNS-Infrastruktur 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 Serever 22.04 LTS. Für das Monitoring kommt die kostenlose Variante von Paessler PRTG zum Einsatz.

Konfiguration BIND9

BIND9 bringt standardmäßig einen Statistik Channel, welcher die Werte als XML als auch JOSN zurückgibt.

URL Typ
http://sns01.lab03.daniel.wydler.eu:8053/ XML Ausgabe
http://sns01.lab03.daniel.wydler.eu:8053/json JSON Ausgabe

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 * port 8053 allow { any; };
};

Somit lauscht der Port 8053 auf 0.0.0.0 und jede IP-Adresse (any) dürfen auf die Seite zugreifen. Die Konfiguration speichern und schließend.

Der gewählte Pfad für die Statistikdatei wurde auf Grund der Standard Konfiguration von AppArmor gewählt (/etc/apparmor.d/usr.sbin.named). Dort ist nämlich definiert, dass auf /var/log/named/ Dateien erstellt und geschrieben werden dürfen.

Den BIND9 Dienst neu laden:

systemctl reload named.service

Prüfen, ob der Socket erstellt worden ist:

netstat -tulpen | grep ":8053"
tcp        0      0 0.0.0.0:8053            0.0.0.0:*               LISTEN      114        21935      937/named

An dieser Stelle empfehle ich, dass der Zugriff auf die Statistik Informationen an der lokalen Firewall des DNS-Server reglementiert wird. Somit wird dies nicht anwendungsspezifisch, sondern zentral an einer Stelle verwaltet. Was auch eine mögliche Fehlersuche vereinfacht.

Konfiguration lokale Firewall

Ich nutze inzwischen auch auf diesen Server nftables und habe in der Datei /etc/nftables.conf folgende Zeile ergänzt:

...
ip saddr 192.168.200.18 tcp dport 8053 counter packets 0 bytes 0 accept
...

Danach die Änderungen speichern und den Editor schließen.

Änderungen übernehmen:

nft -f /etc/nftables.conf

Prüfen, ob die Firewall Regeln geladen bzw. aktiv sind:

nft list ruleset

Einrichtung einer Cronjobs

Damit die Statistik Datei regelmäßig aktualisiert wird, ist leider eine weitere Konfiguration möglich. Hierzu ergänze ich die Datei /etc/crontab um folgende Zeile:

*  *    * * *   root    rndc stats

Somit wird die Datei rund um die Uhr, jede Minute aktualisiert. Das ist dahin gehend wichtig, weil später in PRTG jeder Sensor auch einen Prüfintervall hat. Somit kann dieser im besten Fall ebenfalls jede Minute Daten abrufen.

Ob die Aufgabe erfolgreich ausgeführt wird, kann in der Datei /var/log/syslog jederzeit geprüft werden.

tail /var/log/syslog | grep "rndc"
Oct 22 10:37:01 sns01 CRON[1118]: (root) CMD (rndc stats)
Oct 22 10:38:01 sns01 CRON[1131]: (root) CMD (rndc stats)
Oct 22 10:39:01 sns01 CRON[1146]: (root) CMD (rndc stats)
Oct 22 10:40:01 sns01 CRON[1151]: (root) CMD (rndc stats)
Oct 22 10:41:01 sns01 CRON[1155]: (root) CMD (rndc stats)
Oct 22 10:42:01 sns01 CRON[1185]: (root) CMD (rndc stats)
Oct 22 10:43:01 sns01 CRON[1209]: (root) CMD (rndc stats)
Oct 22 10:44:01 sns01 CRON[1213]: (root) CMD (rndc stats)
Oct 22 10:45:01 sns01 CRON[1218]: (root) CMD (rndc stats)

 

Custom Sensor in PRTG erstellen

Zuerst muss auf der PRTG Probe der Custom Sensor abgelegt werden. In meinen Fall ist das korrekte Verzeichnis „D:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML“.

Dort habe ich eine neue Datei mit dem Namen „paessler-prtg_bind-stats-dns-queries.ps1“ erstellt. In diese Datei die aktuelle Version des Sensors einfügen, speichern und schließen. Alternativ kann die Datei natürlich auch direkt von meinem Git Repository geklont werden.

Zuerst lege ich in der PRTG WebUI ein neues Gerät mit dem FQDN des DNS-Servers an. In meinem Fall ist der Gerätenamen und DNS-Namen identisch: sns01.lab03.daniel.wydler.eu.

Danach füge ich dem Gerät einen neuen Sensor hinzu:

Wie man sieht, muss dem Skript drei Parameter übergeben werden.

Parameter Beschreibung
http://sns01.lab03.daniel.wydler.eu:8053/ Der FQDN sowie Port, auf dem das Statistik Modul von BIND9 erreichbar ist.
IncomingRequests Der Bereich, welcher aus dem BIND9 XML Datei ausgelesen werden soll.
%sensorid Die ID des PRTG Sensors wird übergeben, damit auf dem Dateisystem die gespeicherten XML Dateien von BIND9 einen eindeutigen Dateinamen haben.

Das Statistik Modul von BIND9 bietet eine Vielzahl von Informationen, welche unmöglich in einem Sensor vernünftig dargestellt werden kann. Daher muss dem Sensor den Bereich/Typ angegeben werden, welcher überwacht werden soll.

Aktuell gibt es folgende Parameter/Bereiche:

Parameter Screenshot
IncomingRequests
IncomingQueries
ResponseCode
NameserverStat
ZoneStat
OutgoingQueries

Es gibt natürlich noch weitere Statistiken in der XML Datei von BIND9. Freue mich natürlich, wenn jemand weitere Bereiche dem Skript hinzufügt.

Die ID des PRTG Sensors wird übergeben, damit auf dem Dateisystem die gespeicherten XML Dateien von BIND9 einen eindeutigen Dateinamen bekommen. Das sieht dann so aus:

Nachstehend exemplarisch meine PRTG Sensoren, wie sowas aussehen kann:

Ich freue mich natürlich im Feedback und natürlich auch Verbesserungsvorschläge.

Viel Spaß beim Ausprobieren. 🙂

Abonnieren
Benachrichtige mich bei
2 Comments
neueste
älteste
Inline Feedbacks
View all comments
Alexander
20.10.2023 09:43

Falls jemand mehere Binds überwachen möchte:

# Determine the file name based on the server’s IP or hostname
$prevStatsFile = „C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\bind9stats_“ + $args[0] + „.xml“

$prevStats = New-Object System.Xml.XmlDocument

# Load the previous statistics only if the file exists
if (Test-Path $prevStatsFile) {
$prevStats.Load($prevStatsFile)
}

# … [rest of the script remains the same]

# Save BIND Stats in XML file
$curStats.Save($prevStatsFile)