Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
215snmp:70_exercice-pratique [le 13/07/2010 à 15:56] – prof | 215snmp:70_exercice-pratique [le 30/06/2018 à 15:43] (Version actuelle) – prof | ||
---|---|---|---|
Ligne 156: | Ligne 156: | ||
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 ===== | ===== 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, | ||
+ | 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 '' | ||
+ | ==== Premier essai ==== | ||
+ | Grâce par exemple au [[http:// | ||
+ | |||
+ | 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 = ' | ||
+ | |||
+ | $X = snmprealwalk(' | ||
+ | foreach($X as $key => $value) { | ||
+ | $macAddr = $key; | ||
+ | $port = $value; | ||
+ | echo $port.' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | La fonction '' | ||
+ | |||
+ | La fonction '' | ||
+ | * 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 : | ||
+ | < | ||
+ | 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 | ||
+ | </ | ||
+ | Pas bien exploitable. Il nous faut nettoyer un peu : | ||
+ | * les clés (OIDs) en enlevant l'OID de la table ('' | ||
+ | * les données en enlevant le type ('' | ||
+ | |||
+ | ==== Deuxième essai ==== | ||
+ | Comme ceci n'est pas un cours de PHP, voici juste une façon de faire, parmi tant d' | ||
+ | |||
+ | <code php> | ||
+ | <?php | ||
+ | // nous souhaitons traiter les OIDs de façon numérique | ||
+ | snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC); | ||
+ | |||
+ | $OID = ' | ||
+ | |||
+ | $X = snmprealwalk(' | ||
+ | foreach($X as $key => $value) { | ||
+ | $macAddr = substr($key, | ||
+ | $port = explode(': | ||
+ | echo $port[1].' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | Ceci nous donne déjà quelque chose de plus exploitable : | ||
+ | < | ||
+ | 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 | ||
+ | </ | ||
+ | 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' | ||
+ | Créons une fonction dans laquelle nous injecterons l' | ||
+ | <code php> | ||
+ | function parseMacAddr($T) { | ||
+ | $tok = strtok($T," | ||
+ | while ($tok !== false) { | ||
+ | $oct=dechex($tok); | ||
+ | settype($oct," | ||
+ | if (strlen($oct)==1) $oct = " | ||
+ | $macAddr = $macAddr.$oct.":"; | ||
+ | $tok = strtok(" | ||
+ | } | ||
+ | $macAddr = substr($macAddr, | ||
+ | return $macAddr; | ||
+ | } | ||
+ | </ | ||
+ | La fonction '' | ||
+ | |||
+ | === 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," | ||
+ | if (strlen($oct)==1) $oct = " | ||
+ | $macAddr = $macAddr.$oct.":"; | ||
+ | $tok = strtok(" | ||
+ | } | ||
+ | $macAddr = substr($macAddr, | ||
+ | return $macAddr; | ||
+ | } | ||
+ | |||
+ | // nous souhaitons traiter les OIDs de façon numérique | ||
+ | snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC); | ||
+ | |||
+ | $OID = ' | ||
+ | |||
+ | $X = snmprealwalk(' | ||
+ | foreach($X as $key => $value) { | ||
+ | $macAddr = parseMacAddr(substr($key, | ||
+ | $port = explode(': | ||
+ | settype($port[1],' | ||
+ | $Y[$macAddr]=$port[1]; | ||
+ | } | ||
+ | |||
+ | unset($X); | ||
+ | asort($Y); | ||
+ | |||
+ | foreach($Y as $key => $value) { | ||
+ | echo $value.' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | donne quelque chose d' | ||
+ | < | ||
+ | 0 == 00: | ||
+ | 3 == 00: | ||
+ | 4 == 00: | ||
+ | 5 == 00: | ||
+ | 6 == 00: | ||
+ | 7 == 00: | ||
+ | 8 == 00: | ||
+ | 9 == 00: | ||
+ | 10 == 00: | ||
+ | 11 == 00: | ||
+ | 13 == 90: | ||
+ | 23 == 00: | ||
+ | 23 == 00: | ||
+ | 24 == 00: | ||
+ | 24 == 00: | ||
+ | </ | ||
+ | Notre tableau '' | ||
+ | ===== Pour finir ===== | ||
+ | Beaucoup d' |
Exercice pratique: Dernière modification le: 13/07/2010 à 15:56 par prof