openHAB :: Kleines Netzwerkmonitoring

openhabnmUm einen Vortragenden der letzten OpenRheinRuhr zu zitieren: „Einen Dienst, den man nicht überwacht, braucht man nicht„. Für die Überwachung von Servern, Netzwerkkomponenten und einzelnen Diensten gibt es zahlreiche, teilweise sogar quelloffene und kostenlose Produkte auf dem Markt. Für eine heimische Diagnose, warum das Internet mal wieder „kaputt“ ist, reichen jedoch ein paar lokale Scripte und eine Anzeige der Stati in openHAB. Nennen wir es einfach „Netzwerk-Monitoring des kleinen Admins“.

Verfügbare Artikel zu openHAB

little_blue_dot Einleitunglittle_blue_dot Einbinden der Internetgeschwindigkeitlittle_blue_dot RFID-Lesegerät einbinden
little_blue_dot Installationlittle_blue_dot Präsenzerkennung via Bluetooth und Pinglittle_blue_dot Einbinden von DS18B20-Sensoren
little_blue_dot Konfigurationlittle_blue_dot Kleines Netzwerkmonitoringlittle_blue_dot ical-Abfallkalender einbinden
little_blue_dot Reverse-Proxy für OpenHABlittle_blue_dot Einbinden von LG-Fernsehern [Update]little_blue_dot openHAB als Wecker
little_blue_dot Datenspeicherung und Statistikenlittle_blue_dot Einbinden Schaltern und Kontaktenlittle_blue_dot Einbinden von Bewegungssensoren
little_blue_dot Regeln planen und konfigurierenlittle_blue_dot Einbinden von Funksteckdosen (433 MHz)little_blue_dot Einbinden einer FritzBox
little_blue_dot Einbinden von USB-Steckdosenleisten (SIS-PMS)little_blue_dot Infrarotgesteuerte Geräte einbindenlittle_blue_dot Sprachausgabe auf einem Raspberry
little_blue_dot Einbinden von Temperatursensorenlittle_blue_dot Steuerung mit NFC-Tagslittle_blue_dot Schaltbare Steckdosenleiste mit Relais
little_blue_dot Externer Zugriff mit my.openhab

 

 

Scripte erstellen

Für fast jede Überprüfungsart werden wir ein separates Script erstellen, dass unser gewünschtes Ziel bzw. einen Dienst auf seine Erreichbarkeit/Funktion prüft. Die Scripte erstellen wir auf dem Server, auf dem auch openHAB ausgeführt wird.

 

Überwachung von DNS-Servern

Falls wir einen eigenen DNS-Server bzw. DNS-Cache betreiben, möchten wir gerne prüfen, ob dieser seine Dienste ordnungsgemäß verrichtet. Hierfür haben wir mehrere Möglichkeiten. Wir könnten die Erreichbarkeit des Servers mittels „Ping“ prüfen. Jedoch könnte es ja sein, dass nicht der gesamte Server, sondern nur der DNS-Daemon seinen Dienst quittiert hat. Eine zuverlässigere Methode besteht darin, den DNS-Server mit einer „Auflösungs-Anfrage“ zu prüfen. Dazu installieren wir zunächst das Paket „dnsutils„, da dieses das für uns interessante Tool „dig“ enthält:

apt-get install dnsutils

 

Nun erstellen wir, wie von anderen Beiträgen gewohnt, im Verzeichnis „/scripts/“ ein neues Script und nennen es „dnscheck.sh„:

nano /scripts/dnscheck.sh

 

Meine Version des Scripts ist wie folgt aufgebaut:

#!/bin/bash

#Pruefen, ob Suffix angegeben
if [ -z "$1" ] ;then
    echo "So geht das nicht"
    exit 1;
fi

/usr/bin/dig @$1 $2 > /dev/null
DNSTEST=$?

if [ $DNSTEST -eq 0 ]; then
    echo "ON"
else
    echo "OFF"
fi

 

Wir erlauben das Ausführen des Scripts mit

chmod +x /scripts/dnscheck.sh

, übertragen den Besitz an den Nutzer „openhab

chown openhab: /scripts/dnscheck.sh

und können es wie folgt aufrufen:

/scripts/dnscheck.sh IP_DES_DNS_SERVERS HOSTNAME_ZUM_PRÜFEN

 

Beispiel:

/scripts/dnscheck.sh 192.168.1.254 klenzel.de

 

Überwachen von einzelnen Ports

Manchmal kann es sinnvoll sein, einfach nur zu prüfen, ob ein bestimmter Port auf einem bestimmten Server oder Gerät erreichbar ist. So können wir beispielsweise SSH-Dienste, Webserver oder Telefonanlagen (SIP) prüfen.

Dazu installieren wir das Tool „nmap“ mit…

apt-get install nmap

…und erstellen ein neues Script „/scripts/portcheck.sh“ mit folgendem Inhalt:

#!/bin/bash
#Benutzung: ./portcheck.sh IP PORT [t|u]

#Pruefen, ob Suffix angegeben
if [ -z "$1" -o -z "$2" -o -z "$3" ] ;then
    echo "So geht das nicht"
    exit 1;
fi

if [ "$3" = "t" ]; then
    sudo nmap -v -sT $1 -p $2 |grep open > /dev/null
    PORTTEST=$?
fi

if [ "$3" = "u" ]; then
    sudo nmap -v -sU $1 -p $2 |grep open > /dev/null
    PORTTEST=$?
fi

if [ $PORTTEST -eq 0 ]; then
    echo "ON"
else
    echo "OFF"
fi

 

Die Art und Weise, wie wir mittels „nmap“ in dieser Anleitung Prüfungen durchführen, benötigen zum Teil erhöhte Rechte. Daher installieren wir „sudo“ mit

apt-get install sudo

und tragen eine neue Zeile in die Datei „/etc/sudoers“ ein:

openhab ALL = NOPASSWD: /usr/bin/nmap

 

Nachdem wir auch diesem Script die Ausführung mit

chmod +x /scripts/portcheck.sh

erlauben und den Besitz mit

chown openhab: /scripts/portcheck.sh

übertragen haben, starten wir dieses wie folgt:

/scripts/portcheck.sh IP_DES_SERVERS PORT_DES_DIENSTES TCP_ODER_UDP

 

Beispiel:

/scripts/portcheck.sh 192.168.1.211 5060 u

 

Überwachung von SSL-Zertifikaten

Wer eine eigene Internetseite sein Eigen nennt und diese über ein SSL-Zertifikat für die Verwendung von HTTPS verfügt, ist daran interessiert, rechtzeitig vor dem Ablauf des Zertifikates gewarnt zu werden.

Dazu nutzen wir das bereits vorinstallierte „OpenSSL“ und verwenden dies im neu zu erstellenden Script „/scripts/sslcert.sh“ mit folgendem Inhalt:

#!/bin/bash
#Usage: ./sslcert DOMAIN

#Pruefen, ob Suffix angegeben
if [ -z "$1" ] ;then
    echo "So geht das nicht"
    exit 1;
fi

ABLAUF=$(echo QUIT | openssl s_client -host $1 -port 443 -servername $1 2>/dev/null | sed -ne '/BEGIN CERT/,/END CERT/p' | openssl x509 -noout -text | grep After | sed 's/Not After : //g' |sed 's/^[ t]*//')
echo $(( ($(date -d "$ABLAUF" +%s) - $(date +%s)) / 86400 ))

 

Wie gewohnt, ändern wir die Attribute des Scripts durch

chmod +x /scripts/sslcert.sh

, übertragen den Besitz mit

chown openhab: /scripts/sslcert.sh

und rufen es mit folgenden Syntax auf:

/scripts/sslcert.sh DOMAINNAME

 

Beispiel:

Wollen wir die Lebensdauer des Zertifikats von „klenzel.de“ in Tagen ausgeben, verwenden wir folgenden Aufruf:

/scripts/sslcert.sh klenzel.de

 

 

openHAB konfigurieren

openHAB-Bindings aktivieren

Für unsere Zwecke nutzen wir das openHAB-Binding „exec„. Daher installieren wir dieses mittels apt-Paketverwaltung:

apt-get install openhab-addon-binding-exec

 

Zudem nutzen wir das Script „/scripts/ping.sh„, dass in diesem Beitrag ausführlich beschrieben wurde.

 

openHAB-Items konfigurieren

Nachdem wir die für diesen Beitrag wichtigen Scripte erstellt haben, wenden wir uns der Konfiguration von openHAB zu. Zunächst erstellen wir eine Reihe von neuen Items, die unter anderem die Punkte enthalten, die wir überwachen wollen:

Number INET_PING "Ping [%.1f ms]"
Number INET_DOWN "Download [%.1f Mbit/s]"
Number INET_UP "Upload [%.1f Mbit/s]"
String INET_IP "IP-Adresse [%s]"

Switch WST126 "APC Tina" { exec="<[/scripts/ping.sh 192.168.1.126:60000:REGEX((.*?))]" }
Switch WST129 "APC Daniel" { exec="<[/scripts/ping.sh 192.168.1.129:60000:REGEX((.*?))]" }

Switch INET_DNS "DNS-Check [%s]" { exec="<[/scripts/dnscheck.sh 192.168.1.254 klenzel.de:60000:REGEX((.*?))]" }
Switch NH_INET "Internetverbindung" { exec="<[/scripts/ping.sh 8.8.8.8:60000:REGEX((.*?))]" }
Switch NH_VPN "VPN-Verbindung" { exec="<[/scripts/ping.sh 192.168.2.254:60000:REGEX((.*?))]" }
Switch NH_HH "Tunnel Hamburg" { exec="<[/scripts/ping.sh 192.168.254.254:60000:REGEX((.*?))]" }
Switch NH_SIP "Telefonanlage [%s]" { exec="<[/scripts/portcheck.sh 192.168.1.124 5060 u:60000:REGEX((.*?))]" }
Switch NH_WEB "Webserver klenzel.de [%s]" { exec="<[/scripts/portcheck.sh 192.168.1.123 80 t:60000:REGEX((.*?))]" }

Number SSL_KLENZELDE "SSL-Zertifikat klenzel.de [%s]" { exec="<[/scripts/sslcert.sh klenzel.de:60000:REGEX((.*?))]" }

 

Die ersten vier Items werden von einem externen Script befüllt und enthalten Statistiken über die eigene Internetverbindung. Die Umsetzung zeigt dieser Beitrag.

Des Weiteren prüfen wir:

  • zwei Computer auf deren Erreichbarkeit (Zeilen sechs und sieben)
  • unseren eigenen DNS-Server (192.168.1.254), ob dieser die Domain „klenzel.de“ ordnungsgemäß auflösen kann und uns das Ergebnis als Antwort mitteilt
  • unsere Verbindung zum Internet, indem wir eine öffentliche IP im Internet pingen (8.8.8.8, Googles DNS-Server)
  • eine VPN-Verbindung, indem wir mit Ping die Erreichbarkeit des entfernten VPN-Servers auf interner Seite prüfen
  • einen VPN-Standort in Hamburg, indem wir mit Ping die Erreichbarkeit eines internen Rechners innerhalbs des VPN-Standorts Hamburg prüfen
  • eine lokale Telefonanlage, indem wir die Erreichbarkeit des UDP-Ports 5060 (SIP) an der IP-Adresse „192.168.1.124“ prüfen
  • die interne IP eines Webservers
  • die Gültigkeitsdauer des SSL-Zertifikats der Seite „klenzel.de

 

Eine Transform-Map erstellen

Damit uns die Werte „ON“ und „OFF„, die wir als Rückgabewerte unserer Scripte erhalten, in der Sitemap in einer verständlichen Form dargestellt werden, erstellen wir unter „/etc/openhab/configurations/transform/“ eine neue Datei, die wir in diesem Beitrag „nh.map“ nennen:

ON=erreichbar
OFF=nicht erreichbar
undefined=undefiniert
-=undefiniert

 

 

Die Sitemap ergänzen

Die Einbindung der neuen Items in die Sitemap habe ich in zwei Bereiche unterteilt. Im Hauptbereich erscheinen die Items, bei denen aktuell ein Problem vorliegt. In einem anderen, untergeordneten Bereich werden sämtliche Monitoring-Items mit ihrem jeweiligen Zustand aufgeführt.

 

Warnungen in der Hauptansicht

Damit wir bei einem Ausfall eines Dienstes direkt und schnell ersichtlich im Hauptbereich unserer Sitemap informiert werden, erstellen wir an dieser Stelle sogenannte dynamische Einträge:

