# Tunnelüberwachung via Script

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

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

</div></div>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:

<div id="bkmrk-local2.%2A-%2Fvar%2Flog%2Ftu"><div>```
local2.*                        /var/log/tunnel.log
```

</div></div>dieser Eintrag ist für syslog-NG

<div id="bkmrk-source-s_sys-%7B-file-"><div>```
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); };
```

</div></div>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:

<div id="bkmrk-%2Fusr%2Flocal%2Fsbin%2Fprob"><div>```
/usr/local/sbin/probe.ipsec 2>&1 >> /dev/null &
```

</div></div>Das Init-Script für Racoon ist hier zu finden: [Roadwarrior-VPN via racoon](https://wiki.magenbrot.net/books/kryptographie/page/ipsec-roadwarrior-vpn-via-racoon "IPSec 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.