Skip to main content

Tunnelüberwachung via Script

Mit dem folgenden Script lässt sich bequem ein Tunnel überwachen und ggf. automatisch neu starten:

#!/bin/bash
# keepalive for ipsec
# quick'n'dirty hack
 
# Check darf 3x fehlschlagen, dann wird der Tunnel neu gestartet
failmax=3
 
# Check alle 10 Sekunden durchführen
keepalive=10
 
# eine interne IP der Gegenseite eintragen
CHECKIP="192.168.10.10"
 
# hier den Tunnelnamen eintragen
CHECKNAME="Aussenstelle1"
 
# don not edit anything beyond this point!
###########################################################
 
fail=0
 
MESSAGE=""
 
while (true); do
        # Achtung: der Ping-Befehl hat nicht in allen Versionen die -I Option (von welchem Device/IP aus soll der Ping kommen)
        # als -I eth0 das Interface mit der internen IP eintragen
        if ping -w 2 -c 1 -s 1 -I eth0 $CHECKIP 2>&1 > /dev/null;
        then
                MESSAGE="Tunnel $CHECKNAME OK (check $RANDOM)"
                logger -p local2.info -t TUNNEL "$MESSAGE"
                fail=0
        else
                fail=`echo $fail+1|bc`
                MESSAGE="Tunnel $CHECKNAME DOWN: $fail (check $RANDOM)"
                logger -p local2.info -t TUNNEL "$MESSAGE"
        fi
 
        if [ $fail -gt $failmax ] ;
        then
                MESSAGE="Maxfail ($failmax) reached: restarting Tunnel $CHECKNAME (check $RANDOM)"
                logger -p local2.info -t TUNNEL "$MESSAGE"
 
                # Fehler, Tunnel stoppen:
                # wenn als Software Racoon zum Einsatz kommt:
                /etc/init.d/racoon stop
                # das hier bei OpenSwan einkommentieren und obiges raus (CHECKNAME muss mit dem Tunnelnamen in der ipsec.conf übereinstimmen)
                #ipsec auto --down $CHECKNAME
                sleep 5
 
                # jetzt den Tunnel wieder starten:
                # wenn als Software Racoon zum Einsatz kommt:
                /etc/init.d/racoon start
                # das hier bei OpenSwan einkommentieren und obiges raus (CHECKNAME muss mit dem Tunnelnamen in der ipsec.conf übereinstimmen)
                #ipsec auto --up $CHECKNAME
                sleep 120
                fail=0
        fi
        sleep $keepalive
done

das (check $RANDOM) ist als Workaround für Syslog gedacht, dort würden sonst massig „last message repeatet xx times“ auftauchen.

das Script loggt in die Syslog-Facility local2. Folgender Eintrag ist für syslog vorzunehmen, um nach /var/log/tunnel.log zu loggen:

local2.*                        /var/log/tunnel.log

dieser Eintrag ist für syslog-NG

source s_sys {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream("/dev/log");
    udp(ip(0.0.0.0) port(514));
    internal();
};

# /var/log/tunnel.log
filter f_tunnel { facility(local2); };
destination d_tunnel { file("/var/log/tunnel.log"); };
log { source(s_sys); filter(f_tunnel); destination(d_tunnel); };

es kann natürlich auch jede andere Facility verwendet werden.

um das Script bei Reboot automatisch wieder zu starten folgenden Eintrag in /etc/rc.local vornehmen:

/usr/local/sbin/probe.ipsec 2>&1 >> /dev/null &

Das Init-Script für Racoon ist hier zu finden: Roadwarrior-VPN via racoon

Das Script ist für Racoon in dieser Form leider nicht optimal, da alle bestehenden Tunnel gekillt werden. Das Script ist nur sinnvoll für ein Gateway mit nur einem Tunnel.