Surveiller les interfaces de son Cisco avec Nagios

Date: 5/01/2009 | Catégories: Open-source,Reseau | Tags: ,,

Qui veut surveiller l'état des interfaces de ses routeurs Cisco doit obligatoirement se plonger dans l'arborescence des MIB SNMP. Heureusement, Patrick Proy a eu la bonne idée d'intégrer dans un seul et même script Perl toutes les fonctions pour répondre à ce besoin.

Nous allons dans ce billet voir comment installer et tester le plugin check_snmp_int.pl puis configurer Nagios pour prendre en compte ce nouveau plugin.

Installation du plugin

Il faut dans un premier temps se rendre dans le répertoire ou les plugin Nagios sont stockés (/usr/local/libexec/nagios par exemple) puis y télécharger la dernière version du plugin (1.4.8 au moment de l'écriture de ce billet):

cd /usr/local/libexec/nagios
wget http://nagios.manubulon.com/check_snmp_int.pl

Ensuite on le rend executable par Nagios:

chown nagios:nagios check_snmp_int.pl
chmod 555 check_snmp_int.pl

Enfin on vérifie que l'utilisateur Nagios (ou celui qui doit lancer Nagios) peut exécuter ce script:

su - nagios
nagios> /usr/local/libexec/nagios/check_snmp_int.pl -h
... la syntaxe va s'afficher ...
nagios> exit

Si vous avez une erreur lors de l'éxécution du script, cela peut être dû à l'absence des pré-requis suivants sur votre système:

  • Perl doit être installé dans le répertoire /usr/bin/perl
  • La librairie Perl nommée Net::SNMP doit être installé (via CPAN)
  • Le fichier 'utils.pm doit être présent dans le répertoire des plugins Nagios

Test du plugin

Nous allons dans un premier temps chercher la liste des interfaces réseau du routeur Cisco (ou autre compatible avec MIB-2 standard) à superviser:

/usr/local/libexec/nagios/check_snmp_int.pl -H <adresseIPdurouteur> -C public -n zzzz -v
Alarm at 15 + 5
SNMP v1 login
Filter : zzzz
OID : 1.3.6.1.2.1.2.2.1.2.26, Desc : Async54
OID : 1.3.6.1.2.1.2.2.1.2.28, Desc : Async56
OID : 1.3.6.1.2.1.2.2.1.2.18, Desc : Async46
OID : 1.3.6.1.2.1.2.2.1.2.12, Desc : Async40
OID : 1.3.6.1.2.1.2.2.1.2.31, Desc : Async59
OID : 1.3.6.1.2.1.2.2.1.2.19, Desc : Async47
OID : 1.3.6.1.2.1.2.2.1.2.22, Desc : Async50
OID : 1.3.6.1.2.1.2.2.1.2.34, Desc : Async62
OID : 1.3.6.1.2.1.2.2.1.2.13, Desc : Async41
OID : 1.3.6.1.2.1.2.2.1.2.23, Desc : Async51
OID : 1.3.6.1.2.1.2.2.1.2.4, Desc : Null0
OID : 1.3.6.1.2.1.2.2.1.2.35, Desc : Loopback0
OID : 1.3.6.1.2.1.2.2.1.2.30, Desc : Async58
OID : 1.3.6.1.2.1.2.2.1.2.5, Desc : Async33
OID : 1.3.6.1.2.1.2.2.1.2.11, Desc : Async39
OID : 1.3.6.1.2.1.2.2.1.2.1, Desc : Ethernet3/0
OID : 1.3.6.1.2.1.2.2.1.2.39, Desc : Virtual-Access2
OID : 1.3.6.1.2.1.2.2.1.2.14, Desc : Async42
OID : 1.3.6.1.2.1.2.2.1.2.37, Desc : Virtual-Template1
OID : 1.3.6.1.2.1.2.2.1.2.16, Desc : Async44
OID : 1.3.6.1.2.1.2.2.1.2.20, Desc : Async48
OID : 1.3.6.1.2.1.2.2.1.2.17, Desc : Async45
OID : 1.3.6.1.2.1.2.2.1.2.29, Desc : Async57
OID : 1.3.6.1.2.1.2.2.1.2.36, Desc : Tunnel0
OID : 1.3.6.1.2.1.2.2.1.2.3, Desc : Serial3/1
OID : 1.3.6.1.2.1.2.2.1.2.25, Desc : Async53
OID : 1.3.6.1.2.1.2.2.1.2.2, Desc : Serial3/0
OID : 1.3.6.1.2.1.2.2.1.2.7, Desc : Async35
OID : 1.3.6.1.2.1.2.2.1.2.33, Desc : Async61
OID : 1.3.6.1.2.1.2.2.1.2.9, Desc : Async37
OID : 1.3.6.1.2.1.2.2.1.2.6, Desc : Async34
OID : 1.3.6.1.2.1.2.2.1.2.15, Desc : Async43
OID : 1.3.6.1.2.1.2.2.1.2.10, Desc : Async38
OID : 1.3.6.1.2.1.2.2.1.2.27, Desc : Async55
OID : 1.3.6.1.2.1.2.2.1.2.32, Desc : Async60
OID : 1.3.6.1.2.1.2.2.1.2.8, Desc : Async36
OID : 1.3.6.1.2.1.2.2.1.2.21, Desc : Async49
OID : 1.3.6.1.2.1.2.2.1.2.24, Desc : Async52

Il faut ensuite noter le nom système des interfaces à surveiller (par exemple Serial 3/0 et Serial 3/1 dans mon cas).

Puis on lance ensuite la commande pour vérifier l'état de l'interface Serial 3/0:

/usr/local/libexec/nagios/check_snmp_int.pl -H <adresseIPdurouteur> -C public -n "Serial3/0" -r
Serial3/0:UP:1 UP: OK

On a donc maintenant la commande à éxécuter, il ne reste plus qu'a l'intégrer dans notre configuration de Nagios.

Configuration de Nagios

On commence par se rednre dans le répertoire ou se trouve les fichiers de configuration de Nagios (/usr/local/etc/nagios par exemple):

cd /usr/local/etc/nagios

Puis si vous êtes sous Nagios 3.x ou supérieur dans le sous-répertoire objects:

cd objects

Enfin on édite le fichier commands.cfg puis on y ajoute la section suivante:

###################
# check_snmp_int.pl
###################

# 'check_snmp_int.pl', vérifier l'état de l'interface reseau
define command{
command_name    check_snmp_int
command_line    $USER1$/check_snmp_int.pl -H $HOSTADDRESS$ -C $ARG1$ -n $ARG2$ -r
}

On vient donc de créer une nouvelle commande Nagios qui appelera le plugin check_snmp_int avec deux paramètres:

  • $ARG1$: nom de la communauté SNMP à utiliser (public la plupart du temps)
  • $ARG2$: nom de l'interface à superviser

Enfin , on ajoute un nouveau service pour le routeur Cisco à superviser (par exemple dans le fichier network.cfg):

define host{
use             routeur
host_name       cisco
alias           Routeur liaison WAN
address         <adresseIProuteurcisco>
}
define service{
use                     generic-service
host_name               cisco
service_description     LS 1
check_command           check_snmp_int!public!"Serial3/0"
}

Et si en plus je veux...

...surveiller la bande passante utilisée et envoyer une alerte si celle-ci dépasse un certain seuil ? Aller Noël n'est pas si loin...

Il suffit de créer une nouvelle commande Nagios et d'utiliser l'option -k du plugin. Par exemple pour surveiller un interface Serial3/0 et emmettre une alerte de warning si  débit dépasse 1.6 Mbps puis une alerte critique si ce dernier passe la barre des 1.9 Mbps ?

/usr/local/libexec/nagios/check_snmp_int.pl -H <adresseIPdurouteur> -C public -n "Serial3/0" -k -w 1600,1600 -c 1900,1900

Je vous laisse convertir cette commande système vers une commande Nagios, cela vous fera un bon exercice 😉

  • Merci pour cet article très instructif, et dire que je m’enquiquinais avec smnpwalk pour trouver les OIDs 🙂
    Cependant pour ce type de controle je verrais plutot l’envoi d’un snmp intercepté par une commande externe de Nagios. Dailleurs en fouillant sur le Net je suis tombé la-dessus http://xavier.dusart.free.fr/nagios/snmptraps.html ça peut peut-être t’intéresser.

  • @tous: juste pour vous signaler l’ouverture du forum de Nicolargo ou vous pouvez poser vos questions !

    http://forum.nicolargo.com

    A bientôt !

    Nicolargo

  • Boby

    Bonjour, lorsque je tape la commande /usr/local/nagios/libexec/check_snmp_int.pl -h j’obtiens l’erreur suivante :

    nagios@xxxxx:~$ /usr/local/nagios/libexec/check_snmp_int.pl -h
    Can’t locate Net/SNMP.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at /usr/local/nagios/libexec/check_snmp_int.pl line 16.
    BEGIN failed–compilation aborted at /usr/local/nagios/libexec/check_snmp_int.pl line 16.

    J’ai pourtant installé Net::SNMP mais je l’ai peut être mal fait, je ne suis pas un specialiste de CPAN

  • Boby

    Bonjour, j’ai trouvé la solution :

    Mon installation de Net:SNMP était incorrecte, il faut bien taper les commandes suivantes et suivres les instructions. Net::SNMP demande quelques dépendances pendant l’installation.

    perl -MCPAN -e shell

    CPAN> install Net::SNMP

  • Je ne connaissais ce script, c’est la réponse au problème de surveillance de disponibilité des interfaces. Ça marche sans problème sur un zyxel.

    Mais je me demandais, si on a plusieurs swichs avec une 30éne d’interfaces et on veut surveiller la disponibilité de toutes ces interfaces, il faut créer manuellement autant de service dans nagios que d’interfaces?

  • Boby

    Pour Cherkaoui,

    Pour répondre à ta question, j’ai lu quelques part qu’il était possible de surveiller une plage de port.

    Voici le lien pour plus de détails :
    http://nagios.manubulon.com/snmp_int.html

    Autrement pour éviter de reproduire le service sur chaque host tu peux utiliser les hostgroup.

    En esperant que cela t’aide.

  • aurelie

    bonjour,

    merci beaucoup, ca fonctionne trés bien, mais j’aimerais bien le faire sur tous les ports.

    est ce que je suis obligée de le faire autant de fois que le nombre de ports pour surveiller tous les ports de mon routeur?

  • bimo

    ajoute un -n à ta commande

  • mohammed

    chek_snmp_int
    bonjour,

    j’ai installer une version de FAN, nagios/centreon et ca marche tres bien j’arrive a superviser plusieurs éléments actifs,
    le probleme c ke la commande ./check_snmp_int.pl – H adreess – C communitySnmp – n Fast.*24 marche tres bien sur le serveur nagios lorsque je monitor un switch cisco,
    mais sur l’interface centreon (web) ca retourne l’erreur suisvante:
    (Return code of 127 is out of bounds – plugin may be missing) j’ai essayer plusieur fois de modifier la commande sur centreon et c le meme probleme (commande centreon: pour linteface 20 (celle ki m’interesse)$USER1$/check_snmp_int.pl -H $HOSTADDRESS$ -C nomdemacummity -n FastEthernet0/20

    merci de m’aider

  • faris

    svp , je voudrais la commande à inserer dans commandes.cfg pour avoir le debit d’une interface donée check_snmp_int -k

    svppp c’est tres urgent

    Merci les amis

  • Romain6706

    Bonjour, j’ai un problème avec le plugin check_snmp_int.pl, il marche parfaitement en ligne de commande, mais je n’arrive pas à le faire fonctionner dans centreon, il doit y avoir une erreur de paramètre quelque part.

  • Cop1

    Salut a tous,

    Pour kes erreurs de centreon, peut etre un probleme de droit ?

    Faris, as-tu trouve une solution pour la commande exacte a utiliser pour mesurer le debit d’une interface.

    Est-ce que ce check fonctionne avec un routeur cisco ?

    Merci

    • Cop1

      Bon après avoir tester le plugins, cela fonctionne nikel sur les équipements Cisco.

      Par contre j’ai un peu de mal à trouver la commande à paramétrer pour calculer le débit sur un des ports. Est-ce possible. si oui quelqu’un veut-il bien avoir la gentillesse de me le noter.

      Merci d’avance.

  • Sylvain

    @mohammed @Romain6706 Je sais que vos demandes dates ^^

    Sur centreon il faut mettre le chemin entier.
    En effet, lorsqu’on test la commande, on s’aperçoit qu’il mentionne le chemin suivant:
    /usr/lib/nagios/plugins

    Or check_snmp_int.pl se trouve dans le répertoire manubulon. (Faire ce genre de test pour les autres commandes)
    Il faut donc mettre à la place de $USER1$ => /usr/lib/nagios/plugins/manubulon/check_snmp_int.pl

    Ce qui donne comme genre de commande :
    /usr/lib/nagios/plugins/manubulon/check_snmp_int.pl -H $HOSTADRESS$ -C communauté -n Serial3/0 -r

  • Jamal

    Bonjour tout le monde et merci d’avance.

    J’ai un holding avec plusieurs sites situés sur différentes villes.

    tout est géré au niveau centrale (applications, serveurs, FW…), les sites communiquent avec le central via MPLS
    sur chaque site il y’a un routeur qui se conncete avec le routeur central pour ensuite se connecter au LAN local (central)

    Je me pose la question, est ce possible de supperviser en premier lieu l’état de la liason entre les sites distants et le central (up or down), si soui comment faire et les prerequis (par exemple la suppervision des routeurs distants).
    Est ce que nagios peut reconnaitre l’adersse IP du routeur distant (sur le site) même si nagios est sur le LAN du central ?

    Merci infiniment pour votre aide

  • Martin H

    Bonsoir,

    Nagios récupère bien des ports de mon switch cisco. Par contre, je voudrais récupérer la bande passante des portes du switch, j’ai essayé différentes commandes mais je n’ai aucune donnée qui revient dans les Performance Data.

    Voilà ce que j’ai essayé :

    check_snmp_int!public! »GigabitEthernet0/1″!-Y –perfspeed -k -w 50000,50000 -c 100000,100000

    J’ai d’abord essayé sans le –perfspeed mais ça ne donne rien, c’est clairement une erreur de syntaxe…

    Merci!

  • gerald

    Mersi

    good, very useful,

    thanks again

  • Gilles Mambidi

    MErci

  • Pingback: Firewall | Pearltrees()

  • Pingback: 2013 | Pearltrees()