Outils pour utilisateurs

Outils du site


Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
215snmp:70_exercice-pratique [le 14/07/2010 à 17:08] prof215snmp:70_exercice-pratique [le 30/06/2018 à 15:43] (Version actuelle) prof
Ligne 164: Ligne 164:
 Grâce par exemple au [[http://www.simpleweb.org/ietf/mibs/modules/html/?category=IETF&module=BRIDGE-MIB|SimpleWeb]], nous savons que l'OID de la table qui nous intéresse est ''.1.3.6.1.2.1.17.4.3.1.2''. Grâce par exemple au [[http://www.simpleweb.org/ietf/mibs/modules/html/?category=IETF&module=BRIDGE-MIB|SimpleWeb]], nous savons que l'OID de la table qui nous intéresse est ''.1.3.6.1.2.1.17.4.3.1.2''.
  
-Voici un premier code php :+Voici un premier code php (>= 5.2) :
 <code php> <code php>
  <?php  <?php
- $OID = '.1.3.6.1.2.1.17.4.3.1.2'; + // nous souhaitons traiter les OIDs de façon numérique
  snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC);  snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC);
 +
 + $OID = '.1.3.6.1.2.1.17.4.3.1.2';
  
  $X = snmprealwalk('172.16.252.4', 'public',$OID);  $X = snmprealwalk('172.16.252.4', 'public',$OID);
  foreach($X as $key => $value) {  foreach($X as $key => $value) {
- $adrMac = $key;+ $macAddr = $key;
  $port = $value;  $port = $value;
- echo $port.' == '.$adrMac.'<br />';+ echo $port.' == '.$macAddr.'<br />';
  }  }
  ?>  ?>
 </code> </code>
-Qui va nous donner le résultat suivant :+La fonction ''snmp_set_oid_output_format''permet d'indiquer comment nous désirons traiter les OIDs. Ici, sous forme numérique. ''SNMP_OID_OUTPUT_NUMERIC'' est une constante pré-définie dans le module ''php5-snmp''
 + 
 +La fonction ''snmprealwalk'' est un genre de ''snmpwalk'' où l'on indique comme paramètres : 
 +  * la cible (adresse IP ou nom DNS) ; 
 +  * la communauté ; 
 +  * l'OID d'où l'on veut partir. 
 + 
 +Ceci va nous donner le résultat suivant :
 <code> <code>
 INTEGER: 11 == .1.3.6.1.2.1.17.4.3.1.2.0.5.93.8.128.1 INTEGER: 11 == .1.3.6.1.2.1.17.4.3.1.2.0.5.93.8.128.1
Ligne 197: Ligne 205:
 INTEGER: 13 == .1.3.6.1.2.1.17.4.3.1.2.144.230.186.157.115.173 INTEGER: 13 == .1.3.6.1.2.1.17.4.3.1.2.144.230.186.157.115.173
 </code> </code>
-Pas bien exploitable. Dans un premier temps, nous allons retirer dans la valeur le type de la donnée et dans la clé toute la partie OID :+Pas bien exploitable. Il nous faut nettoyer un peu : 
 +  * les clés (OIDs) en enlevant l'OID de la table (''.1.3.6.1.2.1.17.4.3.1.2.'') ; 
 +  * les données en enlevant le type (''INTEGER: '') ; 
 + 
 +==== Deuxième essai ==== 
 +Comme ceci n'est pas un cours de PHP, voici juste une façon de faire, parmi tant d'autres. [[http://fr.php.net/manual/fr/ref.strings.php|La documentation officielle de PHP]] vous sera éventuellement d'un grand secours. 
 <code php> <code php>
  <?php  <?php
- $OID = '.1.3.6.1.2.1.17.4.3.1.2'; + // nous souhaitons traiter les OIDs de façon numérique
  snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC);  snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC);
 +
 + $OID = '.1.3.6.1.2.1.17.4.3.1.2';
  
  $X = snmprealwalk('172.16.252.4', 'public',$OID);  $X = snmprealwalk('172.16.252.4', 'public',$OID);
  foreach($X as $key => $value) {  foreach($X as $key => $value) {
- $adrMac = substr($key,strlen($OID)+1) ;+ $macAddr = substr($key,strlen($OID)+1) ;
  $port = explode(': ',$value,2);  $port = explode(': ',$value,2);
- echo $port[1].' == '.$adrMac.'<br />';+ echo $port[1].' == '.$macAddr.'<br />';
  }  }
  ?>  ?>
