Bricolons avec SNMP

Ces jours, j’ai commencé à sérieusement bricoler avec le protocole SNMP. C’est un des rares protocoles que j’ai appris à l’université qui soit encore largement utilisé. Je travaille avec le package SNMP4J qui, s’il n’est pas idéal, est relativement complet.

À quoi sert SNMP ? Il s’agit à l’origine d’un protocol pour ‘parler’ aux différents appareils qui forment l’infrastructure du réseau: routeurs, switches etc. Si à l’origine ce protocol était uniquement implémenté dans le matériel haut de gamme, de nos jours, on trouve un petit serveur (agent en langage SNMP) dans la plupart des équipements réseaux, jusqu’aux routeurs ADSL et aux imprimantes réseau. Curieusement, on trouve rarement un agent SNMP sur les PCs ce qui est dommage, cela simplifierait pas mal la vie des administrateurs systèmes.

Un des concepts clefs de SNMP est la MIB, c’est la base de donnée qui représente l’état et la configuration de l’appareil. Chaque élément de la MIB est identifié par une clef (appelée OID) et une valeur, qui est un type de base (string, différentes sortes d’entiers). En structurant les OIDs on peut construire des tables. Que contient la MIB ? Virtuellement n’importe quoi. Cela va depuis le nom de la personne de contact responsable pour l’équipement (OID 1.3.6.1.2.1.1.4.0), jusqu’à la configuration des différentes interfaces réseau.

Pas la peine d’essayer cette commande depuis chez vous, l’imprimante en question est bravement cachée derrière le firewall de JAIST.

Pour utiliser SNMP, sous Unix, on a à disposition une série de commandes. La plus simple est la commande snmpget qui permet de lire une variable de la MIB. Par exemple, j’aimerais savoir ce qui se cache derrière une adresse IP, en l’occurrence une imprimante ici.

snmpget -v 1 -c public ps-is16e0r0.jaist.ac.jp SNMPv2-MIB::sysDescr.0

Le paramètre v spécifie la version de SNMP qu’on va utiliser (1), le paramètre c spécifie la communauté. La communauté est une sorte de mot de passe.

L’imprimante va me répondre:

SNMPv2-MIB::sysDescr.0 = STRING: RICOH IPSiO NX850 2.00 / RICOH Network Printer C model

Le code SNMPv2-MIB::sysDescr.0 est une forme humainement lisible de l’OID 1.3.6.1.2.1.1.1.0. Ensuite vient le type de la réponse (une chaîne de caractères), et enfin la réponse, en l’occurrence le modèle de l’imprimante.

Une commande plus générale est snmpwalk, celle-ci permet d’explorer une portion de la MIB. La commande suivante demande tous les éléments qui font partie des informations de base sur un nœud du réseau (en l’occurrence ma propre machine, sur laquelle j’ai lancé le démon snmpd).

snmpwalk -v 1 -c public 127.0.0.1 1.3.6.1.2.1.1

Le résultat est la séquence d’information suivante:

MPv2-MIB::sysDescr.0 = STRING: Darwin kt-dhcp01.jaist.ac.jp 8.2.0 Darwin Kernel Version 8.2.0: Fri Jun 24 17:46:54 PDT 2005; root:xnu-792.2.4.obj~3/RELEASE_PPC Power Macintosh
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.255
SNMPv2-MIB::sysUpTime.0 = Timeticks: (69916504) 8 days, 2:12:45.04
SNMPv2-MIB::sysContact.0 = STRING: "Matthias Wiesmann"
SNMPv2-MIB::sysName.0 = STRING: kt-dhcp01.jaist.ac.jp
SNMPv2-MIB::sysLocation.0 = STRING: "JAIST 6th floor"
SNMPv2-MIB::sysServices.0 = INTEGER: 76
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (500) 0:00:05.00
…

