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 13/07/2010 à 15:55] prof215snmp:70_exercice-pratique [le 30/06/2018 à 15:43] (Version actuelle) prof
Ligne 49: Ligne 49:
 ===== Que dit SNMP ? ===== ===== Que dit SNMP ? =====
  
-===== dot1dTpFdbAddress =====+==== dot1dTpFdbAddress ====
 <html><pre class="code"> <html><pre class="code">
 ~$ snmpbulkwalk <span class="hly">-Ob</span> -m  +/var/lib/mibs/ietf/BRIDGE-MIB -c public -v 2c 172.16.252.4  BRIDGE-MIB::dot1dTpFdbAddress ~$ snmpbulkwalk <span class="hly">-Ob</span> -m  +/var/lib/mibs/ietf/BRIDGE-MIB -c public -v 2c 172.16.252.4  BRIDGE-MIB::dot1dTpFdbAddress
Ligne 96: Ligne 96:
 </pre></html> </pre></html>
 Dans un cas comme dans l'autre, nous avons une table (''.1.3.6.1.2.1.17.4.3.1.1.'') qui contient toutes les adresses MAC que notre switch a vu passer. Ceci ne répond pas à notre question, mais nous apprend tout de même quelque chose, si l'on y regarde de plus près : les clés (surlignées eh jaune), ne sont rien d'autre que l'expression en base 10 de l'adresse MAC correspondante. Cette remarque va nous servir dans la suite immédiate. Dans un cas comme dans l'autre, nous avons une table (''.1.3.6.1.2.1.17.4.3.1.1.'') qui contient toutes les adresses MAC que notre switch a vu passer. Ceci ne répond pas à notre question, mais nous apprend tout de même quelque chose, si l'on y regarde de plus près : les clés (surlignées eh jaune), ne sont rien d'autre que l'expression en base 10 de l'adresse MAC correspondante. Cette remarque va nous servir dans la suite immédiate.
-===== dot1dTpFdbPort =====+ 
 +==== dot1dTpFdbPort ====
 Intéressons nous à la table suivante dont le descriptif dit clairement : \\ //Either the value '0', or the port number of the port on which a frame having a source address equal to the value of the corresponding instance of dot1dTpFdbAddress has been seen.// Intéressons nous à la table suivante dont le descriptif dit clairement : \\ //Either the value '0', or the port number of the port on which a frame having a source address equal to the value of the corresponding instance of dot1dTpFdbAddress has been seen.//
  
Ligne 144: Ligne 145:
  
 En regardant bien ce tableau, nous constatons deux choses : En regardant bien ce tableau, nous constatons deux choses :
 +
 == Le port 0 == == Le port 0 ==
 Le port 0 représente une adresse MAC connue du switch, mais ne venant pas d'un port réel. En l'occurrence, il s'agit d'une adresse MAC du switch lui-même : Le port 0 représente une adresse MAC connue du switch, mais ne venant pas d'un port réel. En l'occurrence, il s'agit d'une adresse MAC du switch lui-même :
Ligne 153: Ligne 155:
 == Les ports 23 et 24 == == Les ports 23 et 24 ==
 Ces ports sont référencés deux fois dans la table. C'est possible et même normal qu'un même port puisse voir plusieurs adresses MAC, si un autre switch est connecté dessus, ce qui est le cas ici. Ces ports sont référencés deux fois dans la table. C'est possible et même normal qu'un même port puisse voir plusieurs adresses MAC, si un autre switch est connecté dessus, ce qui est le cas ici.
 +===== Un début de solution =====
 +Compte tenu du problème énoncé, il est clair qu'il va falloir coder un outil qui réponde à la question. Pas question de le réaliser ici, mais nous allons amorcer la solution en utilisant PHP, juste pour montrer que l'on peut utiliser facilement un langage quelconque, du moment qu'il propose une bibliothèque pour gérer SNMP, ce qui est le cas de PHP. Cette bibliothèque est rudimentaire, mais suffisante pour nos besoins.
 +
 +Nous avons bien dans un coin une Debian qui traine, avec Apache, MySQL et PHP, sur le serveur RADIUS par exemple. Nous allons juste réaliser une fonction qui remplira un tableau avec ce que nous dit SNMP.
 +
 +Il faut bien entendu installer le module ''php5-snmp'' pour réaliser l'opération.
 +==== Premier essai ====
 +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 (>= 5.2) :
 +<code php>
 + <?php
 + // 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';
 +
 + $X = snmprealwalk('172.16.252.4', 'public',$OID);
 + foreach($X as $key => $value) {
 + $macAddr = $key;
 + $port = $value;
 + echo $port.' == '.$macAddr.'<br />';
 + }
 + ?>
 +</code>
 +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>
 +INTEGER: 11 == .1.3.6.1.2.1.17.4.3.1.2.0.5.93.8.128.1
 +INTEGER: 5 == .1.3.6.1.2.1.17.4.3.1.2.0.19.212.88.167.204
 +INTEGER: 23 == .1.3.6.1.2.1.17.4.3.1.2.0.23.8.228.70.128
 +INTEGER: 23 == .1.3.6.1.2.1.17.4.3.1.2.0.23.8.228.70.206
 +INTEGER: 24 == .1.3.6.1.2.1.17.4.3.1.2.0.23.8.228.197.0
 +INTEGER: 24 == .1.3.6.1.2.1.17.4.3.1.2.0.23.8.228.197.79
 +INTEGER: 0 == .1.3.6.1.2.1.17.4.3.1.2.0.33.145.133.119.77
 +INTEGER: 6 == .1.3.6.1.2.1.17.4.3.1.2.0.35.84.55.145.46
 +INTEGER: 8 == .1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.84.111
 +INTEGER: 9 == .1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.85.170
 +INTEGER: 10 == .1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.97.178
 +INTEGER: 4 == .1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.99.185
 +INTEGER: 3 == .1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.99.199
 +INTEGER: 7 == .1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.100.151
 +INTEGER: 13 == .1.3.6.1.2.1.17.4.3.1.2.144.230.186.157.115.173
 +</code>
 +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>
 + <?php
 + // 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';
 +
 + $X = snmprealwalk('172.16.252.4', 'public',$OID);
 + foreach($X as $key => $value) {
 + $macAddr = substr($key,strlen($OID)+1) ;
 + $port = explode(': ',$value,2);
 + echo $port[1].' == '.$macAddr.'<br />';
 + }
 + ?>
 +</code>
 +Ceci nous donne déjà quelque chose de plus exploitable :
 +<code>
 +11 == 0.5.93.8.128.1
 +5 == 0.19.212.88.167.204
 +23 == 0.23.8.228.70.128
 +23 == 0.23.8.228.70.206
 +24 == 0.23.8.228.197.0
 +24 == 0.23.8.228.197.79
 +0 == 0.33.145.133.119.77
 +6 == 0.35.84.55.145.46
 +8 == 0.48.132.58.84.111
 +9 == 0.48.132.58.85.170
 +10 == 0.48.132.58.97.178
 +4 == 0.48.132.58.99.185
 +3 == 0.48.132.58.99.199
 +7 == 0.48.132.58.100.151
 +13 == 144.230.186.157.115.173
 +</code>
 +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écimale, et 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>
 + <?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;
 + }
 +
 + // 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';
 +
 + $X = snmprealwalk('172.16.252.4', 'public',$OID);
 + foreach($X as $key => $value) {
 + $macAddr = parseMacAddr(substr($key,strlen($OID)+1));
 + $port = explode(': ',$value,2);
 + settype($port[1],'integer');
 + $Y[$macAddr]=$port[1];
 + }
 +
 + unset($X);
 + asort($Y);
 +
 + foreach($Y as $key => $value) {
 + echo $value.' == '.$key.'<br />';
 + }
 + ?>
 +</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: 13/07/2010 à 15:55 par prof