Ligne 230: Ligne 245:
 13 == 144.230.186.157.115.173 13 == 144.230.186.157.115.173
 </code> </code>
-Pour trier correctement le tableau par numéro de port croissantil va falloir convertir les valeurs qui sont des chaines de caractères en entiers+Cependant : 
 +  * les adresses MAC (les clés) ne sont pas dans un format exploitable (représentation hexadécimale) ; 
 +  * les ports (les données) sont sous forme de texte, si bien qu'un tri se fera suivant le code ASCII, ce qui n'a pas de sens ici. 
 +Nous allons donc créer un second tableau, avec des clés (adresses MAC) dans le format utilisé sur FreeRADIUS et des données de type entier. 
 +==== Troisième essai ==== 
 +=== L'adresse MAC === 
 +Créons une fonction dans laquelle nous injecterons l'adresse sous sa forme décimaleet qui nous renverra une chaine sous forme hexadécimale, avec le délimiteur '':''
 +<code php> 
 + function parseMacAddr($T) { 
 +     $tok = strtok($T,"."); 
 +     while ($tok !== false) { 
 + $oct=dechex($tok); 
 + settype($oct,"string"); 
 + if (strlen($oct)==1) $oct = "0".$oct; 
 + $macAddr = $macAddr.$oct.":"; 
 + $tok = strtok("."); 
 +
 + $macAddr = substr($macAddr,0,strlen($macAddr)-1); 
 + return $macAddr; 
 +
 +</code> 
 +La fonction ''strtok'' n'est pas d'un usage bien intuitif, mais pour ceux qui ne la connaissent pas, la documentation donne des exemples clairs. 
 + 
 +=== La solution définitive(?) === 
 +Finalement, le code suivant :
 <code php> <code php>
  <?php  <?php
Ligne 246: Ligne 285:
  }  }
   
 + // nous souhaitons traiter les OIDs de façon numérique
 + snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC);
 +
  $OID = '.1.3.6.1.2.1.17.4.3.1.2';  $OID = '.1.3.6.1.2.1.17.4.3.1.2';
- +
- snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC); +
  $X = snmprealwalk('172.16.252.4', 'public',$OID);  $X = snmprealwalk('172.16.252.4', 'public',$OID);
  foreach($X as $key => $value) {  foreach($X as $key => $value) {
Ligne 266: Ligne 306:
  ?>  ?>
 </code> </code>
 +donne quelque chose d'acceptable :
 +<code>
 +0 == 00:21:91:85:77:4d
 +3 == 00:30:84:3a:63:c7
 +4 == 00:30:84:3a:63:b9
 +5 == 00:13:d4:58:a7:cc
 +6 == 00:23:54:37:91:2e
 +7 == 00:30:84:3a:64:97
 +8 == 00:30:84:3a:54:6f
 +9 == 00:30:84:3a:55:aa
 +10 == 00:30:84:3a:61:b2
 +11 == 00:05:5d:08:80:01
 +13 == 90:e6:ba:9d:73:ad
 +23 == 00:17:08:e4:46:80
 +23 == 00:17:08:e4:46:ce
 +24 == 00:17:08:e4:c5:4f
 +24 == 00:17:08:e4:c5:00
 +</code>
 +Notre tableau ''Y'' contient les informations issues du switch dans un format que l'on pourra aisément utiliser dans des requêtes sur notre base MySQL.
 +===== Pour finir =====
 +Beaucoup d'autres informations intéressantes peuvent être obtenues par SNMP. Toujours sur nos switchs, il peut être utile de visualiser le trafic sur certains ports pour surveiller par exemples des goulots d'étranglement. SNMP couplé à des outils comme Cacti ou Zabbix permettra alors d'obtenir de jolis graphes et d'en conserver l'historique.
Exercice pratique: Dernière modification le: 14/07/2010 à 17:08 par