nemo.png

Pour faire des trucs rigolos en réseau, le mieux, c'est d'avoir un endroit où l'on peut expérimenter, sans risquer de casser. C'est ce que propose Cloonix (ou Clownix, z'ont pas l'air bien sur de comment ils l'écrivent, on trouve des 2 dans leurs sources).

Cloonix, donc, permet de créer des morceaux de réseaux virtuels, en manipulant des machines virtuelles (UML ou KVM), et de les relier entres elles. Plusieurs "images" sont proposées, basées sur Openwrt, Debian, Ubuntu, Fedora.

Le lancer

Pour démarrer, il suffit de récupérer l'archive sur leur page "downloads". Moi, j'ai pris l'archive « 7.0 pour Ubuntu 10.04 32 bits », qui se rapproche le plus de l'environnement où je vais l'utiliser (Debian/Testing, 32 bits). Prévoir suffisament de place pour le décompresser (environ 1,5 Go). Pour les dépendances, rien de compliqué, il faut juste screen et ssh (mais tout le mone utilise déjà, non ?). Pour ceux qui voudraient recompiler, c'est indiqué dans le fichier README.

Une fois décompressé, ça se lançant simplement avec : « ./start_cloonix_net ». On peut configurer les chemins utilisés (par défaut, il met tout son bazar dans /tmp/cloonix_switch/), le port utilisé, etc. en modifiant le script start_cloonix_net, et pas le fichier cloonix_config.xml qui est réécrit à chaque démarrage. Si tout se passe bien, le démarrage doit vous afficher un truc qui ressembler à ça :

[...]
uml_cloonix_switch now running, to kill: 
       ./ctrl -kill
Screen is in background, to get it:
       screen -r 18571.Cloonix-Net-Lab
Now, you can call 
       ./graph

On y voit une allusion à screen (voir si vous ne savez pas vous en servir). Celui ci, lorsqu'on le rattache, va servir à visualiser les consoles des machines virtuelles que l'on lance. On aura un « screen » par machine lancée, qui arrive sur un prompt [NomMachine> où on est connecté en tant que root. On peut y voir le déroulé du boot, ou tapoter des commandes. Si on efface tout dans une toplogie (delete topo dans le menu de graph), en cours, la session de screen se terminera. Un nouveau sera lancé, si on créer une nouvelle topologie. On peut lister les sessions existantes avec screen -ls, ce qui peut donner :

$ screen -ls
There is a screen on:
       22630.Cloonix-Net-Lab   (13/09/2010 22:38:40)   (Detached)

Il suffit de le rattacher avec le bon numéro pour récupérer ce qu'il s'y passe.

L'interface graphique

Une fois le switch de Cloonix lancé, on peut lancer également l'interface graphique. Depuis le répertoire où on l'a décompressé, c'est tout simple : ./graph. Normalement, ça lance une fenêtre avec des boutons verts sur le côté, qui ressemble à ça :

Fenêtre Cloonix

Le menu général de l'application s'obtient avec le bouton droit. Oui, il n'y a pas de choix pour quitter. Il suffit de fermer la fenêtre. Et si on relance graph sans avoir arrêté le switch de Cloonix, on retrouve les machines dans l'état où elles étaient, graph permettant juste de visualiser ce qu'il se passe.

Les boutons se manipulent en faisant un drag-n-drop vers l'espace de travail. Ils ont la signigication suivante :

lan : permet de créer un nouveau « lan », ie un espace de communication entre les cartes réseau. On peut un peu voir ça comme un switch virtuel (ou un VLAN au sein d'un switch). Ça crée un disque gris, avec son nom dedans.

vm : permet de créer des machines virtuelles. Un clic droit sur le bouton permet de configurer la vm à créer : virtualisation avec UML ou KVM, choisir l'image (les images proposées sont fonction du type), le nombre d'interfaces réseau, et le nombre de ports série. Lorsque qu'on créer la vm, un disque rouge apparait (avec le nom dedans), doté de bourgeons. Verts pour les interfaces réseau, cyan pour les ports séries, et un violet, qui correspond à l'interface permettant aux outils de Cloonix de communiquer avec la vm, et qui est reliée via slirp2tux au monde extérieur. Chaque bourgeon est numéroté, et celà correspond au numéro d'interface à l'intérieur de la vm. Une fois qu'une vm a fini de booter, son disque devient violet (corollaire : si il ne devient pas violet, c'est qu'un truc déconne dans son démarrage).

Pour relier une interface réseau à un lan, il faut double-cliquer sur celui-ci (il devient magenta) puis sur l'interface réseau. Un trait apprait pour matérialiser le lien. Un clic-droit sur un lien permet d'ouvrir le menu, pour l'effacer.

tux : //revenir la dessus quand j'aurai un exemple//

t2t : permet de relier 2 tux ensemble. Par exemple pour relier 2 instances de Cloonix sur 2 machines différentes, via TCP.

tap : permet de créer une interface tap sur la machine hôte. On peut par ce biais là participer au réseau virtuel depuis l'hôte. Voire amener un switch virtuel vers le réseau phyisque, si on intègre ensuite cette interface tap à un pont (voir brtctl).

On peut déplacer l'espace de travail en cliquant-glissant sur le fond. On peut zoomer/dézoomer avec la molette.

Sur un exemple, avec 2 clients (HOST1 et HOST2), et un routeur (ROUTER1) pour les relier, ça donne quelque chose comme ça :

2 clients et 1 routeur

La ligne de commande

Enfin, il y a l'outil ctrl (ou cloonix_ctrl), qui permet de manipuler les lan, vm'' et autres depuis la ligne de commande. Pour l'exemple ci-dessus, on peut lui demander d'afficher la topologie en cours :

$ ./ctrl -t
ROUTER1 U
       eth0:  vlan_two
       eth1:  vlan_one
       eth2: 
       eth3: 
       eth4:  cloonix_slirp_vlan
HOST1 U
       eth0:  vlan_one
       eth1: 
       eth2:  cloonix_slirp_vlan
HOST2 U
       eth0:  vlan_two
       eth1: 
       eth2:  cloonix_slirp_vlan
tux:/tmp/cloonix_switch/slirp_admin_lan_tux:  cloonix_slirp_vlan

Le fichier de configuration

Enfin, depuis la GUI, on peut charger et enregistrer des fichiers de configuration, qui contiennent une description en XML (beurk ;-) de la topologie. Toujours avec le même exemple, ça donne ça :

<TOPOLOGY>
<config_path>    .    </config_path>
       <VM>
               <name>         ROUTER1    </name>
               <type>         UML    </type>
               <mem>          128    </mem>
               <linux>        linux_debuml    </linux>
               <rootfs>       debuml    </rootfs>
               <eth>
                       <mac>     02:00:00:01:00:00    </mac>
                       <vlan>    vlan_two    </vlan>
               </eth>
               <eth>
                       <mac>     02:00:00:01:00:01    </mac>
                       <vlan>    vlan_one    </vlan>
               </eth>
               <eth>
                       <mac>     02:00:00:01:00:02    </mac>
               </eth>
               <eth>
                       <mac>     02:00:00:01:00:03    </mac>
               </eth>
       </VM>
       <VM>
               <name>         HOST1    </name>
               <type>         UML    </type>
               <mem>          128    </mem>
               <linux>        linux_debuml    </linux>
               <rootfs>       debuml    </rootfs>
               <eth>
                       <mac>     02:00:00:04:00:00    </mac>
                       <vlan>    vlan_one    </vlan>
               </eth>
               <eth>
                       <mac>     02:00:00:04:00:01    </mac>
               </eth>
       </VM>
       <VM>
               <name>         HOST2    </name>
               <type>         UML    </type>
               <mem>          128    </mem>
               <linux>        linux_debuml    </linux>
               <rootfs>       debuml    </rootfs>
               <eth>
                       <mac>     02:00:00:05:00:00    </mac>
                       <vlan>    vlan_two    </vlan>
               </eth>
               <eth>
                       <mac>     02:00:00:05:00:01    </mac>
               </eth>
       </VM>
</TOPOLOGY>

On y retrouve tout ce qu'on avait : la définition des vm, des lan. On peut même y préciser les adresses MAC des interfaces réseau.

Si vous vous demandez comment on fait pour donner des noms via l'interface graphique, et bien moi aussi ;-)

Pour les exemples que je donnerai ici, ce sont les fichiers XML de description des topologies, ainsi que les éventuels fichiers annexes que je vous transmettrai.

Ah oui, une dernière chose importante. Pendant leur exécution, les machines virtuelles fonctionnent avec des fichiers « COW » (Copy On Write) basés sur le fichier d'image sélectionné. Ces fichiers (stockés par défaut dans /tmp/cloonix_switch/vm_workdir) sont supprimés après l'arrête d'une vm. Mais il est possible de définir ses propres scripts, qui peuvent être exécutés avant les scripts de démarrage de la distribution émulée.