Le protocole SNMP
09/02/2005
 Christian CALECA 
Liste des cours

Managers

Accueil ] [ Le principe ] [ Le protocole ] [ Install.  SNMP. ] [ La MIB ] [ Managers ] [ MRTG intro ] [ MRTG en production ]


A la lumière de ce qui a été vu, il est clair que pour être exploitable, ce protocole nécessite d'être manipulé à travers une interface conviviale et ergonomique, encore que les administrateurs Unix, qui sont des spartiates modernes, prennent plaisir à manipuler des lignes de commandes dont la syntaxe reste franchement obscure. De fait, les outils en ligne de commande ont un réel intérêt, parce qu'ils sont facilement manipulables à partir de scripts, ce qui permet de se construire "facilement" des outils sur mesure, mais les "clickodromes", ont aussi du bon...

Le plus connu de ces clickodromes est un outil commercial de chez Hewlett Packard, intitulé "openview". Comme tout logiciel commercial professionnel, son prix en fait une merveille à lui tout seul.

Je n'ai pas trouvé d'équivalent vraiment convainquant en GPL sous Linux. Pour illustrer de façon un peu pratique ce qui a été vu jusqu'ici, nous allons utiliser un outil écrit en Java intilulé "open eyes". Pour des raisons beaucoup plus idéologiques que techniques, je n'aime pas trop utiliser Java, mais cet utilitaire offre l'avantage d'une certaine simplicité et peut, avantage de Java, fonctionner sur divers systèmes. Pour l'occasion, il est utilisé sous Windows XP, avec le "Java Runtime Environment".

Jawa Open Eyes

jawa

Nous allons d'abord nous intéresser à deux fonctions : un pseudo "mib browser" et l'interrogation d'un noeud IP.

1 :Simple MIB Reference

Ce n'est pas un outil qui va afficher le contenu d'une MIB sur un noeud donné, mais il permet de retrouver la représentation numérique d'une clé de la MIB "générique" 

xml

Cet outil, nous allons le voir dans la suite, s'avère bien intéressant...

2:Interrogation d'un noeud

noeud Voyons ce que cet outil peut nous donner comme informations, si on lui demande d'interroger ma passerelle Linux.

Pour information, elle dispose de quatre interfaces réseau :

  • La "loopback" (lo : 127.0.0.1)
  • Eth0, sur le réseau local : 192.168.0.250
  • Eth1, vers le modem câble : 192.168.100.250
  • ppp0, la connexion PPPoE qui, au moment des tests, dispose de l'adresse 80.8.145.121

Et voilà le travail :

jawa

Comme vous le voyez, c'est tout de même un peu mélangé... Et c'est tant mieux, parce que, lorsque tout fonctionne sans problèmes, on n'est pas obligé de chercher l'erreur ce qui est dommage, parce que chercher l'erreur oblige à chercher à comprendre le processus.

Nous avons donc ici de la chance, nous allons être obligés de chercher à comprendre !

A la recherche du bug

Tant qu'à mettre les mains dans le cambouis, autant utiliser les rudimentaires mais efficaces outils en ligne de commande de Linux, avec la commande "snmpwalk".

Recherche des interfaces : Internet.MGMT.MIB.Interface

Le "browser" de openeyes va nous servir. Nous avons vu que la représentation numérique de cette entrée de la MIB est .1.3.6.1.2.1.2 :

[root@gw1 root]# snmpwalk -OX -c public -v 1 localhost .1.3.6.1.2.1.2
interfaces.ifNumber.0 = 4

## Bon, nous avons bien 4 interfaces, et leur index sera :
interfaces.ifTable.ifEntry.ifIndex[1] = 1
interfaces.ifTable.ifEntry.ifIndex[2] = 2
interfaces.ifTable.ifEntry.ifIndex[3] = 3
interfaces.ifTable.ifEntry.ifIndex[4] = 4

## Leur nom :
interfaces.ifTable.ifEntry.ifDescr[1] = lo
interfaces.ifTable.ifEntry.ifDescr[2] = eth0
interfaces.ifTable.ifEntry.ifDescr[3] = eth1
interfaces.ifTable.ifEntry.ifDescr[4] = ppp0

# Leur type :
interfaces.ifTable.ifEntry.ifType[1] = softwareLoopback(24)
interfaces.ifTable.ifEntry.ifType[2] = ethernetCsmacd(6)
interfaces.ifTable.ifEntry.ifType[3] = ethernetCsmacd(6)
interfaces.ifTable.ifEntry.ifType[4] = ppp(23)

## Leur MTU :
interfaces.ifTable.ifEntry.ifMtu[1] = 16436
interfaces.ifTable.ifEntry.ifMtu[2] = 1500
interfaces.ifTable.ifEntry.ifMtu[3] = 1500
interfaces.ifTable.ifEntry.ifMtu[4] = 1492

