Wifi dans User Mode Linux

Introduction

Le projet Wifi for UML propose un outil pour faire participer une machine UML à un réseau Wifi simulé (mode ad-hoc uniquement).

Pour l'utiliser, il faut :

Le plus simple pour commencer est d'utiliser des briques toutes prêtes (voir mode d'emploi ci-dessous). Cependant si les briques existantes ne sont pas satisfaisantes, il est possible de les reconstruire (voir explications ci-dessous).

Installation

Installation du simulateur

  1. vérifiez que vous disposez de QT
  2. dans le répertoire UML, téléchargez wl-0.1.tgz (copie locale) et décompressez
  3. dans le répertoire UML/wl-0.1, tapez 'qmake'
  4. dans le répertoire UML/wl-0.1, tapez 'make'
  5. si l'étape précédente fait apparaître des erreurs, effectuez les modifications suivantes dans le fichier UML/wl-0.1/wlobject.cpp avant de refaire un make :

Téléchargement d'un noyau UML adapté

  1. déterminez le noyau utilisé par l'hôte ('uname -r')
  2. dans le répertoire UML/Noyaux, téléchargez un des 2 fichiers suivants :
  3. rendez le fichier téléchargé exécutable : 'chmod +x linux-wl-2.6host'

Système de fichiers

Dans le répertoire UML/SysFich téléchargez le système de fichiers root_fs_debian2.2_small.bz2 et décompressez-le. Ce systèmme de fichiers contient les modules associés au noyau ci-dessus et correspondant au pilote hostap adapté et à l'implémentation du NIST d'AODV ("kernel AODV").

Démarrage et première utilisation

note sur la mobilité dans le simulateur :
Ce simulateur ne permet pas de spécifier les mouvements des noeuds. Le répertoire UML/wl-0.1 contient un fichier ".uml_wifi.cfg" qui indique la probabilité qu'un noeud a de se déplacer et sa vitesse de déplacement. Si vous ne voulez pas que les noeuds bougent, mettez 'fix_probability' à 1, et bien sur si vous voulez que tous les noeuds bougent (les mouvements seront aléatoires) mettez cette probabilité à 0 (avant de démarrer le simulateur). Pour la suite de cette partie, désactivez la mobilité (fix_probability=1). J'ai étendu le simulateur pour permettre la description de mouvements individuels controlés; voir MobUML.

  1. lancez le simulateur : dans le répertoire UML/wl-0.1, tapez './wl'
  2. dans une autre fenêtre/console de l'hôte, lancez une première machine UML : Noyaux/linux-wl-2.6host umid=ordi0 ubd0=cow0,SysFich/root_fs_debian2.2_small
    normalement, la machine UML doit booter et 2 consoles (intitulées "Virtual Console #1 et #2 (ordi0)") doivent apparaître en plus de la fenêtre depuis laquelle la machine UML a été lancée
  3. connectez-vous dans une des consoles (user : root, mot de passe : root)
  4. installez la carte sans fil virtuelle : dans la machine UML, tapez 'modprobe hostap_uml'
    à ce point, une image d'ordinateur portable entourée d'un grand rond jaune a du apparaître dans la fenetre du simulateur lancé au point 1 (utilisez éventuellement les curseurs ou le zoom out)
  5. configurez la carte sans fil : dans la machine UML, tapez 'iwconfig wlan0 mode ad-hoc' puis 'ifconfig wlan0 192.168.100.10 up'
  6. répéter les étapes 2 à 5 de manière à disposer d'une seconde machine UML (en changeant le nom de la machine UML (ordi1), le nom du fichier cow (cow1) et l'adresse IP (en restant dans le même sous-réseau, par exemple 192.168.100.11)
  7. cliquez sur un des ordinateurs au centre d'un disque jaune et amenez le à proximité de l'autre mais sans que l'ordinateur n'entre dans sa zone, comme dans la figure ci-dessous :
  8. Dans la console virtuelle ordi0, tapez ping 192.168.100.11
    Comme ordi1 n'est pas dans la zone de ordi0, ordi0 ne reçoit pas de réponse à ses pings.
  9. Approchez à présent les deux ordinateurs l'un de l'autre. Dans la console de ordi0 les "pongs" apparaissent (64 bytes from 192.168.100.11: icmp_seq=417 ttl=64 time=123.4 ms) et les paquets échangés entre les 2 machines sont représentés par des points noirs dans le simulateur :

  10. répétez les étapes 2 à 5 de manière à disposer d'une troisième machine UML, configurée en 192.168.100.13
  11. disposez les machines de la manière suivante :
  12. depuis la machine ordi0, lancez des pings vers la machine ordi2. Comme ordi2 n'est pas dans la zone de ordi0, ordi0 ne reçoit pas de réponse à ses pings.
  13. démarrez AODV : dans les 3 machines UML, tapez 'modprobe kernel_aodv_22 use_dev=wlan0'. On peut visulaiser l'échange de paquets "hello".
  14. activez le forward IP : dans les 3 machines UML, tapez 'echo 1 > /proc/sys/net/ipv4/ip_forward'
  15. répétez l'étape 12, les pings sont maintenant relayés par ordi1, qui connait une route vers ordi2 et ordi0 reçoit maintenant des "pongs".
  16. vous pouvez par exemple lancer un tcpdump sur ordi1 : 'tcpdump -i wlan0'
  17. pour terminer, arretez toutes les machines UML (shutdown -h now) puis quittez le simulateur.

