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.
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
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
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
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