Pont réseau et tunnel pour VirtualBox

06/10/2008

J’utilise depuis peu VirtualBox, cela me permet de créer des serveurs virtuels sur une machine et donc de simuler un réseau dans mon pc. Le souci avec VirtualBox c’est qu’il utilise une méthode de “NAT” ne permettant pas aux autres ordinateurs du réseau local de voir mes machines virtuels. Il est possible de pallier à cela en créant un “pont tap/tun”. Mais avant de vous expliquer comment on le crée, il faut savoir ce qu’est un pont.

Je vous ai parlé de gateway ou passerelle avec iptables. La passerelle servant à faire communiquer deux réseaux entre eux même s’ils sont de classes ou de sous-réseaux différents. Le pont permet quant à lui de relier des machines de même réseau, et seulement de même réseau, entre elles. Un pont transforme votre ordinateur en un genre de hub ou switch.

                                [ Pont ]
                                  ____
         +----------------+----- /    \ -----+----------------+
         |                |                  |                |
         |                |                  |                |
 [A: 192.168.0.1]  [B: 192.168.0.2]  [C: 192.168.0.3] [D: 192.168.0.4]

Le pont va faire transiter les paquets venant des machines du groupe à gauche vers la droite si besoin, et inversement.

Un pont peut par exemple servir à relier deux groupes de machines se trouvant dans deux pièces différentes, ou même sur deux étages de votre entreprise. Notez que vous pouvez par exemple créer un pont avec une connexion wifi.

Prenons l’exemple de deux groupes de machine se trouvant à deux étage de l’immeuble:

         __________________________________________
         |                                         |
         |                                         |
         |              Etage 2                    |
         |                                         |
         |   C:192.168.0.3          D: 192.168.0.3 |
         |         |                        |      |
         |         |________________________|      |                           
         |                      |                  |
         |                      |                  |
         |                [Borne wifi ]            |                  
         |-----------------------------------------|
         |                                         |
         |                                         |
         |                   wlan0                 |
         |                [Pont réseau]            |
         |                   eth0                  |
         |                     |                   |
         |                     |                   |
         |         +----------------------+        |
         |         |                      |        |
         |  A: 192.168.0.1          B: 192.168.0.2 |
         -------------------------------------------

Le pont fera transiter les paquets qui arrivent sur la carte “eth0” vers wlan0 et donc arriveront sur la borne wifi au deuxième étage.

L’un des princiaux intérêts du pont réseau est de ne pas avoir à gérer une table de routage. Le pont fonctionnera simplement comme un switch.

  • - Prérequis**: Il faut que vos carte ethernet et/ou wifi puisse passer en mode “promiscious” (promiscuité), c’est à dire qu’elle puisse écouter tous les paquets qui transitent sur le réseau, y compris ceux qui ne lui sont pas adressé. Pour savoir si votre carte gère ce mode, essayez de faire:
ifconfig eth0 promisc
ifconfig eth0 | grep PROMISC

Si la seconde commande vous affiche en majuscule une ligne avec écrit “PROMISC” alors c’est gagné. Sinon, désolé…

Créer un pont sous linux se résume à faire: -créer une interface de pont “br0” par exemple et lui assigner une adresse ip -passer les carte pyshiques en mode promiscious avec un ip 0.0.0.0 -lier les cartes de liaison (eth0, wlan0…) au pont

Voici les commandes:

#on crée le bridge
brctl addbr br0

#on coupe nos cartes réseau
ifdown wlan0
ifdown eth0
#ou 
ifconfig eth0 down
ifconfig wlan0 down

#on passe ces carte en mode promiscious
ifconfig eth0 0.0.0.0 promisc up
ifconfig wlan0 0.0.0.0 promisc up

#on les lient au pont
brctl addif br0 eth0
brctl addif br0 wlan0

#on donne une ip au bridge
dhclient br0
#ou en statique
ifconfig br0 192.168.0.5 netmask 255.255.255.0 up

Vérifiez que vos cartes sont bien active en tapant “ifconfig”, et regardez si le pont a bien les cartes liées à lui même avec la commande brctl show.

