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 à 14:36] – prof | 215snmp:70_exercice-pratique [le 30/06/2018 à 15:43] (Version actuelle) – prof | ||
---|---|---|---|
Ligne 47: | Ligne 47: | ||
Comme par ce beau jour d' | Comme par ce beau jour d' | ||
+ | ===== Que dit SNMP ? ===== | ||
- | ===== dot1dTpFdbAddress | + | ==== dot1dTpFdbAddress ==== |
< | < | ||
- | ~$ snmpbulkwalk -Ob -m +/ | + | ~$ snmpbulkwalk |
</ | </ | ||
+ | L' | ||
+ | //Display table indexes numerically, | ||
< | < | ||
BRIDGE-MIB:: | BRIDGE-MIB:: | ||
Ligne 71: | Ligne 73: | ||
</ | </ | ||
+ | Nous pouvons aussi le faire de façon totalement numérique : | ||
+ | < | ||
+ | ~$ snmpbulkwalk <span class=" | ||
+ | </ | ||
+ | < | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | </ | ||
+ | Dans un cas comme dans l' | ||
+ | ==== dot1dTpFdbPort ==== | ||
+ | Intéressons nous à la table suivante dont le descriptif dit clairement : \\ //Either the value ' | ||
- | + | | |
- | ~$ snmpbulkwalk -Ot -m +/ | + | |
- | BRIDGE-MIB:: | + | < |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | BRIDGE-MIB:: | + | |
- | + | ||
- | On doit pouvoir faire plus clair peut-être ? | + | |
- | + | ||
- | ~$ snmpbulkwalk -On -m +/ | + | |
.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 = INTEGER: 11 | ||
.1.3.6.1.2.1.17.4.3.1.2.0.19.212.88.167.204 = INTEGER: 5 | .1.3.6.1.2.1.17.4.3.1.2.0.19.212.88.167.204 = INTEGER: 5 | ||
Ligne 110: | Ligne 118: | ||
.1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.100.151 = INTEGER: 7 | .1.3.6.1.2.1.17.4.3.1.2.0.48.132.58.100.151 = INTEGER: 7 | ||
.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 = INTEGER: 13 | ||
+ | </ | ||
- | plus « numérique » mais à priori pas plus clair. Essayons encore | + | Cette table contient des numéros de ports, les clés correspondantes n' |
- | + | < | |
- | ~$ snmpbulkwalk -OX -m +/ | + | ~$ snmpbulkwalk |
+ | </ | ||
+ | L' | ||
+ | < | ||
BRIDGE-MIB:: | BRIDGE-MIB:: | ||
BRIDGE-MIB:: | BRIDGE-MIB:: | ||
Ligne 129: | Ligne 141: | ||
BRIDGE-MIB:: | BRIDGE-MIB:: | ||
BRIDGE-MIB:: | BRIDGE-MIB:: | ||
+ | </ | ||
+ | Nous avons ici exactement l' | ||
+ | |||
+ | En regardant bien ce tableau, nous constatons deux choses : | ||
+ | |||
+ | == 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' | ||
+ | ~# arp -an | ||
+ | ... | ||
+ | ? (172.16.252.4) at 00: | ||
+ | ... | ||
+ | | ||
+ | == 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. | ||
+ | ===== 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); | ||
- | Ah, ça commence à ressembler à quelque chose de plus compréhensible : la chaine entre crochets rappèle furieusement une adresse MAC et la valeur (INTEGER) le numéro du port. | + | $OID = '.1.3.6.1.2.1.17.4.3.1.2'; |
+ | $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 à 14:36 par prof