IPCop-Forum.de

www.ipcop-forum.de


IPCop-Community
CL-Systems
Home Home   Doku Doku   Links Links   Downloads Downloads
UnIPCop Der (Un)IPCop   IFS IPCop-ForumSpy
CopTime CopTime   Galerie IPCop-Galerie   IPCop Userkarte Userkarte
Aktuelle Zeit: 17.10.2017, 14:56

Alle Zeiten sind UTC+02:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: IPsec-Tunnel remote prüfen
BeitragVerfasst: 02.02.2016, 16:58 
Offline
Constable
Themenstarter
Constable

Registriert: 12.01.2016
Beiträge: 34
Hallo,

Problemstellung ist ein IPcop 2.1.9 mit mehreren IPsec-VPN-Tunnels zu anderen IPcops, der auf Gesundheit dieser Tunnels geprüft werden soll.
Das Resultat soll an einen Nagios-Host übermittelt werden, der sich um Statusanzeige und nötige Alarmsignale kümmert.

Infrastruktur-Ansatz bisher ist

Das Skript enthielt folgende 2 Probleme:
  • Auf unserem IPcop gibts kein Kommando "which", zum Glück aber ein Addon locate (von http://www.cobin.de/binary.php. Daher haben wir sämtliche Vorkommen durch komplette Pfadangaben ersetzt.
  • Außerdem steht im Skript in der Funktion check_connection() in der Zeile:
    Code:
    eroutes=`$IPSECBIN whack --status | grep -e "IPsec SA established" | grep -e "$2" | wc -l`
    ein $2 das wir glauben $1 heißen sollte.

Mit diesen Modifikationen konnten wir das Skript lokal verwenden:
Code:
root@ipcophost $ /var/ipcop/addons/nrpe/plugins/check_ipsec2_mod.sh -c tunnelname
OK - tunnelname Connection is up and running

Leider hat der gleiche Test, vom Nagios-Host ausgeführt, mit derselben Kommandozeile von oben für NRPE als Kommando check_tunnelname definiert, ein anderes Resultat:
Code:
user@nagioshost $ /usr/local/nagios/libexec/check_nrpe -H ipcophost-addr -c check_tunnelname
CRITICAL - tunnelname Connection is down


Das könnte freilich ein Userrechteproblem sein, da das Skript als root ausgeführt wurde, aber der NRPE-daemon als User nagios läuft. Leider gibt's kein su oder sudo in IPcop v2.1.9 (also auch kein /etc/sudoers), und wir kennen auch kein geeignetes Addon.

Andere Kommandos wie check_load funktionieren via NRPE remote einwandfrei.

Der Debug-Modus
Code:
debug=1
in der nrpe.cfg ist an, und in /var/log/messages laufen die Meldungen durch, leider ohne mehr wesentliche Details.

Für den Moment sind wir definitiv am Rätseln, wo's hakt.
--
MfG,
-- United Networking

_________________
Mit freundlichen Grüßen,
-- UniNett


Nach oben
   
 Betreff des Beitrags: Re: IPsec-Tunnel remote prüfen
BeitragVerfasst: 08.02.2016, 12:00 
Offline
IPCop-Entwickler, Site-Moderator, IPCop-Supporter 2006, 2007, 2008 und 2009
IPCop-Entwickler, Site-Moderator, IPCop-Supporter 2006, 2007, 2008 und 2009
Benutzeravatar

Registriert: 26.06.2005
Beiträge: 19149
Wohnort: LDK | Hessen
$2 ist einfach ein Fehler. Hat aber nicht direkt etwas mit IPCop zu tun.

check_nrpe ist so oder so ein Rätsel? Wie soll das was tun?


Rechteprobleme können ggf. umgangen werden in dem du statt
Code:
$IPSECBIN whack --status

folgendes benutzt:
Code:
/usr/local/bin/ipsecctrl --status

_________________
/* Gruß weizen_42 */

Bild
| IPCop Doku | IPCop Galerie | IPCop Uptime | Ärger vermeiden |


Nach oben
   
 Betreff des Beitrags: Re: IPsec-Tunnel remote prüfen
BeitragVerfasst: 09.02.2016, 11:01 
Offline
Constable
Themenstarter
Constable

Registriert: 12.01.2016
Beiträge: 34
Hallo,

leider: Dieses nicht, sondern Nein; auch
Code:
/usr/local/bin/ipsecctrl --status
darf ein non-root-User nicht ausführen, zumindest in IPcop 2.1.9 hier. Auch hat die Ausgabe
Code:
000 192.168.178.161/32:55852 -17-> 192.168.2.103/32:161 => %hold 0    %acquire-netlink
000 192.168.178.161/32:55852 -17-> 192.168.2.112/32:161 => %hold 0    %acquire-netlink
000 192.168.178.161/32:55852 -17-> 192.168.2.109/32:161 => %hold 0    %acquire-netlink
...
leider nichts mit dem Status der VPN-Verbindungen zu tun.

Inzwischen haben wir das aber anders gelöst: Ein Fcrontab-Job tut den "ipsec whack ..."-Teil (als root) und schreibt eine VPN-Status-Liste, die ein modifiziertes check_ipsec3.sh, auch ohne root zu sein, auswerten darf. Läuft.
Details später sobald das install-Skript getestet ist.

_________________
Mit freundlichen Grüßen,
-- UniNett


Nach oben
   
BeitragVerfasst: 17.02.2016, 13:09 
Offline
Constable
Themenstarter
Constable

Registriert: 12.01.2016
Beiträge: 34
Hallo,

zum Rätsel check_nrpe: Das ganze System NRPE ist aufgebaut wie folgt:
Code:
Nagios-Host                                               IPcop
Nagios <-> check_nrpe <-|===LAN===|-> NRPE(Port5666) <-> lokales_check_kommando

In diesem Fall ist das lokale Check-Kommando
Code:
/usr/sbin/ipsec whack --status | grep -e "IPsec SA established" | grep -e "newest IPSEC"|grep "Verbindungsname"
was root-Rechte erfordert.

Da NRPE als User nagios läuft, war unsere Lösung, wie schon gesagt, die Auslagerung dieser Zeile - ohne das letzte grep, aber mit Dateiausgabe - in die fcrontab.

Im Ganzen:
install
Code:
#!/bin/bash
# ipcop addon binary installer Ver 0.9b for IPCop 2.0
# check_ipsec installer v0.34

CMD="$1"

# clear screen
/usr/bin/tput clear

# check
if [ ! -e /usr/lib/ipcop/library.sh ]; then
    echo "Upgrade your IPCop, library.sh is missing"
    exit 1
fi

. /usr/lib/ipcop/library.sh

# error handling
err()
{
        echo " "
        echo "Error : $1 "
        echo " "
        echo "Choose your option:"
        echo " "
        echo "./install -i   ---> to install"
        echo "./install -u   ---> to uninstall"
        echo " "
exit;exit;
}

# installation
ai()
{
   # check for NRPE
   if [ ! -e /var/ipcop/addons/nrpe/nrpe ]; then
      echo "NRPE is missing, won't install'"
      exit 1
   fi

   if [ ! -e ipsec_gateways.txt]; then
      echo "Please edit ipsec_gateways_sample.txt (and remove _sample from its name) first."
      exit 1
   fi

   if [ ! -e check_vpn_commands.txt]; then
      echo "Please edit check_vpn_commands_sample.txt (and remove _sample from its name) first."
      exit 1
   fi

   # prepare files
   chmod +x check_ipsec3.sh
   chmod u+x vpn_savestates.sh
   chmod u+x install
   
   # copy files
   echo ... writing /usr/local/bin/vpn_savestates.sh
   cp vpn_savestates.sh /usr/local/bin
   echo ... writing /var/ipcop/addons/nrpe/plugins/check_ipsec3.sh
   cp check_ipsec3.sh /var/ipcop/addons/nrpe/plugins
   echo ... writing /etc/ipsec_gateways.txt
   cp ipsec_gateways.txt /etc

   # add check_vpn_* commands to nrpe.cfg
   echo ...adding check_vpn commands to NRPE
   cat check_vpn_commands.txt >> /var/ipcop/addons/nrpe/nrpe.cfg

   # make fcrontab entry
   echo ...creating fcron job
   (fcrontab -l; echo "*/5 * * * *   /usr/local/bin/vpn_savestates.sh" ) | fcrontab -
}

# deinstallation
au()
{
   # remove fcrontab entry
   echo ...removing fcron job
   (fcrontab -l| grep -v "vpn_savestates.sh" ) | fcrontab -

   # remove check_vpn_* commands from nrpe.cfg
   echo ...removing check_vpn_* commands from NRPE
   grep -v check_vpn_ /var/ipcop/addons/nrpe/nrpe.cfg > /var/ipcop/addons/nrpe/nrpe.cfg_without
   mv /var/ipcop/addons/nrpe/nrpe.cfg_without /var/ipcop/addons/nrpe/nrpe.cfg

   # remove files
   for i in \
    "/usr/local/bin/vpn_savestates.sh"\
    "/var/ipcop/addons/nrpe/plugins/check_ipsec3.sh"\
    "/etc/ipsec_gateways.txt"\
    "/var/log/vpn-states"
   do
      if [ -e $i ]; then
         echo ...removing $i
         rm $i
      fi
   done
}


case $CMD in
         -i|i|install)
                echo " "
                echo "Installing now ..."
                ai
                echo "Successfully done!"
                echo " ";;

        -u|u|uninstall)
                echo " "
                echo "Deinstalling now ..."
                au
                echo "Successfully done!"
                echo " ";;
        *)
        err "Invalid Option";;
esac
sync
#end of file


vpn_savestates.sh
Code:
#!/bin/bash
#set -x
#   Save the IPSEC VPN states in a file
#   so that non-root user may read it (like nagios with NRPE)
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# Based partially on the work done by By Nicole in the check_ipsec script
# Based partially on the work done by By Charles Williams in the check_ipsec2 script
#
# Split off the ipsec whack ... to run from fcrontab, by Wolf Lichtenberger
# ------------Defining Variables------------
REVISION="0.11"
IPSECBIN="/usr/sbin/ipsec"
VPNSTATEFILE="/var/log/vpn-states"
EGREPBIN="/bin/egrep"
GREPBIN="/bin/grep"

AUTHOR="Copyright 2016, Wolf Lichtenberger (wl@united-networking.eu) (http://www.united-networking.eu)"

# states from NRPE utils.sh
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

test -e $IPSECBIN
if [ $? -ne 0 ];
then
    logger CRITICAL - $IPSECBIN not exist
    exit $STATE_CRITICAL
else
    STRONG=`$IPSECBIN --version |grep strongSwan | wc -l`
fi

if [[ "$STRONG" -eq "1" ]]
then
    $IPSECBIN status | $EGREPBIN -e "INSTALLED, |IPsec SA established" > $VPNSTATEFILE