Maintenant, l’interface réseau br0 est active, elle peut répondre au réseau venant de eth0 ou de wlan0 et peut faire transiter les paquets.

Pour couper le pont et revenir à l’état initial:

ifconfig br0 down
ifconfig eth0 down
ifconfig wlan0 down

ifconfig eth0 -promisc
ifconfig wlan0 -promisc

#on réassigne les ip
dhclient eth0 
dhclient wlan0 
#ou on demande une ip statique
ifconfig eth0 192.168.0.5 netmask 255.255.255.0 up
ifconfig wlan0 192.168.0.6 netmask 255.255.255.0 up
#ou on relance le service réseau
/etc/init.d/networking restart

Bref, relancez le réseau sur vos cartes de la façon que vous souhaitez. Vous avez compris, créer un pont revient à lier des cartes entre elles pour n’en faire plus qu’une.

Pourquoi utiliser un pont et pas un switch ? En fait, il n’y a pas de raison… le pont est plus lent qu’un switch, mais un pont sous linux permet aussi de pouvoir le coupler à “iptable” pour changer des routes… C’est une question de choix..

Là où le pont est quasi indispensable, c’est lors de l’utilisation de machine virtuelles. En effet, cette fois ci nous n’avons pas de carte réseau sur notre ordinateur que nous pouvons relier à la machine “invité”.

Je m’explique. Imaginons un Linux qui fasse tourner un windows en machine virtuelle sous Virtualbox. VirtualBox va simuler une carte réseau connecté à la machine virtuelle. Windows va la voir comme étant une carte réseau et va l’activer.

Il faudrait pouvoir relier un câble réseau entre cette carte et notre Linux… sauf que Windows n’est pas sur une machine physique. La solution: **un pont tap/tun**

Dans le même esprit que notre pont réseau présenté ci dessus, nous allons créer une interface virtuelle sur Linux. VirtualBox saura la lier à la carte trouvé sur le windows virtuelle: ce sera un tunnel.

      ------------------------------
      | Linux                      |                              B: 192.168.0.3
      |  +------------------------+|                              |
      |  |Pont               eth0 ||----------------------------LAN
      |  |                        ||                              |
      |  |(br0: 192.168.0.5)      ||                              A:192.168.0.2
      |  |                        ||                          
      |  | tap0                   ||                          
      |  +------------------------+|                          
      |     |                      |                          
      |     | (tunnel)             |                          
      |     |                      |                          
      |     |                      |                          
      |  [windows: 192.168.0.6]    |
      |                            |
      +----------------------------+                                               

Vous pouvez utilise tunctl ou openvpn pour créer l’interface sur votre machine. Je vous conseille fortement la seconde solution, la première devenant obsolète. Par contre, **le nom de l’interface devra être nommée tapX où X est un nombre** avec openvpn, c’est une contrainte à respecter.

Je préfère utiliser openvpn, mais si le coeur vous en dit, utilisez tunctl…

On note donc que eth0 est lié au LAN, fait parti du pont, reste à ajouter une inteface tap0.

openvpn --mktun --dev tap0
ifconfig tap0 up

#lier tap0 au pont
brctl addif br0 tap0

#IMPORTANT
chmod 0666 /dev/net/tun

Voilà… rien de bien complexe… Reste à dire à VirtualBox d’utiliser cette interface dans la partie “Réseau” de votre machine virtuel “Windows”.

Lors du boot de windows dans la VM, et si vous êtes sur un réseau avec DHCP (livebox, freebox, etc… ont un service DHCP par défaut), alors une adresse lui sera assigné.

A partir de là, les machine du LAN (A et B) ainsi que notre Linux peuvent accéder à la machine windows (adresse exemple: 192.168.0.6). Et inversement, la machine virtuelle windows pourra accéder à notre Linux via l’adresse 192.168.0.5, et aux machines du LAN

Le pont s’occupera de faire passer les paquets.

Pour couper le tunnel après avoir éteint la machine virtuelle:

ifconfig tap0 down
brctl delif tap0

openvpn --rmtun --dev tap0

