VirtualBox, simplifer la gestion du réseau avec un hôte Ubuntu
Par Taltan le lundi, mars 24 2008, 13:15 - Ubuntu - Lien permanent
Comme vous aviez pu le remarquer, j'utilise depuis un moment Vmware Server sur Ubuntu pour virtualiser des environnements. A titre de comparaison, j'ai testé plusieurs fois VirtualBox, mais je suis toujours revenu vers Vmware Server... car (entre autre) sa gestion du réseau en mode pont est native, aucune manipulation particulière n'est à faire sous Ubuntu pour avoir plusieurs machines virtuelles dans le même LAN, ce qui n'est pas le cas de VirtualBox. Alors évidement un petit tour sur le Wiki Ubuntu Fr suffit pour configurer un mode pont pour Virtual Box, mais l'aspect manuel se cette configuration ne joue pas en sa faveur. Voila le pourquoi de ce script qui permets de permets d'activer | désactiver et de configurer (X interfaces virtuelles en mode pont pour X machines virtuelles VBox) un pont sur un hôte Ubuntu (doit fonctionner sur une autre distribution avec peut-être quelques modifs)
Quelques explications
Mode NAT (Network Adress Translation)
Par défaut, VBox est configuré en mode NAT, c'est à dire que la machine virtuelle (VM) accède au LAN (réseau local) à travers la machine hôte par un routage NAT. Elle est donc séparée du réseau local, elle communique sur le LAN en envoyant de requêtes en utilisant l'adresse IP de la machine hôte. La machine hôte joue en quelque sorte le rôle de serveur DHCP pour l'interface réseau de la VM. La VM accède donc à l'extérieur en passant par la machine hôte. Avec cette configuration, on peut donc accéder à internet à partir de la VM mais pas se connecter directement sur la machine hôte, par exemple pour tester des services offerts par celle ci (samba, ftp, web,...)
Mode pont (bridge)
En mode pont (bridged dans Vmware) la VM accède directement au LAN via une interface réseau virtuelle « pontée » sur l'interface physique de la machine hôte. Vu de LAN, il y a une nouvelle machine avec une adresse IP qui lui est propre (même plage que la machine hôte), la VM utilise le serveur DHCP qui est sur le LAN (si présent). Il s'agit en fait d'utiliser le dispositif TUN / TAP. Un dispositif TUN / TAP est vu comme une interface réseau (virtuelle) qui communique avec un programme utilisateur (logiciel de virtualisation par exemple) en lieu et place d'une vraie carte matérielle
- TUN pour « tunnel » qui simule du point à point, utilisé pour le mode NAT (routage) de VBox
- TAP pour simuler un périphérique Ethernet, utilisé pour le mode pont (adaptateur réseau hôte dans VBox)
Objectif du script
Ce script (bridging_vb_tap_v1.0.sh) a donc pour objectif :
- de créer à la demande (sans modifier en dur la configuration réseau de la machine hôte) plusieurs interface TAP (autant que de VM utilisant le mode « adaptateur réseau hôte » dans VBox) et de créer un pont pour les « ponter » à l'interface réseau physique (eth0 dans mon cas)
- de pouvoir revenir à la configuration réseau initial de la machine hôte
Dépendances
Nécessite les paquets bridge-utils et uml-utilities
$ sudo apt-get install bridge-utils uml-utilities
Script bridging_vb_tap_v1.0.sh
NB : _/!\ Principe de précaution, utiliser cette méthode uniquement si vous avez un minimum de connaissance dans la configuration à la mano (en ligne de commande) d'un réseau sous linux..._
#!/bin/bash
############################################################################################
# Taltan - http://www.taltan.fr - ola.taltan_AT_laposte.net #
############################################################################################
# Script bridging_vb_tap_v1.0.sh #
# Licence : GNU / GPL #
# Inspiré de la doc sur le wiki Ubuntu #
# - http://doc.ubuntu-fr.org/virtualbox_reseau#alternative #
# et du post de kesou sur le forum Ubuntu #
# - http://forum.ubuntu-fr.org/viewtopic.php?id=148609 #
############################################################################################
# Dans le cadre de l'utilisation de VirtuaBox en mode pont #
# - Création des interfaces réseaux virtuelles tapX #
# - Création du pont réseaux entre l'interface physique et les virtuelles #
############################################################################################
# Dépendances #
############################################################################################
# - Nécessite les paquets bridge-utils et uml-utilities #
# => sudo apt-get install bridge-utils uml-utilities #
############################################################################################
# 24/03/08 - v1.0 - Création #
############################################################################################
## Variables
gateway=192.168.0.254 # adresse ip de la passerelle
bridge=br0 # nom du pont
if_hote=eth0 # interface physique actuelle
DHCP=NO # DHCP pour le pont YES | NO
bridge_ip=192.168.0.1 # adresse ip du pont si DHCP=NO
bridge_mask=255.255.255.0 # masque du pont si DHCP=NO
bridge_bc=192.168.0.255 # adresse ip de broadcast si DHCP=NO
nb_tap=2 # nombre d'interfaces virtuelles tapX
vb_user=taltan # utilisateur de VirtualBox
## Fonction de mise en place du pont
start () {
chmod 0666 /dev/net/tun
brctl addbr $bridge # création du pont
brctl addif $bridge $if_hote # ajout de l'interface physique dans le pont
var0=0 # initialisation du compteur de tapX
while [ "$var0" -lt "$nb_tap" ]
do
name_tap=tap${var0} # initialisation du nom de l'interface virtuelle, tap0 pour la première, tap1, tap2...
tunctl -u $vb_user -t $name_tap # création de l'interface virtuelle
ifconfig $name_tap up # activation de l'interface virtuelle
brctl addif $bridge $name_tap # ajout de l'interface virtuelle dans le pont
ifconfig $name_tap 0.0.0.0 promisc up # configuration ip de l'interface virtuelle
let "var0 += 1" # incrémentation du compteur de tapX
done
ifconfig $if_hote 0.0.0.0 promisc up # configuration ip de l'interface physique
if [ "$DHCP" == "YES" ]; then # si DHCP=YES
dhclient $bridge # configuration dhcp pour le pont
sleep 10
else # si DHCP=NO
ifconfig $bridge $bridge_ip netmask $bridge_mask broadcast $bridge_bc # configuration manuelle pour le pont
fi
route add default gw $gateway # configuration de la passerelle pour le pont
brctl showstp $bridge # affiche les info sur le pont
}
## Arrêt et suppression du pont puis restauration de la configuration réseau initiale
stop () {
TESTPONT=$(/sbin/ifconfig | grep $bridge) # si aucun pont configuré, message
if [ -z "$TESTPONT" ]; then
echo "Attention : pont réseau non trouvé. Vérifier la config réseau ..."
exit 1
fi
ifconfig $bridge down # désactivation du pont
brctl delbr $bridge # suppression du pont
var0=0
while [ "$var0" -lt "$nb_tap" ] # pour chaque interface virtuelle tapX
do
name_tap=tap${var0}
tunctl -d $name_tap # suppression
let "var0 += 1"
done
ifconfig $if_hote down # restauration de la configuration réseau initiale
ifconfig $if_hote up
if [ "$DHCP" == "YES" ]; then
sleep 5
fi
ifconfig # affiche la configuration réseau
}
## information sur le bridge
info () {
brctl showstp $bridge
}
## Point d’entrée du script
case $1 in
start)
start $2
;;
stop)
stop $2
;;
info)
info $2
;;
*)
echo $"Utilisation: bridging {start|stop|info}"
exit 1
esac
exit 0
Pour une utilisation ponctuelle
N'oubliez pas de modifier les variables selon votre configuration... et de rendre le script exécutable. Placer le script dans un « path » de votre système Ubuntu
$ sudo cp bridging_vb_tap_v1.0.sh /usr/local/bin/bridging_vb_tap $ sudo chmod +x /usr/local/bin/bridging_vb_tap
Pour la mise en place du pont :
$ sudo bridging_vb_tap start
Résultat de la commande dans le cas de la création d'un pont avec eth0, tap0 et tap1 :
Arrêt et suppression du pont puis restauration de la configuration réseau initiale :
$ sudo bridging_vb_tap stop
Résultat de la commande :
Configuration de la VM dans VBox pour utiliser le mode bridge
Dans la configuration réseau de votre VM :
- cocher Activer l'adaptateur réseau
- choisir Adaptateur réseau hôte
- laisser l'adresse MAC par défaut
- cocher câble relié
- nom de l'interface : tap1 (ou tap0)
- laisser blanc application d'installation et de désinstallation
Et voila le tour est joué, depuis j'utilise très régulièrement VBox et je dois dire qu'en plus d'être GPL (ce que n'est pas VMware Server) je le trouve plus réactif que VMware Server (pas de troll svp
)
PS : Concernant l'installation de VBox sur Ubuntu 8.04 Hardy Heron, j'ai suivi la méthode décrite pour Ubuntu 7.10 Gutsy Gibbon dans le wiki Ubuntu, c'est pas très « propre », mais il n'y pas encore de dépôts officiels pour Hardy Heron sur le site de VirtualBox et ça marche nickel... Même chose pour l'activation de l'USB, il suffit de suivre le tuto sur le wiki