else
    $IPSECBIN whack --status | $GREPBIN -e "IPsec SA established" | $GREPBIN -e "newest IPSEC" > $VPNSTATEFILE
fi

check_ipsec3.sh
Code:
#!/bin/bash
#set -x
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# Based partially on the work done by By Nicole in the check_ipsec script
# Based partially on the work done by By Charles Williams in the check_ipsec2 script
#
# Plugin Name: check_ipsec3
# Version: see REVISION below
# Date: 17/02/2016
#
# Usage: check_ipsec3 --a <n>
#        check_ipsec3 --c <tunnel name>
#
# ipsec_gateways.txt file must be located in /etc directory
# and has to look like:
# nameofconn1   192.168.0.1
# nameofconn2   192.168.1.1
#
# ------------Defining Variables------------
PROGNAME=`basename $0`
PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
REVISION="0.12"
GATEWAYLIST="/etc/ipsec_gateways.txt"
VPNSTATEFILE="/var/log/vpn-states"
DOWN=""
AWKBIN="/usr/bin/awk"
EGREPBIN="/bin/egrep"
FPINGBIN="/bin/ping"
FPINGOPT="-c 1"
GREPBIN="/bin/grep"
WCBIN="/usr/bin/wc"
PINGIP=0

AUTHOR="Copyleft 2016, Wolf Lichtenberger (wl@united-networking.eu) (http://www.united-networking.eu)"

