Disfunctions.de

Das Blog der gnadenlosen Fehlfunktionen!

Munin SSH Tunnel „offen“ halten

Erstellt von Matthias am Montag 16. September 2013

Munin Logo

Ich betreiebe seit kurzem auf meinem Raspberry Pi Munin als Monitoring Tool für verschiedene Dienste auf einem Server, zum Überwachen der lokalen Fritzbox und manch anderes. Da der Raspberry Pi hinter einer DSL Leitung sitzt wechselt hier die IP Adresse häufig. Hinzu kommt noch, dass nur eine native IPv6 Adresse ankommt, welche spätestens alle 24h wechselt und die IPv4 Adresse nur über NAT zur Verfügung steht. Der Raspberry Pi fungiert als Munin Master und soll einen Munin Node auf einem dedizierten Server abfragen. Dabei will man ungern im Node alle IP Adressbereiche freigeben, die auf diesen zugreifen sollen. Stattdessen ist es hier am Einfachsten, wenn man einen SSH Tunnel vom Raspberry Pi zum Server aufbaut und Munin dann quasi lokal die Daten abfragt. Dies hat den Vorteil, dass man nur localhost als abfragende Instanz auf dem Munin Node zulassen muss und sonst keine externen IPs.

Einen SSH Tunnel kann man mit folgendem Befehl aufbauen:



ssh -NfL 5005:localhost:4949 USER@HOST


Ein Munin Node ist standardmäßig immer auf Port 4949 erreichbar, zusätzlich wird ein lokaler Port (auf dem Raspberry Pi) benötigt, dieser muss vorher unbenutzt sein und kann willkürlich gewählt werden, hier „5005“. Dahinter wird wie bei einer normalen SSH Verbindung der Benutzer und der entfernte Rechner angegeben. Die Option „-N“ verhindert, dass die Session auch in der Shell aufgemacht wird, wir wollen an dieser Stelle ja lediglich die Portweiterleitung nutzen. Allgemein wird in diesem Artikel davon ausgegangen, dass die Authentifizierung des Nutzers mittels Public Key geschieht.

Der Tunnel funktioniert solange wunderbar bis er, aus welchem Grund auch immer, die Verbindung nicht mehr halten kann. Dies kann z.B. durch die Zwangstrennung des Providers geschehen. Anschließend kann Munin keine aktuellen Daten mehr abfragen, bis der Tunnel wieder geöffnet wurde. Dies kann mit folgendem kleinen Skript automatisiert werden. Es basiert auf einem Blogpost von hier, wurde aber an entscheidender Stelle überarbeitet.


#!/bin/bash
#Usage: ./checktunnel "host name" "ip address" "port" ["ssh options"]
#======================================================================
PORT=$3
ADDRESS=$2
HOST=$1
if [ "`nc -w1 localhost $PORT`" == "# munin node at $HOST" ]; then
echo "$(date) tunnel to $HOST ($ADDRESS:$PORT) is up"
else
echo "$(date) SSH tunnel ${HOST} NOT alive ... Restarting ..."
logger -p daemon.notice "SSH tunnel ${HOST} NOT alive ... Restarting ..."
killall ssh
echo "$(date) ssh -NfL $PORT:localhost:4949 $4 USER@$HOST"
ssh -NfL $PORT:localhost:4949 $4 USER@$HOST
sleep 1
fi

Dieses kann einfach als „~/checktunnel“ abgespeichert werden und mit einem Eintrag in den Cronjobs automatisch ausgeführt werden.


crontab -e

*/5 * * * * ~/checktunnel hostname XX.XXX.XXX.XXX 5005

An dieser Stelle muss der Hostname und die IP-Adresse entsprechend angepasst werden. Ich habe die Ausführung des Skriptes alle 5 Minuten eingestellt, damit Munin möglichst keine Daten verliert, wenn der Tunnel nicht mehr vorhanden ist.
Das Skript fragt am Anfang ab, ob der Munin Node erreichbar ist und entsprechend „# munin node at $HOST“ zurückgibt. Ist dies der Fall, funktioniert der Tunnel noch. Falls nicht, wird eine entsprechende Meldung ausgegeben und ssh beendet (um den Port frei zugeben) und anschließend ein neuer Tunnel aufgebaut. Wem Die entstehenden Mails zu viel sind, kann die Zeilen mit „echo“ auskommentieren oder hinter den Eintrag im Crontab noch “ >> /var/log/checktunnel.log“ anhängen. Dadurch werden die Meldungen in ein eigenes Logfile geschrieben.

Ich habe verschiedene Ansätze durch probiert und bin schließlich hierbei gelandet, das Skript funktioniert für mich sehr gut, da es in dieser Variante insbesondere wirklich eine Antwort vom Munin Node erwartet und nicht nur das vorhanden sein eines lokalen Ports testet. Getestet habe ich es mit Raspbian (2013-09-10) auf dem Raspberry Pi und Ubuntu 12.04 Server auf dem dedizierten Server mit dem Munin Node. Jeweils mit den aktuellen Munin Versionen aus den Paketquellen.
Alternativ kann man auch autossh oder ähnliches ausprobieren.

Kommentar schreiben

XHTML: Sie können diese Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>