Publié le: 2014-02-27

OpenBGPd (fr)

BGP est un protocole très sensible. Il convient de le monitorer finement afin de pouvoir être certain de tous ses états.

Afin de pouvoir monitorer efficacement vos processus bgpd, voici quelques sondes NRPE qui peuvent être intéressantes.

Prérequis

Afin de pouvoir monitorer correctement bgpd, nous autoriserons l’utilisateur nrpe à utiliser la commande bgpctl. Il faut ajouter la ligne suivante dans /etc/sudoers

_nrpe ALL=(ALL) NOPASSWD: /usr/sbin/bgpctl

Vérification du processus

Cette sonde vérifie que le processus tourne bien et qu’il écoute en IPv4 et en IPv6

#! /bin/sh
#states
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

SERVICEON=$(ps aux|grep bgpd|wc -l| awk '{print $1}')
if [ "$SERVICEON" -lt 3 ];
then
        echo "Le service BGPv4 est hors ligne"
        return $STATE_CRITICAL;
else
        LISTENV4=$(netstat -anfinet|grep tcp|grep LISTEN|grep 179|wc -l|awk '{print $1}')
        LISTENV6=$(netstat -anfinet6|grep tcp|grep LISTEN|grep 179|wc -l|awk '{print $1}')
        if [ $LISTENV4 -lt 1 ];
        then
                echo "Le service BGPv4 n'écoute pas en IPv4 !"
                return $STATE_CRITICAL
        fi
        if [ $LISTENV6 -lt 1 ];
        then
                echo "Le service BGPv4 n'écoute pas en IPv6 !"
                return $STATE_CRITICAL
        fi
        echo "Service BGPv4 en ligne"
        return $STATE_OK
fi

Vérification de l’état des neighbors BGP

Cette sonde va regarder l’ensemble des neighbors BGP référencés et leurs états. Si le statut BGP est Established, alors la sonde considère que tout va bien. Cette sonde vérifie à la fois IPv4 et IPv6 et compte également le nombre de neighbors

#! /bin/sh
#states
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

NEIGHBORS_V4=$(sudo bgpctl sh nei|grep neigh |awk '{print $4}'|grep "\."|sed 's/,//')
NEIGHBORS_V6=$(sudo bgpctl sh nei|grep neigh |awk '{print $4}'|grep ":"|sed 's/,//')

NB_V4_NEIGHBOR=0
NB_V6_NEIGHBOR=0

for NEI in $NEIGHBORS_V4
do
        BGPSTATE=$(sudo bgpctl sh nei $NEI|grep "BGP state"|awk '{print $4}'|sed 's/,//')
        if [ "$BGPSTATE" == "Established" ];
        then
                NB_V4_NEIGHBOR=$(($NB_V4_NEIGHBOR+1))
        fi
done

for NEI in $NEIGHBORS_V6
do
        BGPSTATE=$(sudo bgpctl sh nei $NEI|grep "BGP state"|awk '{print $4}'|sed 's/,//')
        if [ "$BGPSTATE" == "Established" ];
        then
                NB_V6_NEIGHBOR=$(($NB_V6_NEIGHBOR+1))
        fi
done

if [ $NB_V4_NEIGHBOR -lt 1 ];
then
        echo "Aucun neighbor IPv4 disponible ! Routage BGP IPv4 inopérant"
else
        echo $NB_V4_NEIGHBOR" neighbor(s) IPv4 en ligne"
fi

if [ $NB_V6_NEIGHBOR -lt 1 ];
then
        echo "Aucun neighbor IPv6 disponible ! Routage BGP IPv6 inopérant"
else
        echo $NB_V6_NEIGHBOR" neighbor(s) IPv6 en ligne"
fi

if [ $NB_V4_NEIGHBOR -lt 1 ] || [ $NB_V6_NEIGHBOR -lt 1 ];
then
        return $STATE_CRITICAL
else
        return $STATE_OK
fi

Vérification de la collecte de routes

Ce script vérifie que des routes IPv4 et IPv6 sont collectées. Il vérifie également la présence d’une route par défaut.

#! /bin/sh
#states
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

ROUTES_V4=$(sudo bgpctl sh rib|grep "^*>"|awk '{print $2}'|grep "\.")
ROUTES_V6=$(sudo bgpctl sh rib|grep "^*>"|awk '{print $2}'|grep ":")
DEFROUTE_V4=0
DEFROUTE_V6=0

NB_V4_ROUTES=0
NB_V6_ROUTES=0

OUTPUT=""

for RT in $ROUTES_V4
do
        if [ "$RT" == "0.0.0.0/0" ];
        then
                DEFROUTE_V4=1
        fi
        NB_V4_ROUTES=$(($NB_V4_ROUTES+1))
done

for RT in $ROUTES_V6
do
        if [ "$RT" == "::/0" ];
        then
                DEFROUTE_V6=1
        fi
        NB_V6_ROUTES=$(($NB_V6_ROUTES+1))
done

if [ $NB_V4_ROUTES -lt 1 ];
then
        OUTPUT="Aucune route IPv4 disponible ! Routage IPv4 inopérant"
else
        OUTPUT=""$NB_V4_ROUTES" route(s) IPv4 apprises"
fi

if [ $NB_V6_ROUTES -lt 1 ];
then
        OUTPUT=$OUTPUT", Aucune route IPv6 disponible ! Routage IPv6 inopérant"
else
        OUTPUT=$OUTPUT", "$NB_V6_ROUTES" route(s) IPv6 apprises"
fi

if [ $NB_V4_ROUTES -lt 1 ] || [ $NB_V6_ROUTES -lt 1 ];
then
        echo $OUTPUT
        return $STATE_CRITICAL
else
        if [ $DEFROUTE_V4 != 1 ];
        then
                OUTPUT=$OUTPUT", mais aucune route par defaut IPv4 !"
                echo $OUTPUT
                return $STATE_WARNING
        fi
        if [ $DEFROUTE_V6 != 1 ];
        then
                OUTPUT=$OUTPUT", mais aucune route par defaut IPv6 !"
                echo $OUTPUT
                return $STATE_WARNING
        fi
        echo $OUTPUT
        return $STATE_OK
fi