Compilation de briques personnalisées

Noyau UML construit spécifiquement pour Wifi for UML

Si les noyaux compilés disponibles sur le site ne contiennent pas les options que l'on désire par ailleurs (par exemple "CONFIG_FILTER" à "yes" pour faire fonctionner un serveur DHCP), il reste la possibilité de construire soi-même un noyau spécifiquement pour Wifi for UML en incluant netbus (les explications suivantes correspondent à la traduction des instructions données sur le site, complétées par des corrections que j'ai du apporter pour résoudre un problème connu d'UML) :

  1. téléchargez linux-2.4.24.tar.bz2 et décompressez-le (par exemple dans UML/Noyaux/ et renommez linux-2.4.24 en linux-2.4.24-wifi)
  2. téléchargez uml-patch-2.4.24-1.bz2 dans le répertoire UML/Noyaux/linux-2.4.24-wifi et appliquez le patch (bzcat uml-patch-2.4.24-1.bz2 | patch -p1)
  3. téléchargez uml-netbus-0.1.tgz (copie locale) et décompressez (par exemple dans /UML/Wifi/)
  4. copiez les fichiers netbus_kern.c et netbus_user.c dans le répertoire arch/um/driver/ du noyau en construction (cp UML/Wifi/uml-netbus-0.1/netbus_* UML/Noyaux/linux-2.4.24-wifi/arch/um/drivers/)
  5. copiez le fichier netbus.h dans le répertoire arch/um/include/ du noyau en construction (cp UML/Wifi/uml-netbus-0.1/netbus.h UML/Noyaux/linux-2.4.24-wifi/arch/um/include/)
  6. appliquez le patch fourni dans uml-netbus-0.1 au noyau en construction (dans UML/Noyaux/linux-2.4.24-wifi : cat ../../Wifi/uml-netbus-0.1/uml-netbus-0.1.patch | patch -p1)
  7. configurez le noyau : make xconfig ARCH=um
    dans Network Devices choisir y pour virtual bus support
    dans Wireless LAN (non-hamradio) choisir y pour Wireless LAN
  8. (pour le noyau 2.4.24) modifiez le fichier arch/um/os-Linux/process.c :
  9. compilez le noyau : make dep ARCH=um && make linux ARCH=um

Patcher et insérer le module hostap

(les explications suivantes correspondent à la traduction des instructions données sur le site)

  1. téléchargez hostap-driver-0.1.2.tar.gz (copie locale) et décompressez-le (par exemple dans UML/Wifi/)
  2. téléchargez hostap-uml-0.1.tgz (copie locale) et décompressez-le (par exemple dans UML/Wifi/)
  3. copiez le fichier hostap_uml.c fourni par hostap-uml-0.1 dans le répertoire driver/modules/ du driver hostap (cp hostap-uml-0.1/hostap_uml.c hostap-driver-0.1.2/driver/modules/)
  4. appliquez le patch fourni par hostap-uml-0.1 au répertoire du driver hostap (dans UML/Wifi/hostap-driver-0.1.2 : cat ../hostap-uml-0.1/hostap-uml-0.1.patch | patch -p1)
  5. modifiez le Makefile du hostap-driver pour que KERNEL_PATH pointe vers le noyau UML (/home/galtier/UML/Noyaux/linux-2.4.24-wifi)
  6. compilez le driver pour UML : make uml

Le répertoire UML/Wifi/hostap-driver-0.1.2/driver/modules doit maintenant contenir hostap_crypt_wep.o, hostap_uml.o et hostap.o. Une fois le simulateur wl démarré et une machine UML patchée bootée, il suffit d'insérer les modules hostap :

mount none /mnt -t hostfs 
insmod /mnt/home/galtier/UML/Wifi/hostap-driver-0.1.2/driver/modules/hostap.o
insmod /mnt/home/galtier/UML/Wifi/hostap-driver-0.1.2/driver/modules/hostap_uml.o

Références