missing="O"

. $PROGPATH/utils.sh

print_version() {
    echo "$REVISION $AUTHOR"
}

print_usage() {
        echo "Usage:"
        echo " $PROGNAME [-hprsv] [-a number of connections] [-c IPSEC connection name]"
   echo "           -a <number of configured tunnels> (Check all connections)"
        echo "           -c <name of connection> (Check specific connection)"
   echo "           -p (Ping remote gateway. Used only with -c)"
   echo "           -r (Restart IPSEC if down)"
        echo "           -s (Reacquire SA for connection. Used only with both -c and -p)"
        echo "           -h (Show this help screen)"
        echo "           -v (Show version)"
   echo
   echo "-a and -c cannot be used together. -s can only be used with -c."
   echo "-p can only be used with -c."
      echo ""
}

print_help() {
        print_revision $PROGNAME $REVISION
        echo ""
        print_usage
        echo ""
}

if [ $# -eq 0 ];
then
   print_help
   exit $STATE_UNKNOWN
fi

test -e $VPNSTATEFILE
if [ $? -ne 0 ];
then
   echo CRITICAL - $VPNSTATEFILE not exist
   exit $STATE_CRITICAL
fi

check_all() {
   eroutes=`cat $VPNSTATEFILE | wc -l`

        #if [[ "$PINGIP" -eq "1" ]]
        #then
        #        ping_gateway $1
        #fi

   if [[ "$eroutes" -eq "$1" ]]
   then
      echo "OK - All $1 tunnels are up and running"
      exit $STATE_OK
   elif [[ "$eroutes" -gt "$1" ]]
   then
      echo "WARNING - More than $1 ($eroutes) tunnels are up and running"
                exit $STATE_WARNING
   else
      echo "CRITICAL - Only $eroutes tunnels from $1 are up and running."
      exit $STATE_CRITICAL
   fi
}

check_connection() {
   # look exactly for double-quoted connection name
   eroutes=`cat $VPNSTATEFILE | grep -e \"$1\" | wc -l`

   if [[ "$PINGIP" -eq "1" ]]
   then
      ping_gateway $1
   fi

   if [[ "$eroutes" -eq "1" ]]
   then
      echo "OK - $1 Connection is up and running"
      exit $STATE_OK
   else
      if [[ "$REACQUIRE" -eq "1" ]]; then
         reacquire_sa $1
      elif [[ "$RESTART" -eq "1" ]]; then
         restart_ipsec
      else
         echo "CRITICAL - $1 Connection is down"
         exit $STATE_CRITICAL
      fi
   fi
}

ping_gateway() {
        GATEWAYIP=`$GREPBIN $1 $GATEWAYLIST| $AWKBIN '{print $2}'`
        PING=`$FPINGBIN $GATEWAYIP $FPINGOPT | $GREPBIN alive | $WCBIN -l`

        if [[ "$PING" -eq "0" ]]
        then
                if [[ "$REACQUIRE" -eq "1" ]]; then
                        reacquire_sa $1
                else
                   echo "CRITICAL - $1 is down (no ping)"
         exit $STATE_CRITICAL
      fi
        fi
}

restart_ipsec() {
   RETURN=`$IPSECBIN restart`
   echo "WARNING - IPSEC being restarted"
   exit $STATE_WARNING
}

reacquire_sa() {
   RETURN=`$IPSECBIN down $1; $IPSECBIN up $1`
   echo "WARNING - Connection $1 SA Updating"
   exit $STATE_WARNING
}

NUMCONN=""
CONNAME=""
CHECKALL=0
CHECKCON=0

while getopts ":a:c:prshv" opt; do
   case $opt in
      h)
              print_help
              exit $STATE_OK
              ;;
      v)
              print_revision $PLUGIN $REVISION
              exit $STATE_OK
              ;;
      a)
         NUMCONN=$OPTARG
         CHECKALL=1
         ;;
      c)
         CONNAME=$OPTARG
         CHECKCON=1
         ;;
      p)
         PINGIP=1
         ;;
      r)
         RESTART=1
         ;;
      s)
         REACQUIRE=1
         ;;
      :)
         echo "Option -$OPTARG requires an arguement." >&2
         print_help
         exit $STATE_OK
         ;;
      \?)
              print_help
              exit $STATE_OK
         ;;
   esac