Frame label="Warnungen" {
    Text item=INET_DNS label="DNS-Server ist [MAP(nh.map):%s]" icon="computer" visibility=[INET_DNS==OFF]
    Text item=NH_INET label="Internetverbindung ist [MAP(nh.map):%s]" icon="computer" visibility=[NH_INET==OFF]
    Text item=NH_VPN label="VPN-Tunnel ist [MAP(nh.map):%s]" icon="computer" visibility=[NH_VPN==OFF]
    Text item=NH_HH label="Standort Hamburg ist [MAP(nh.map):%s]" icon="computer" visibility=[NH_HH==OFF]
    Text item=SSL_KLENZELDE label="Gültigkeit Tage klenzel.de: [%s]" icon="computer" visibility=[SSL_KLENZELDE<=30]
}

 

Die Angabe von „visibility“ führt dazu, dass diese Items nur bei einem zuvor definierten Zustand an dieser Stelle angezeigt werden. Anders ausgedrückt: wenn der hier angegebene Dienst nicht erreichbar ist, erscheint diese Zeile auf der Hauptseite, sonst nicht. Zertifikatswarnungen werden ab einer Gültigkeit von unter 31 Tagen angezeigt.

 

Alle Informationen

An einer anderen Stelle unserer Sitemap lassen wir unsere Monitoring-Items unabhängig vom Zustand anzeigen. Die Einbindung erfolgt an gewünschter Stelle wie folgt:

Frame label="Monitoring" {
    Text label="Internetgeschwindigkeit" icon="gauge" {
        Text item=INET_PING icon="ping"
        Text item=INET_DOWN icon="download"
        Text item=INET_UP icon="upload"
        Text item=INET_IP icon="gauge"
        Switch item=CHART_PERIOD label="Zeitspanne" mappings=[0="Stunde", 1="Tag", 2="Woche"]
        Chart item=INET_PING period=h refresh=300 visibility=[CHART_PERIOD==0, CHART_PERIOD=="Uninitialized"]
        Chart item=INET_PING period=D refresh=1800 visibility=[CHART_PERIOD==1]
        Chart item=INET_PING period=W refresh=3600 visibility=[CHART_PERIOD==2]
        Chart item=INET_DOWN period=h refresh=300 visibility=[CHART_PERIOD==0, CHART_PERIOD=="Uninitialized"]
        Chart item=INET_DOWN period=D refresh=1800 visibility=[CHART_PERIOD==1]
        Chart item=INET_DOWN period=W refresh=3600 visibility=[CHART_PERIOD==2]
        Chart item=INET_UP period=h refresh=300 visibility=[CHART_PERIOD==0, CHART_PERIOD=="Uninitialized"]
        Chart item=INET_UP period=D refresh=1800 visibility=[CHART_PERIOD==1]
        Chart item=INET_UP period=W refresh=3600 visibility=[CHART_PERIOD==2]
    } //Internet Ende
    Text item=WST126 label="APC Tina [MAP(anaus.map):%s]" icon="computer"
    Text item=WST129 label="APC Daniel [MAP(anaus.map):%s]" icon="computer"
    Text item=INET_DNS label="DNS-Server ist [MAP(nh.map):%s]" icon="computer"
    Text item=NH_INET label="Internetverbindung ist [MAP(nh.map):%s]" icon="computer"
    Text item=NH_VPN label="VPN-Tunnel ist [MAP(nh.map):%s]" icon="computer"
    Text item=NH_HH label="Standort Hamburg ist [MAP(nh.map):%s]" icon="computer"
    Text item=NH_SIP label="Telefonanlage ist [MAP(nh.map):%s]" icon="computer"
    Text item=NH_WEB label="Webserver klenzel.de ist [MAP(nh.map):%s]" icon="computer"
    Text item=SSL_KLENZELDE label="Tage gültig klenzel.de [%s]" icon="computer"
} //Monitoring Ende

 

Unser Ergebnis sieht im Browser bzw. in der App in etwa so aus:

nh1

 

 

Ergänzend könnten wir zudem Regeln definieren, die bei einem Ausfall E-Mails versenden. Es ist nur fraglich, ob das beispielsweise beim Ausfall der Internetverbindung Sinn macht.