## etc. Le reste est moins intéressant pour ce qui nous concerne.
## je vous le laisse juste pour le "fun"...
interfaces.ifTable.ifEntry.ifSpeed[1] = Gauge32: 10000000
interfaces.ifTable.ifEntry.ifSpeed[2] = Gauge32: 10000000
interfaces.ifTable.ifEntry.ifSpeed[3] = Gauge32: 10000000
interfaces.ifTable.ifEntry.ifSpeed[4] = Gauge32: 0
interfaces.ifTable.ifEntry.ifPhysAddress[1] =
interfaces.ifTable.ifEntry.ifPhysAddress[2] = 0:20:18:2c:e:e9
interfaces.ifTable.ifEntry.ifPhysAddress[3] = 0:60:8c:50:f3:3e
interfaces.ifTable.ifEntry.ifPhysAddress[4] =
interfaces.ifTable.ifEntry.ifAdminStatus[1] = up(1)
interfaces.ifTable.ifEntry.ifAdminStatus[2] = up(1)
interfaces.ifTable.ifEntry.ifAdminStatus[3] = up(1)
interfaces.ifTable.ifEntry.ifAdminStatus[4] = up(1)
interfaces.ifTable.ifEntry.ifOperStatus[1] = up(1)
interfaces.ifTable.ifEntry.ifOperStatus[2] = up(1)
interfaces.ifTable.ifEntry.ifOperStatus[3] = up(1)
interfaces.ifTable.ifEntry.ifOperStatus[4] = up(1)
interfaces.ifTable.ifEntry.ifInOctets[1] = Counter32: 1262381
interfaces.ifTable.ifEntry.ifInOctets[2] = Counter32: 76146933
interfaces.ifTable.ifEntry.ifInOctets[3] = Counter32: 340396847
interfaces.ifTable.ifEntry.ifInOctets[4] = Counter32: 35138404
interfaces.ifTable.ifEntry.ifInUcastPkts[1] = Counter32: 10561
interfaces.ifTable.ifEntry.ifInUcastPkts[2] = Counter32: 941771
interfaces.ifTable.ifEntry.ifInUcastPkts[3] = Counter32: 1268973
interfaces.ifTable.ifEntry.ifInUcastPkts[4] = Counter32: 58952
interfaces.ifTable.ifEntry.ifInErrors[1] = Counter32: 0
interfaces.ifTable.ifEntry.ifInErrors[2] = Counter32: 0
interfaces.ifTable.ifEntry.ifInErrors[3] = Counter32: 0
interfaces.ifTable.ifEntry.ifInErrors[4] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutOctets[1] = Counter32: 1264163
interfaces.ifTable.ifEntry.ifOutOctets[2] = Counter32: 242592651
interfaces.ifTable.ifEntry.ifOutOctets[3] = Counter32: 85618617
interfaces.ifTable.ifEntry.ifOutOctets[4] = Counter32: 3647223
interfaces.ifTable.ifEntry.ifOutUcastPkts[1] = Counter32: 10585
interfaces.ifTable.ifEntry.ifOutUcastPkts[2] = Counter32: 1079693
interfaces.ifTable.ifEntry.ifOutUcastPkts[3] = Counter32: 942638
interfaces.ifTable.ifEntry.ifOutUcastPkts[4] = Counter32: 55874
interfaces.ifTable.ifEntry.ifOutDiscards[1] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutDiscards[2] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutDiscards[3] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutDiscards[4] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutErrors[1] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutErrors[2] = Counter32: 1
interfaces.ifTable.ifEntry.ifOutErrors[3] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutErrors[4] = Counter32: 0
interfaces.ifTable.ifEntry.ifOutQLen[1] = Gauge32: 0
interfaces.ifTable.ifEntry.ifOutQLen[2] = Gauge32: 0
interfaces.ifTable.ifEntry.ifOutQLen[3] = Gauge32: 0
interfaces.ifTable.ifEntry.ifOutQLen[4] = Gauge32: 0
interfaces.ifTable.ifEntry.ifSpecific[1] = OID: .ccitt.zeroDotZero
interfaces.ifTable.ifEntry.ifSpecific[2] = OID: .ccitt.zeroDotZero
interfaces.ifTable.ifEntry.ifSpecific[3] = OID: .ccitt.zeroDotZero
interfaces.ifTable.ifEntry.ifSpecific[4] = OID: .ccitt.zeroDotZero

Bien. Si nous récapitulons, nous pouvons établir le tableau suivant :

Index Nom Type
1 lo softwareLoopback(24)
2 eth0 ethernetCsmacd(6)
3 eth1 ethernetCsmacd(6)
4 ppp0 ppp(23)