done

if [ $PINGIP -eq 1 ]
then
        test -e $GATEWAYLIST
        if [ $? -ne 0 ];
        then
           echo CRITICAL - $GATEWAYLIST does not exist
           exit $STATE_CRITICAL
        fi

        test -e $FPINGBIN
        if [ $? -ne 0 ];
        then
                echo CRITICAL - $FPINGBIN not installed or not found
                exit $STATE_CRITICAL
        fi
fi

if [[ ( $CONNAME = "" && $NUMCONN = "" ) || ( $CONNAME != "" && $NUMCONN != "" ) ]]; then
   print_help
        exit $STATE_OK
fi

if [ $CHECKCON -eq 1 ]; then
   check_connection $CONNAME
else
   check_all $NUMCONN
fi

ipsec_gateways_sample.txt
Code:
Verbindungsname1   192.168.10.1
Verbindungsname2   192.168.20.1

check_vpn_commands_sample.txt
Code:
command[check_vpn_all]=/var/ipcop/addons/nrpe/plugins/check_ipsec3.sh -a 2
command[check_vpn_V1]=/var/ipcop/addons/nrpe/plugins/check_ipsec3.sh -c Verbindungsname1
command[check_vpn_V2]=/var/ipcop/addons/nrpe/plugins/check_ipsec3.sh -c Verbindungsname2

Dies alles in ein Unterverzeichnis und dieses in ein .tar.gz-Archiv gepackt bildet das Skript-Plugin Check_ipsec3. Am Ziel-IPcop auspacken und im Unterverzeichnis
Code:
. ./install -i
ausführen installiert das Ganze, sofern NRPE schon vorhanden ist.

Viel Erfolg!

_________________
Mit freundlichen Grüßen,
-- UniNett


Nach oben
   
 Betreff des Beitrags: Re: IPsec-Tunnel remote prüfen
BeitragVerfasst: 17.02.2016, 13:18 
Offline
Constable
Themenstarter
Constable

Registriert: 12.01.2016
Beiträge: 34
Hallo,

die Nagios-Seite fehlt ja noch:

Man braucht zB
  • einen Service VPN_Verbindungsname1 mit check_nrpe_1arg und dem ARG1 check_vpn_V1
  • analog für Verbindungsname2
  • optional eine Servicegroup mit diesen 2 Services
  • Hostgroups Mit_Verbindungsname1 und Mit_Verbindungsname2
  • Hosts mit diesen VPNs in die jeweilige Hostgroup aufnehmen

Viel Erfolg!

_________________
Mit freundlichen Grüßen,
-- UniNett


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC+02:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu Forum:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de