Surveillance des adresses MAC J'avais depuis une éternité envie de surveiller les adresses MAC sur le réseau de la section.

Exemples de problèmes récents qui m'ont obligés à ne pas reporter encore cette étude :

A) Depuis deux semaines : Alerte NAGIOS : CPU à 100% sur un 2003 server pendant 15 min chaque fois. Simple Warning dans l'observateur d'événements du serveur liée à une demande des mises à jour disponibles au service WSUS. Seule l'adresse IP de la station apparaît. Dans cette salle, les PC sont en DHCP, les disques dans des tiroirs. Le temps de constater le problème, la machine est arrêtée, une autre a pris le bail !

=> besoin de collecter toutes les adresses MAC pour des réservations DHCP.

B) TP Analyse de protocoles

on capture des trames de scan du réseau avec une adresse MAC source bidon ! Difficile de remonter au PC qui génère ce trafic. => besoin de collecter les correspondances adresses MAC / ports des switches

C) Conflits d'@IP. Un élève peut affecter une adresse IP à ses matériels. Les consignes de numérotation ne sont pas toujours bien respectées. Le "coupable" du conflit n'assume pas toujours sa responsabilité. Les messages d'erreur ne mentionnent en général que l'adresse MAC. => besoin d'avoir une liste à jour des @MAC et de leur situation "géographique"

Ma solution : un petit script qui interroge les switches chaque minute et enregistre dans un fichier les @MAC pour chaque switch / chaque port. J'utilise le protocole snmp.

=> recherche dans ce fichier si un problème est détecté.

=> réservations DHCP

=> détection des "intrus" : @MAC inconnue ou sur un switch non prévu

extrait du fichier obtenu :

	
	Tue Jan 27 15:30:01 CET 2009
	-----------------------------------------
	192.168.106.85  (adresse du switch Layer 3) 
	00 0E 6A 9C B8 E4  1
	00 0E A6 20 0C 55  12
	00 11 85 66 20 22  7
	00 11 85 66 20 23  24
	00 12 3F 5E A2 4A  17
	00 12 3F 5F 61 C2  14
	00 12 3F 5F 64 89  19
	00 12 3F 5F 66 3A  15
	00 12 3F 5F 66 BD  17
	00 12 3F 5F 68 ED  17
	etc
	-----------------------------------------
	192.168.106.80  (adresse IP d'un switch Layer2) 
	00 12 3F 61 03 A8  5
	00 12 3F 61 20 B1  10
	00 13 D4 DA AD D5  8
	00 30 13 04 4A 07  6
	00 50 DA 62 FC 0B  7
	00 80 77 90 A1 6D  11
	-----------------------------------------
	192.168.106.100
	00 12 3F 5F 8B F3  9
	00 12 3F 5F 8E 66  8
	00 12 3F 5F 8F EE  7
	00 12 3F 5F 96 68  10
	-----------------------------------------
	etc 

Au préalable

Dans SCRIPT1, une ligne par switch à interroger

Paramètres : Les résultats sont écrits dans /var/log/MACS-PORTS

Redirection " >> " => conserve un historique (à purger régulièrement)


SCRIPT1 : /root/bin/mac-switches
#!/bin/bash

# Auteur Francois-malard@lla08.net
#
/bin/date >> /var/log/MACS-PORTS

#                       @ switch   retries  ignorer-port

/root/bin/MACs-1switch 192.168.106.85  5         0
/root/bin/MACs-1switch 192.168.106.80  1        12
/root/bin/MACs-1switch 192.168.106.100 1        12
/root/bin/MACs-1switch 192.168.106.110 1        12

echo "========================================" >> /var/log/MACS-PORTS

Le SCRIPT2 est appelé N fois par le SCRIPT1

a) la commande snmpwalk interroge la table des @MAC du switch

variables dot1dTpFdbAddress et dot1dTpFdbPort (dans dot1dTpFdbTable)

http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?local=en&translate=Translate&objectInput=1.3.6.1.2.1.17.4.3.1

résultats dans deux fichiers temporaires

2>/etc/null m'évite de recevoir un mail à chaque fois qu'un switch ne répond pas (éteint)

b) commande sed => remplacements dans ces 2 fichiers de certains caractères

prépare la recherche des lignes qui correspondent dans les 2 fichiers

rien ne garantit que les 2 listes sont dans le même ordre et qu.entre les 2 requêtes la table ne se soit pas mise à jour !

c) boucle While

extraction du nom de la variable et (mib) et sa valeur (l.adresse MAC)

recherche de cette même variable dans le fichier PORTS [modifié en b) pour que ce soit strictement la même variable]

la condition (if) permet d.éliminer un port de rocade (je ferai une modif pour gérer plusieurs rocades : liens de secours),


SCRIPT 2 : /root/bin/MACs-1switch
#!/bin/bash
# Auteur Francois-malard@lla08.net
#
# $1 @IP  $2  nbre retry si timeout      $3 port à ignorer

echo "-----------------------------------------" >> /var/log/MACS-PORTS
echo $1 >> /var/log/MACS-PORTS

snmpwalk -r $2 -v 1 -c public $1 1.3.6.1.2.1.17.4.3.1.1 > /tmp/MACS   2>/etc/null
snmpwalk -r $2 -v 1 -c public $1 1.3.6.1.2.1.17.4.3.1.2 > /tmp/PORTS  2>/etc/null
 
# elimine le debut, surtout les ::

sed 's/SNMPv2-SMI::mib-2.17.4.3.1.1/mib-2.17.4.3.1.1/' /tmp/MACS >/tmp/MACS2

sed 's/ = Hex-STRING: /:/' /tmp/MACS2 > /tmp/MACS3
# elimine en particulier espace qui pose pb

# remplace mib-2.17.4.3.1.2 par mib-2.17.4.3.1.1 dans PORTS

sed 's/SNMPv2-SMI::mib-2.17.4.3.1.2/mib-2.17.4.3.1.1/' /tmp/PORTS >/tmp/PORTS2
# pour trouver port correspondant a l'@MAC 

while IFS=: read  mib mac

do

 port=$(grep $mib /tmp/PORTS2 | cut -d ":" -f 2 |sed 's/ //')
# recherche port correspondant a l'@MAC
#                             port après ":"
#                                          espace en trop
 
 if [ $port != $3 ]
 then
  echo -e "$mac $port"  >>/var/log/MACS-PORTS
 fi

done < /tmp/MACS3


Ajout dans les tâches programmées

sur Fedora : commande crontab -e

Pour une interrogation chaque minute, ajouter la ligne :

* * * * /root/bin/macs-switches

Retour