Jusque là, c'est bien dans le même ordre que ce qu'affiche openeyes.

Recherche des IPs : Internet.MGMT.MIB.Ip.ipAddrTable.

xml Petit retour dans le "browser de mib", pour rechercher où pourraient se trouver les adresses IP des interfaces.

Il y a des chances que ce soit dans Internet.MGMT.MIB.Ip.ipAddrTable, c'est à dire dans 1.3.6.1.2.1.4.20

Encore un petit coup de snmpwalk :

[root@gw1 root]# snmpwalk -OX -c public -v 1 localhost .1.3.6.1.2.1.4.20

# Les 4 adresses IP
ip.ipAddrTable.ipAddrEntry.ipAdEntAddr[80.8.145.121] = IpAddress: 80.8.145.121
ip.ipAddrTable.ipAddrEntry.ipAdEntAddr[127.0.0.1] = IpAddress: 127.0.0.1
ip.ipAddrTable.ipAddrEntry.ipAdEntAddr[192.168.0.250] = IpAddress: 192.168.0.250
ip.ipAddrTable.ipAddrEntry.ipAdEntAddr[192.168.100.250] = IpAddress: 192.168.100.250

## Et l'index qui correspond
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex[80.8.145.121] = 4
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex[127.0.0.1] = 1
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex[192.168.0.250] = 2
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex[192.168.100.250] = 3

## Le reste, quoi qu'intéressant, n'est d'aucune utilité pour
## la recherche du bug.
## Je vous le laisse encore pour le "fun"
ip.ipAddrTable.ipAddrEntry.ipAdEntNetMask[80.8.145.121] = IpAddress: 255.255.255.255
ip.ipAddrTable.ipAddrEntry.ipAdEntNetMask[127.0.0.1] = IpAddress: 255.0.0.0
ip.ipAddrTable.ipAddrEntry.ipAdEntNetMask[192.168.0.250] = IpAddress: 255.255.255.0
ip.ipAddrTable.ipAddrEntry.ipAdEntNetMask[192.168.100.250] = IpAddress: 255.255.255.0
ip.ipAddrTable.ipAddrEntry.ipAdEntBcastAddr[80.8.145.121] = 0
ip.ipAddrTable.ipAddrEntry.ipAdEntBcastAddr[127.0.0.1] = 1
ip.ipAddrTable.ipAddrEntry.ipAdEntBcastAddr[192.168.0.250] = 1
ip.ipAddrTable.ipAddrEntry.ipAdEntBcastAddr[192.168.100.250] = 1

Et voilà... L'auteur de openeyes n'avait pas prévu que les IPs pouvaient être données dans un ordre différent de celui des interfaces !

Les interfaces dans l'ordre 1, 2, 3, 4 et les IPs dans l'ordre 4, 1,2, 3

Si nous complétons le tableau précédent correctement, c'est à dire en tenant compte des index, nous obtenons :

Index Nom Type Adresse IP
1 lo softwareLoopback(24) 127.0.0.1
2 eth0 ethernetCsmacd(6) 192.168.0.250
3 eth1 ethernetCsmacd(6) 192.168.100.250
4 ppp0 ppp(23) 80.8.145.121

Ce qui est parfaitement juste. Openeye affiche les IP dans l'ordre où elles arrivent, sans s'occuper des index qui sont pourtant donnés juste après, erreur fatale !

Conclusions

Ce petit exemple nous a forcé à regarder de près comment les informations sont organisées dans la MIB et comment on peut y accéder avec des outils simples.

Nous pourrions aller encore un peu plus loin en utilisant la commande snmpget qui, plutôt que d'afficher toute une branche de la MIB, se bornera à une seule feuille, je vous laisse jouer avec si le coeur vous en dit.

A la lueur de ce que nous avons vu, il est clair que pour être vraiment utile, SNMP doit être manipulé à travers un outil apte à lire périodiquement certaines informations, à en tirer des graphes, des statistiques etc. Dans la dernière partie de cet exposé, nous verrons MRTG, très souvent utilisé pour afficher la charge d'interfaces réseau.

Getif

Les curieux peuvent faire un tour sur cette page qui présente un outil gratuit sous Windows : "getif". Il a l'apparence suivante :

getif

Après avoir indiqué l'adresse IP de la machine à observer, ainsi que la (les) communauté(s) en lecture (et en écriture), on clique sur start. On peut voir pas mal de choses avec Getif, mais ce qui reste le plus intéressant pour nous est le "mib browser" :

getif

Avec lequel nous pourrons faire les mêmes choses qu'avec snmpwalk, snmpget, snmpset et snmptranslate, d'une façon un petit peu plus ergonomique. Je n'ai pas trouvé sous Linux d'équivalent à cet utilitaire.


Précédente ] [ Accueil ] [ Suivante ]