Tutorat de programmation réseau
(Polytech’Lille, département IMA, quatrième année).
Pont virtuel.

Xavier Redon

1  Cahier des charges

Durant ces travaux pratiques vous écrirez une application établissant un pont virtuel au dessus d’un réseau TCP/IP. Cette application peut être utilisée pour établir un réseau privé au dessus d’un autre réseau et, de ce fait, passer outre certaines régles de filtrage.

2  Indications pratiques

Pour réaliser ce pont virtuel vous utiliserez des interfaces Ethernet virtuelles du système d’exploitation Linux (interfaces tap). La création de ces interfaces par des utilisateurs normaux n’est pas autorisée. Un dispositif spécial vous permet de donner le droit à vos exécutables de créer de telles interfaces. Copiez votre exécutable dans /tmp et lancez la commande super setcap avec comme paramètre le nom de l’exécutable. Il vous faut ensuite configurer l’interface en lui affectant une adresse IP. Utilisez pour cela la commande super ifconfig.

Vous pouvez télécharger l’archive http://rex.plil.fr/Enseignement/Reseau/TP.Reseau.IMA4sc/VirtualBridge.tar. Cette archive contient un makefile et divers fichiers qu’il vous suffit de remplir pour créer votre projet. En particulier le fichier libnet.c contient une fonction permettant de créer une interface virtuelle.

3  Pont virtuel

Il vous est proposé d’écrire un programme se comportant comme un serveur TCP. Il écoute sur un port donné et attend les connexions de clients.

Le programme se charge alors de transmettre les paquets entre les différents clients. Il est conseillé d’envoyer les paquets en deux étapes : envoyer d’abord la taille du paquet puis le paquet lui même.

Un soin particulier doit être apporté à la lecture des paquets, la primitive read ne permettant pas de spécifier un nombre minimum d’octets à lire. Vous pouvez utiliser une fonction comme celle proposée ci-dessous.

int read_fixed(int descripteur,unsigned char *array,int size){
int bytes=0;
while(bytes<size){
  int offset=read(descripteur,array+bytes,size-bytes);
  if(offset<=0) return -1; else bytes += offset;
  }
return bytes;
}

Pour arriver à écrire ce serveur TCP sans création de processus fils (ni même de processus légers) vous allez utiliser la primitive poll. Cette primitive permet d’écouter simultanément sur plusieurs descripteurs de fichiers ou de sockets pour attendre une activité sur l’un d’eux. Dans le cadre du pont virtuel vous écouterez simultanément sur la socket d’écoute et sur toutes les sockets de dialogue.

4  Client du pont

Le processus client se comporte comme un client TCP. Il va se connecter sur le pont virtuel qui joue le rôle de serveur TCP. Il va aussi ouvrir une interface Ethernet virtuelle.

Pour lire un paquet sur l’interface virtuelle un simple read suffit, la taille du paquet est retourné par le read.

Pour pouvoir écouter à la fois sur l’interface virtuelle et sur la connexion réseau sans utiliser de processus légers vous utiliserez, là aussi, la primitive poll.

Dans le cadre du client du pont vous écouterez simultanément sur le descripteur de l’interface virtuelle et sur la socket de dialogue.

5  Test

Pour tester vos exécutables, établissez un pont virtuel entre des machines de travaux pratiques de l’école et des machines de projet. Utilisez le réseau IPv4 192.168.X.0/24 pour numéroter les machines dans votre pont virtuel où X est un nombre qui vous est propre.

Vérifiez qu’en utilisant votre réseau privé vous pouvez vous connecter des machines de projet vers les machines de TP par ssh.

Vérifiez qu’en utilisant votre réseau privé vous pouvez envoyer un ping en diffusion et que toutes les machines du pont répondent.

6  Pour aller plus loin

Vous pouvez améliorer la bande passante de votre pont virtuel. Pour l’instant un paquet reçu sur une interface est envoyé à tous les clients. C’est le comportement d’un répéteur. Pourquoi ne pas transformer votre répéteur en un commutateur en implantant un tableau des adresses MAC des émetteurs par client. Vous pourriez ainsi n’envoyer les paquets qu’aux clients auquels ils sont destinés.

Une autre fonctionnalité serait de crypter les paquets envoyés sur les sockets Internet. Vous auriez ainsi une vraie solution de réseau virtuel privé c’est à dire sécurisé.


Ce document a été traduit de LATEX par HEVEA