Comme dit plus haut, une grande partie des informations dans la MIB sont structurées comme des tables. Par exemple l’imprimante mentionnée plus haut a un table de système de stockage. On peut visualiser cette table grâce à la commande suivante

snmptable -v 1 -c public ps-is16e0r0.jaist.ac.jp 1.3.6.1.2.1.25.2.3

Le résultat est la table suivante:

SNMP table: HOST-RESOURCES-MIB::hrStorageTable

 hrStorageIndex                        hrStorageType hrStorageDescr hrStorageAllocationUnits hrStorageSize hrStorageUsed hrStorageAllocationFailures
              1   HOST-RESOURCES-TYPES::hrStorageRam            RAM                  1 Bytes     301989888     301989888                           0
              2 HOST-RESOURCES-TYPES::hrStorageOther          FLASH                  1 Bytes       8388608       8388608                           0

La même commande sur mon laptop donne les résultat suivants

SNMP table: HOST-RESOURCES-MIB::hrStorageTable

 hrStorageIndex                                hrStorageType     hrStorageDescr hrStorageAllocationUnits hrStorageSize hrStorageUsed hrStorageAllocationFailures
              1         HOST-RESOURCES-TYPES::hrStorageOther     Memory Buffers                256 Bytes             ?             ?                           ?
              2           HOST-RESOURCES-TYPES::hrStorageRam        Real Memory               4096 Bytes             0       2131376                           ?
              3 HOST-RESOURCES-TYPES::hrStorageVirtualMemory         Swap Space               4096 Bytes       2131124   -1073746432                           ?
              4     HOST-RESOURCES-TYPES::hrStorageFixedDisk                  /               4096 Bytes      19504908      15949534                           ?
              5     HOST-RESOURCES-TYPES::hrStorageFixedDisk               /dev                512 Bytes             2             2                           ?
              6     HOST-RESOURCES-TYPES::hrStorageFixedDisk               /dev                512 Bytes             2             2                           ?
              7     HOST-RESOURCES-TYPES::hrStorageFixedDisk              /.vol                512 Bytes          1024          1024                           ?
              8     HOST-RESOURCES-TYPES::hrStorageFixedDisk           /Network                512 Bytes             0             0                           ?
              9     HOST-RESOURCES-TYPES::hrStorageFixedDisk /automount/Servers                512 Bytes             0             0                           ?
             10     HOST-RESOURCES-TYPES::hrStorageFixedDisk  /automount/static                512 Bytes             0             0                           ?

Une autre table très utile est celle qui contient la liste des adresses IP pour un equipement donné.

snmptable -v 1 -c public 127.0.0.1 1.3.6.1.2.1.4.20
SNMP table: IP-MIB::ipAddrTable

   ipAdEntAddr ipAdEntIfIndex  ipAdEntNetMask ipAdEntBcastAddr ipAdEntReasmMaxSize
     127.0.0.1              1       255.0.0.0                1                   ?
  150.65.26.79              5   255.255.254.0                1                   ?
 150.65.239.67              4 255.255.255.128                1                   ?

Donne la liste des interfaces réseaux, dans mon cas, il y en a trois active en ce moment, ethernet (4), wifi (5) et l’interface loopback (1).

La chose intéressante est naturellement de pouvoir visualiser tous les appareils connectés au réseau de manière uniforme. La prochaine fois, j’essayerais de vous parler des notifications (trappes).

5 thoughts on “Bricolons avec SNMP”

  1. Tu ne parles pas des community ?
    As tu un soft qui permet d’interroger tous les éléments d’un réseau ? Ça m’intéresse !

    Bye Mentat

  2. Une chose après l’autre. Je parlerais des community une autre fois. Je ne connais pas de soft pour interroger tous les éléments d’un réseau mais tu dois pouvoir écrire un script qui fait ça.

  3. Ce que j’aime Mathias quand tu nous parles d’informatique, c’est que c’est vraiment du chinois pour moi et que définitivement, j’ai bien fait de choisir chimie!!!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: