Nagios

DNS Statistik in Nagios

Neugierde, absolute Neugierde trieb doch zum aktuellen Experiment. Natürlich gibt es hierfür bereits eine fertige Lösung: dnsgraph von Przemyslaw Sztoch (ein Dank an dieser Stelle für die Inspiration). DNSgraph hat für unseren Einsatz allerdings eine kleine Schwachstelle: Es legt die Statistiken auf dem lokalen System in rrd Dateien ab und generiert auch dort die Grafiken. Wenn man nur einen Server hat, der nebenbei noch LAMP System ist, ist das sicherlich ganz nett. Allerdings für den professionellen Einsatz auf mehreren dedizierten DNS Servern nicht mehr wirklich nutzbar. Im ersten Versuch wurde das Script einfach ein wenig umprogrammiert damit es statt einer rrd zu erzeugen einfach die Statistiken ausgibt und diese per SNMP abfragen lässt. Man muss nicht erwähnen das dies nicht wirklich das Gelbe vom Ei darstellt. Also folgte eine kleine Machbarkeitsstudie in Python: Python DNSstat Script (hierfür gilt auch wie für anderes: Es ist nur das Testscript, es fehlen zum Beispiel sämtliche Fehlerprüfungen, die Produktiv- Scripte rücken wir so einfach nicht raus). . ).

Aber richtigen wir das ganze mal für Nagios ein, wichtig ist, das wir eine grafische Auswertung der Performancedaten haben (zum Beispiel PNP) wer das nicht hat braucht an dieser Stelle nicht mehr weiter lesen, da ein “Monitoring” der Werte nicht geplant ist.

Wir schieben also unser Script nach /root/script/ und machen es ausführbar. Das BIND und rndc richtig konfiguriert sind setze ich einfach einmal wieder voraus. Noch eine letzte Warnung: Sämtliche Pfadangaben beziehen sich auf Gentoo, alternativ einfach die Pfadangaben ändern. Im folgenden Ablauf generieren wir eine alte Statistik die das Script dringend braucht aber beim ersten Mail nicht selbstständig anlegt (das es keine Fehlerprüfungen gibt erwähnte ich bereits).


rndc stats
cd /var/bind/
mv named.stats oldnamed.stats

Jetzt binden wir das ganze wieder wie gewohnt in SNMP ein (ich erwähne nicht das man SNMPD danach neustarten sollte):

exec check_dnssf /root/script/dnsstat.py

Nagios
Auf Seiten von Nagios brauchen wir natürlich ein passendes Script, die Datei nennen wir check_snmp_dnsstat:

#!/bin/bash

/opt/nagios/libexec/check_snmp -H $1 -P 1 -C public -o .1.3.6.1.4.1.2021.8.1.101.7 -u queries | /bin/awk -F\" '{print $2}' | /bin/awk -F\: '{print $1" "$2" "$3" "$4" "$5" "$6" | Success="$1" Failure="$2" Recursion="$3" Referral="$4" Nxrrset="$5" Nxdomain="$6}'

Hier wieder ein Hinweis auf gestellte Fallen, ob man feste Pfadangaben verwenden sollte, muss natürlich jeder selbst wissen. Wie das als Command in Nagios eingebunden und dann päter auf einem Server angehangen wird ist bekannt.

PNP
Im Beispiel wird PNP so konfiguriert das wir wie bei dnsgraph aus dem sechs Werten drei Grafiken bekommen. Das PHP Template sieht dafür so aus:

$opt[1] = "--vertical-label queries/hour -l0 --title \"$hostname / $servicedesc\" ";
$def[1] = "DEF:success=$rrdfile:$DS[1]:AVERAGE " ;
$def[1] .= "DEF:failure=$rrdfile:$DS[2]:AVERAGE " ;
$def[1] .= "AREA:failure#009900:\"Failure \" " ;
$def[1] .= "GPRINT:failure:LAST:\"%6.2lf last\" " ;
$def[1] .= "GPRINT:failure:AVERAGE:\"%6.2lf avg\" " ;
$def[1] .= "GPRINT:failure:MAX:\"%6.2lf max\\n\" " ;
$def[1] .= "LINE2:success#000099:\"Success \" " ;
$def[1] .= "GPRINT:success:LAST:\"%6.2lf last\" " ;
$def[1] .= "GPRINT:success:AVERAGE:\"%6.2lf avg\" " ;
$def[1] .= "GPRINT:success:MAX:\"%6.2lf max\\n\" ";

$opt[2] = "--vertical-label queries/hour -l0 --title \"$hostname / $servicedesc\" ";
$def[2] = "DEF:recursion=$rrdfile:$DS[3]:AVERAGE " ;
$def[2] .= "DEF:referral=$rrdfile:$DS[4]:AVERAGE " ;
$def[2] .= "AREA:referral#BB0000:\"Referral \" " ;
$def[2] .= "GPRINT:referral:LAST:\"%6.2lf last\" " ;
$def[2] .= "GPRINT:referral:AVERAGE:\"%6.2lf avg\" " ;
$def[2] .= "GPRINT:referral:MAX:\"%6.2lf max\\n\" " ;
$def[2] .= "LINE2:recursion#000000:\"Recursion \" " ;
$def[2] .= "GPRINT:recursion:LAST:\"%6.2lf last\" " ;
$def[2] .= "GPRINT:recursion:AVERAGE:\"%6.2lf avg\" " ;
$def[2] .= "GPRINT:recursion:MAX:\"%6.2lf max\\n\" ";

$opt[3] = "--vertical-label queries/hour -l0 --title \"$hostname / $servicedesc\" ";
$def[3] = "DEF:nxrrset=$rrdfile:$DS[5]:AVERAGE " ;
$def[3] .= "DEF:nxdomain=$rrdfile:$DS[6]:AVERAGE " ;
$def[3] .= "AREA:nxdomain#ff00ff:\"Nxdomain \" " ;
$def[3] .= "GPRINT:nxdomain:LAST:\"%6.2lf last\" " ;
$def[3] .= "GPRINT:nxdomain:AVERAGE:\"%6.2lf avg\" " ;
$def[3] .= "GPRINT:nxdomain:MAX:\"%6.2lf max\\n\" " ;
$def[3] .= "LINE2:nxrrset#006699:\"Nxrrset \" " ;
$def[3] .= "GPRINT:nxrrset:LAST:\"%6.2lf last\" " ;
$def[3] .= "GPRINT:nxrrset:AVERAGE:\"%6.2lf avg\" " ;
$def[3] .= "GPRINT:nxrrset:MAX:\"%6.2lf max\\n\" ";

Auch das ist wieder nur ein Entwurf, das lässt sich noch prima näher an dnsgraph anpassen, mal davon abgesehen das die im Template genannte Angabe queries/hour so nicht stimmt (dazu müssten die Daten umgerechnet werden). Bei uns wird das alle fünf minuten abgefragt, von daher sind die Angaben für fünf Minuten. Und wenn wir nun alles richtig gemacht haben, schaut das nach einiger Zeit so aus:
DNS Stat Graph Success / Failure
DNS Stat Graph NXrrset / Nxdomain

1 thought on “DNS Statistik in Nagios”

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert