Nicolas Blancpain Grégoire Sirou A3 Réseau Projet A3 - Partie 1a Détection du commutateur racine Sources disponibles sur les comptes : ~gsirou/TestDiscoverLAN-groupes_1a_2_4_7_10.tar.gz. ~jlestic/upload/TestDiscoverLAN-groupes_1a_2_4_7_10.tar.gz. I. Le spanning tree, ou comment connaître la racine ? 1. L’algorithme Le spanning tree est un algorithme permettant de trouver un arbre de recouvrement minimum. Celui-ci est découvert par l’échange entre les commutateurs de trames au format 802.1d, une implémentation du protocole du spanning tree. Exemple d’arbre minimum : Dans un réseau, l’arbre de recouvrement minimum : Ne contient aucune boucle Est suffisant pour assurer que l’on peut atteindre toutes les stations du réseau Le protocole 802.1d utilise les messages contenant, entre autres, les informations suivantes : Root ID : identification de la racine actuelle Cost : Coût du lien de plus faible coût entre le switch qui transmet le message et la racine Transmitting ID : identification du port qui émet L’élection se fait sur ces paramètres. Les messages sont envoyés en multicast (@dest=tous les commutateurs) mais ne sont jamais retransmis par les commutateurs. 2. Construction du spanning tree Au démarrage, un commutateur se considère comme la racine et transmet un message 802.1d avec comme coût 0 et sur tous les ports. Sur chaque port, le commutateur reçoit en permanence les messages 802.1d et sauvegarde pour chaque port le meilleur message. Si un commutateur reçoit sur un port un meilleur message 802.1d que celui qu’il transmettrait, il arrête de transmettre son message 802.1d. Le protocole converge lorsqu’un seul commutateur transmet ses messages 802.1d sur le réseau. 3. Détermination de la racine Dans un réseau, la racine est : le commutateur avec le plus petit identificateur ou un commutateur désigné par l’administrateur Chaque commutateur peut déterminer quelle est la racine en analysant tous les messages 802.1d reçus. II. Le programme 1. Java Native Interface, ou comment former nos paquets ? Java ne donne pas accès aux couches basses réseaux.. Pour former nos trames 802.1d il va donc falloir contourner cette limitation en utilisant JNI. JNI (NNI dans java 1.0) permet d’interfacer du C/C++ à du java. Nous avons donc créé deux fonctions natives, l’une permettant d’écouter le réseau (cf snoop) et l’autre d’émettre des trames 802.1d. Pour simplifier le port de notre programme, nous avons utilisé les librairies libnet et libpcap, car elles sont déjà disponibles sur un grand nombre d’OS 2. La partie Java Nous créons une trame 802.1d spoofée qui contient les valeurs suivantes : Destination : 01:80:c2:00:00:00 Source : 00:00:00:10:11:12 Flags : 0x80 (adresse multicast des commutateurs) (adresse qui permet de détecter notre trame) (notification de changement de topologie) Les autres paramètres n’ont ici pas d’influence. Le CRC32 de la trame est calculé, puis la trame est envoyée. La seconde partie du programme consiste à sniffer le réseau, dans l’attente d’une trame 802.1d différente de celle spoofée. Une fois qu’une telle trame est reçue, le programme extrait le root et l’enregistre dans la base de donnée du module 10. Liste des fichiers : -rw-------rw-------rw-------rw-------rw-------rw-------rw-------rw-------rw------- 1 gsirou 1 gsirou 1 gsirou 1 gsirou 1 gsirou 1 gsirou 1 gsirou 1 gsirou 1 gsirou 1000 1000 1000 1000 1000 1000 1000 1000 1000 1303 Jan 719 Jan 422 Jan 1523 Jan 1815 Jan 1550 Jan 5906 Jan 2367 Jan 820 Jan 18 17:19 18 17:19 24 14:45 24 14:50 24 14:59 18 17:23 24 15:15 18 17:23 24 14:57 Groupe1a_Snoop.h Groupe1a_SockRaw.h Main.java ProtoDescr.java Send.java Snoop.c Snoop.java SockRaw.c SockRaw.java include pour interfaçage libpcap include pour interfaçage libnet main Description générique de protocole Envoie la trame 802.1d spoofée Interfaçage C entre libpcap/JAVA Sniffe les trames 802.1d du réseau Interfaçage C entre libpnet/JAVA Envoi de trames ethernet Pour plus d’informations sur les classes Java, il faut consulter la documentation HTML (format javadoc) : http://isep.myip.org/TestDiscoverLAN/ Pour recréer la documentation, utiliser javadoc à partir du répertoire TestDiscoverLAN/src/ : javadoc -author -private -d ~/doc Groupe1a/*.java