Commentaires
Rho, super ca ! C'est une des seule raisons qui me fait rebooter sur windows : la configuration réseau de VBox.
Avec un petit script ca va changer. J'avais essayé de bridger moi même la connexion mais c'est définitivement trop le bordel pour mon esprit formaté "graphical user interface".
Merci donc
Bon article, mais j'aurais plutôt dit :
"La machine hôte joue en quelque sorte le rôle de PROXY pour l'interface réseau de la VM"
à la place de :
"La machine hôte joue en quelque sorte le rôle de serveur DHCP pour l'interface réseau de la VM"
Qu'en penses tu??
Bonne continuation!
Xavier
Formidable
Merci.
Merci pour ce super script et avec les explications en plus !!!
Enfin j'arrive à voir mes VMs sur mon réseau.
Encore Merci
Mat.
Petite question .on : est-ce que ce genre de manip permettra à mes amis de voir mon TribalWeb ou Pando tournant chez moi sous Windows virtualisé ? (j'espère que j'ai été clair ;-))
Pour moi ce sera LA raison de ne plus rebooter sous Windows de temps en temps.
Absolument, ta VM Windows sera considérée comme une machine « physique » sur ton LAN, elle sera vu de l’internet comme une machine à part, pour peu que ta box soit configurée en mode routeur avec les règles NAT (translation d’adresse sur port) correctement configurées pour les services que tu veux rendre disponible sur la VM. Cf. schéma ci-dessous (les @ IP sont des exemples) :
http://www.taltan.fr/public/images/vboxbridge.png
Trop cool ! Pour une bonne nouvelle, c'est une bonne nouvelle !
Oui freebox configurée en mode router.
Bon bin c'est parti !
Je viens d'essayer ton script et il me permet effectivement de faire marcher le pont entre les deux machines. Le ping fonctionne mais par contre pas moyen d'accéder à Internet depuis la machine virtualisée. J'ai lu dans le tuto de la doc ubuntu (je crois) que le bridge peut ne pas marcher sur des interfaces wifi (ce que j'ai bien sur). Mais dans ce cas, le pont ne devrait pas du tout marcher entre les deux non?
J'aurais donc voulu savoir si tu avais bien accés à internet avec ton config depuis l'hote invité ou pas...
Merci encore pour ce tuto
Effectivement, le mode bridge ne fonctionne pas si l'hôte est en mode wifi, en tout cas, il ne fonctionne à priori qu'avec certains chipsets 802.11 et certains drivers...
Pour répondre à ta question, en Ethernet, avec ce script, j'accède à Internet avec l'hôte et la VM.
Le ping entre ton hôte et ta VM est effectivement étrange, peut-être que ton non accès à internet est juste dû un problème de conf réseau (masque, passerelle, dns,...) ?
Merci pour cette réponse rapide (et matinale :))...
Ok donc tu confirmerais ce que je pense, à savoir que mon bridge fonctionne bien mais que mon non acces à internet viendrait plus d'un probleme de config. Je te remercie grandement et je vais me pencher davantage sur mon probleme et poster un petit message sur le forum Ubuntu.
Merci encore pour ton tuto
Ahhh super le tutos !
Merci bien,pour script, bien expliqué en plus !
Salut,
J'ai installé la version 1.6 de Virtualbox et depuis cela fonctionne plus !
Mais je ne trouve pas pourquoi !
si jamais quelqu'un d'autre test et que cela fonctionne ... j'apprécierais l'aide ...
Merci pour ce script, ça marche très bien. J'ai essayé de suivre la procédure de la doc d'ub-fr mais j'arrivais déjà pas à trouver de vbox-network XD.
Enfin, chapeau l'artiste, vais pouvoir créer un vrai ptit réseau d'apprentissage maintenant :-).
Pour mon régler mon problème avec la version 1.6, j'ai changé l'interface Amd PCnet par une Intel Pro 1000 et ça fonctionne !
Merci pour l'info, ça pourra servir...
Bonjour,
d'abord merci pour le tuto c'est du beau boulot. J'ai néanmoins le problème suivant : lorsque j'affiche les infos du pon t avec brctl br0 je vois que mes interfaces eth0 et tap0 ne sont pas en état learning mais forwarding, de plus le paramètre port id est à 0000 au lieu d'être à 8001 et 8002.
donc bien sur ça ne marche pas mais je pense plutôt que ça vient du côté de ma config mais je ne vois pas où... une idée ?
Gaspard
Super merci.
Le pont fonctionne a merveille sur la 1.5.6 OSE
Par contre avec la version 1.6.0 de sun,
la communication de tap0 vers le pont n'a pu l'air de fonctionner quel dommage.
Pourtant je n'ai rien changé ( j'utilise le rpm sur mandriva 2008.0 )
QQun a eu le soucis également ?
A+
MAJ: je vais essayer avec la carte intel pro 1000 cité par PiOuP
Salut taltan !
J'aurais plusieurs questions a te soumettre.
J'utilise depuis aujourd'hui ton script afin de tester un peu le mode bridge avec VirtualBox car pour le moment j'utilisais toujours le NAT.
En modifiant 2 ou 3 petites choses à la main après le démarrage ou l'arrêt du script tout fonctionne nickel et j'aurais aimé savoir (parce que je suis curieux) si tu avais une idée de ce qui pouvait faire que cela ne marche pas direct avec simplement ton script.
Pour info, je suis sur Kubuntu 7.10 avec VBox v1.6.
Ce qui bricole au démarrage, c'est que malgré le chmod 0666 /dev/net/tun, je me retrouve quand même avec le /dev/net/tun en crw-rw---- 1 root root 10, 200 2008-03-02 17:06 tun
alors que si je lance la commande (le chmod 0666) à la main, cela passe bien en crw-rw-rw-
Une idée de ce qu'il peut se passer pour que le script ne change pas les droits correctement ?
L'autre souci c'est sur le "stop":
tap0 est bien retiré du bridge, le bridge est bien détruit, mais je ne récupère pas d'ip sur mon eth0.
Il faut que je lance un dhclient à la main. Il semblerait que le ifconfig eth0 down/ifconfig eth0 up, ne déclenche pas de demande dhcp.
Là encore, une idée ?
Merci encore pour ton script, et peut être saura tu m'aider.
@+
bonjour, dans le cas d'une utilisation d'une machine hote windows serveur 2003 et d'une invit ubuntu pensez vous que ce script sois utilisable?
merci en tous cas sa m'aide un peu dans ce bordel
@bosco: Le script que taltan nous propose est un script bash, peu de chances qu'il fonctionne dans un environnement Windows !
Regardes du coté des ponts réseau dans la gestion des connexions réseau de ton windows pour obtenir l'équivalent.
C'est pas bien compliqué, c'est tout à la souris...
Bon courage.
Merci beaucoup pour ton excellent script.
ça marche au poil, et c'est très bien commenté, du joli boulot.
Salut,
J'essai en vain de faire fonctionner un hote XP et un invité ubuntu mais sans succès...
J'ai créé un topic sur le forum-hardware.fr avec les différents tests.
si une âme charitable peut m'aider
C'est ici :
http://forum.hardware.fr/forum2.php...
Salut,
je viens de m'apeprcevoir d'un petit bug dans ton script pourtant je l'utilise depuis un certain temps déja (et je m'en était pas apperçu)
En gros, tu rajoutes un route par défaut en dehors du else. C'est juste deux lignes à inverser (le "fi" avec le "route add ..."). C'est pas un truc fondamental car le script fonctionne mais c'est juste pour rectifier ton code qui est déja très propre et très clair.
Et comme je vois que je suis pas le seul à avoir un bug avec les droits du tunel, voila la modif que j'ai faite : j'ai rajouté la ligne pour les droits à la fin de la fonction start (je sais qu'elle y est en double maintenant. j'ai pas essayé de supprimer la première ligne).
au finale ça donne ça :
start () {
chmod 0666 /dev/net/tun
brctl addbr $bridge # création du pont
brctl addif $bridge $if_hote # ajout de l'interface physique dans le pont
var0=0 # initialisation du compteur de tapX
while [ "$var0" -lt "$nb_tap" ]
do
name_tap=tap${var0} # initialisation du nom de l'interface virtuelle, tap0 pour la première, tap1, tap2.$ tunctl -u $vb_user -t $name_tap # création de l'interface virtuelle
ifconfig $name_tap up # activation de l'interface virtuelle
brctl addif $bridge $name_tap # ajout de l'interface virtuelle dans le pont
ifconfig $name_tap 0.0.0.0 promisc up # configuration ip de l'interface virtuelle
let "var0 += 1" # incrémentation du compteur de tapX
done
ifconfig $if_hote 0.0.0.0 promisc up # configuration ip de l'interface physique
if [ "$DHCP" == "YES" ]; then # si DHCP=YES
dhclient $bridge # configuration dhcp pour le pont
sleep 10
else # si DHCP=NO
ifconfig $bridge $bridge_ip netmask $bridge_mask broadcast $bridge_bc # configuration manuelle pour le pont
route add default gw $gateway # configuration de la passerelle pour le pont
fi
brctl showstp $bridge # affiche les info sur le pont
chmod 0666 /dev/net/tun #affectation des bon droits pour le tunnel
}
En tout cas très bon tuto. Je l'ai conseillé à plusieurs personnes.
Bonne continuation.
PS : l'erreur généré par les deux ligne inversées est la suivante :
SIOCADDRT: Le réseau n'est pas accessible.
Salut,
Ton script est vraiment top, et la manip devient simple !!!
Par contre j'ai une question et du coup un avis a demander
J'ai créé une vbox sous WinXP car le VPN de mon boulot utilise le client VPN Nortel qui ne fonctionne correctement que sous Windows. J'ai voulu essayer de tricher en lancant le client Nortel sur la VBox pour ensuite pouvoir accéder a ce réseau sous mon linux. Et j'ai rien pu faire, je me suis dis que j'allais créer 2 réseaux (tap0 et tap1), que j'allais lancé le VPN sur l'un et que j'utiliserai l'autre pour la communication avec mon linux, mais tout cela sans succès malheureusement !! car le VPN me bloque les com des 2 réseaux !
Avez vous une idée de solution ??
Outils trèèèèès interessant, par contre j'ai une question ( en fait comme bcp de monde.)
J'ai un jolie machine hôte en UBUNTU HH 4.03 et j'ai un windows XP en machine invité. Pour mon travail je suis amené a changer très souvent d'IP et de passerelle et j'ai besoin de me servir d'un programme qui scanne mes materiels et de commande ping ( ca ne fonctionne pas en NAT ) sachant que j'ai 24 configurations differente pour le moment, faut 'il que je fasse 24 scripts different???
Et aussi si je dois faire plein de scripts, existe t'il un moyen d'automatiser ca en creant une petite appli comme ca se faisait sous dos avant ( genre un petit menu sympa qui me guiderai dans mes errances laborieuses...)
Merci par avance!
Un grand merci, pour ce script.
Juste une petite chose, qui je pense pourrai éviter une perte de temps, serait de prévenir que ce n'est pas (du tout ?) compatible avec une carte Wifi.
Merci, encore.
Ce n'est pas que c'est pas compatible avec les cartes wifi, c'est seulement qu'il faut des cartes wifi spécifiques genre Atheros qui permettent de changer l'adresse MAC qu'elle envoie sur le réseau. (si je me souviens bien)
J'ai suivi le tuto à la lettre, ca marche NIKEL !
Si , comme moi, vous êtes avec un hote Ubuntu virtualisant 2 VM sous XP, pensez à virer le firewall sinon, ca elles ne ping pas entre elles !
Le script proposé par taltan est propre efficace, et je tiens à te remercier grandement pour ton aide ! Tu viens de me faire gagner énormément de temps ! MERCI et joyeux noel
Pour l'information, ce script ne fonctionne pas avec toute une série de portables sur lesquels on ne peut pas utiliser la carte reseau ethernet en même temps que le wifi.
Eh merci beaucoup ca fonctionne a merveille tres bon boulot
Salut à tous
Merci pour les explications très claires sur le fonctionnement du mode pont (bridge).
Dans la version actuelle (2.2.2 au moment où j'écris ces ligne), plus besoin du script, on peut faire le pont directement depuis Virtualbox, par contre il faut toujours installer bridge-utils et uml-utilities.
Bye
Bonjour ;
C'est pas mal mais franchement, tu te complique bien la vie puisque tous ce que fait ton script peut être transcrit dans le fichier /etc/network/interfaces qui est employé par les commandes ifup et ifdown. ifconfig et route sont en quelque sorte les commandes bas niveau de la configuration réseau. Elles sont utilisées par les commandes ifup et ifdown. Bref, pourquoi faire simple quand on peut faire compliqué. A noter que tunctl peut être invoqué directement à partir du fichier /etc/network/interfaces et que bridge-utils fournit une extension pour le format du fichier interfaces...