On résume rapidement les commandes à taper pour monter le pont, les tunnels et les supprimer:

#création du bridge
brctl addbr br0

#notre carte réseau doit faire parti du pont
ifconfig eth0 down
ifconfig eth0 0.0.0.0 promisc up
brctl addif br0 eth0 

#assigner une ip au bridge
dhclient br0
#ou
ifconfig br0 192.168.... etc...

# ---- Pour chaque interface tap/tun à ajouter ---- #
#on crée une interface tap/tun
openvpn --mktun --dev tap0

#on l'active
ifconfig tap0 up

#on l'ajoute au pont
brctl addif br0 tap0

#IMPORTANT
chmod 0666 /dev/net/tun

Si vous avez plusieurs machine virtuelles à lancer, il fautdra configurer autant de tunnels que de machines.

openvpn --mktun --dev tap0
openvpn --mktun --dev tap1
openvpn --mktun --dev tap2

ifconfig tap0 up
ifconfig tap1 up
ifconfig tap2 up

brctl addif br0 tap0
brctl addif br0 tap2
brctl addif br0 tap2

#IMPORTANT
chmod 0666 /dev/net/tun

N’oubliez pas non plus: -faites bien un chmod 0666 /dev/net/tun pour que vos utilisateurs puissent écrire dans les tunnels -on ne peut pas supprimer une interface tant qu’elle est utilisée pas une machine virutelle -on ne peut pas utiliser une interface tunnel si on a oublié de l’activer -on ne peut pas aller sur le réseau si le tunnel n’est pas dans le pont -on se demande souvent pourquoi le pont ne fonctionne pas simplement parce qu’on a oublié ifconfig tap0 up -ces opérations doivent être faites en root ou via un sudo

Ces 3 points sont importants et à vérifier si vos tunnels ne marchent pas.

Bref, ceci est une introduction rapide au pont réseau, je développerai un peu plus le sujet en ce qui concerne la création du pont au démarrage de votre machine.

Mais ce sera pour plus tard.

[edit du 6 octobe]\\ J’ai zappé des ifconfig tap0 up… je les ai remi. Désolé

Ça peut vous intéresser aussi


Tunnel SSH local et renverse

J’ai déjà traité ce sujet il y a quelques ...


Orange et Linux

Je venais de dire à un collègue dans la journée ...


Orange et Linux suite

Continuons dans mon fabuleux souci de connexion entre mes machines ...


Passer de VMware à QEmu

J’utilisais, au travail, vmware pour faire fonctionner un XP ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Wise'n'Wild - 05/02/2009

Merci beaucoup pour ces infos très intéressantes. Dans mon cas j’ai installé virtual box avec les instructions fournies. Ca à marché sur le champ mais après un reboot plus rien! (sur une Ubuntu 8.04) Grâce à tes explications j’ai compris ce qui n’allait pas: br0 et eth0 avaient la même @MAC (normal) mais aussi la même @IP (pas normal!). J’ai mis l’@IP d’eth0 à 0.0.0.0 et tout est rentré dans l’ordre

M@t2802 - 16/07/2009

Bonjour,

Merci pour cet article, j’ai cherché sur plein de forum et aucune explication concrète (sauf des “tu as cherché sur google” ou “google est ton ami”) pour faire un pont sous linux (je suis sous deb et fedora).

Grace à toi j’ai pu rendre mes labs dynamips accessible depuis le net. :)

chris - 26/11/2009

Bonjour et d’abord Merci pour ce tuto : le premier qui fonctionne chez moi !

Par contre lorsque je lance kvm -m 512 /machine.img -net nic,name=tap0

j’ai Warning vlan 0 is not connect to host network …

@++

sybix - 02/03/2010

Un GRAND merci, sa a marcher, pour info je suis sur une gentoo, j’ai tout mis dans un script, un petit attention dans ta partie pour plusieurs virtualbox, il y a deux lignes identiques.

brctl addif br0 tap0 brctl addif br0 tap2 brctl addif br0 tap2

Voila. Sinon j’ai aussi besoin de charger un module complementaire pour les pont.

modprobe vboxnetflt

Et encore Merci

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.