ADeLLA.org ADeLLA.org

Accueil du site > Documentation > Réseau > QEMU - Configurer le réseau

QEMU - Configurer le réseau

mardi 6 mars 2007, par daniel


Introduction

QEMU permet d’executer des machines virtuelles sur une machine physique : Définition de Wikipedia

il est possible d’utiliser le réseau dans qemu de différentes manières :

- User mode network

- TAP network interfaces

  • Host-only
  • NAT
  • Bridged

User mode network

C’est le méthode la plus simple pour accéder au web. Il ne nécessite pas les privilèges de root. Inconvénient : La machine hôte ne peut pas accéder aux ressources de la machine virtuelle.

Dans ce cas, il n’y a rien de spécial à faire, qemu se comporte comme une passerelle/pare-feu et, si l’accès à internet est configuré sur la machine hôte, le web sera aussi disponible pour la machine cliente.

Un service DHCP (propre à qemu) attribuera automatiquement une adresse IP à la machine cliente et lui fournira les adresses de la passerelle et du serveur DNS.

Sur la machine cliente, il faudra activer DHCP client (attribuer automatiquement une adresse IP). Il est possible aussi d’utiliser une IP statique. Il faudra dans ce cas renseigner :
- Passerelle par défaut : 10.0.2.2
- Masque de réseau : 255.255.255.0
- Serveur DNS : 10.0.2.3

qemu -hda qemu_xp.img -net user


TAP network interfaces

Permet de créer une interface virtuelle sur notre machine hôte qui se nommera tapN (tap0, tap1, ...). Cette interface pourra être utilisée pour créer un routage de type NAT ou bien un accès direct sur le réseau (bridged).

1-Activer l’interface tap :

Dans tous les cas (Host-only, NAT ou bridged), il faudra activer une interface tapN.

l’utilitaire tunctl est nécessaire. Une fois installé, ouvrir le fichier /etc/udev/permissions.d/50-udev.permissions et modifier la ligne qui concerne le device tun :

tun:root:root:0666

sur une mandriva, il faudra modifier le fichier /etc/udev/rules.d/50-mdk.rules :

KERNEL=="tun", SYMLINK+="net/%k", , MODE="0666"

redémarrer udev et charger le module :

/etc/init.d/udev restart
modprobe tun

vérifier que ce module est bien chargé :

lsmod | grep tun
tun         8864  0

vérifier que ce module est accesible en lecture/écriture pour tous :

ls -l /dev/tun
crw-rw-rw-  1 root root 10, 200 fév 27 10:20 /dev/tun

qemu a besoin d’un script qui permet de créer l’interface tap. Ce script est automatiquement executé par qemu dans le mode TAP network. Le script sera différent selon qu’on utilise le mode Host-only, NAT ou bridged (vous trouverez des exemples spécifiques ci-dessous). Il faudra rendre ce script executable :

chmod 755 /etc/qemu-ifup

Pour que ce script fonctionne, il faut que l’utilisateur normal ait le droit d’executer les commandes qui sont invoquées dans le script. Il faudra donc modifier le fichier /etc/sudoers.

Exemple de fichier sudoers qui fonctionnera pour tous les types de réseau (Host-only,NAT ou Bridged) :

Cmnd_Alias QEMU=/sbin/ifconfig, /sbin/modprobe, /usr/bin/tunctl, /usr/sbin/brctl, /sbin/ip, /sbin/dhclient
daniel ALL=NOPASSWD: QEMU

Vous pourrez adapter ce fichier à votre configuration (chemins, executables nécessaires, utilisateurs, ...).

2-Host-only :

Dans ce mode, la machine virtuelle a accès uniquement à la machine hôte.

exemple du fichier /etc/qemu-ifup dans le mode Host-only :

#!/bin/sh
echo "Configure $1 interface..."
sudo -p "Password for $0:" /usr/bin/tunctl -u 'daniel' -t $1
echo "Activating link for $1..."
sudo -p "Password for $0:" /sbin/ip link set $1 up
echo "IP address on $1..."
sudo -p "Password for $0:" /sbin/ifconfig $1 192.168.2.1 broadcast 192.168.2.255 netmask 255.255.255.0
echo "Done."

Adapter ce script à votre configuration (chemins, nom d’utilisateur, adresse réseau désirée, ...).

Et maintenant testez votre réseau :

qemu -hda qemu_xp.img -net nic -net tap
Configure tap0 interface...
Activating link for tap0...
IP address on tap0...
Done.

Vous pouvez vérifier qu’une nouvelle interface réseau a bien été créée :

ifconfig
tap0      Link encap:Ethernet  HWaddr FA:0B:C9:B1:AC:21
         inet adr:192.168.2.1  Bcast:192.168.2.255  Masque:255.255.255.0
         adr inet6: fe80::f80b:c9ff:feb1:ac21/64 Scope:Lien
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:500
         RX bytes:0 (0.0 b)  TX bytes:432 (432.0 b)

Il faudra aussi configurer le réseau sur la machine cliente, par exemple 192.168.2.2.

3-NAT :

La configuration est identique au mode Host-only sauf qu’en plus, il faut configurer une passerelle sur notre machine hôte.

Cela se résume à activer le forward de paquets IP (transfert des paquets) et activer le masquerading (masquage des paquets IP) :

- Activer le forwarding : Tout simplement en tapant cette commande :

echo "1" >> /proc/sys/net/ipv4/ip_forward

Pour qu’il soit activé à chaque démarrage (sur une mandriva), ajouter dans le fichier /etc/sysconfig/network :

FORWARD_IPV4=true

- Activer le masquerading : Il faut ajouter une règle iptables à la table NAT :

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

la configuration réseau de la machine cliente devra être modifiée, Dans notre exemple :
- Adresse IP : 192.168.2.2
- Masque : 255.255.255.0
- passerelle par défaut : 192.168.2.1

4-Bridged :

Dans ce mode, notre machine virtuelle a accès directement au LAN. L’utilitaire brctl est nécessaire pour créer un bridge et doit-être installé.

Le principe consiste à configurer les interfaces eth0 et tap0 en mode promiscuite (c’est à dire qu’elles écoutent tout, même ce qui ne les concerne pas) et de les rajouter dans le bridge br0.

exemple du fichier /etc/qemu-ifup dans le mode Bridged :

#!/bin/sh
INTERFACE_LAN=eth0
INTERFACE_BRIDGE=br0

echo "Configure $1 interface..."
sudo -p "Password for $0:" /usr/bin/tunctl -u 'daniel' -t $1
echo "Activating link for $1..."
sudo -p "Password for $0:" /sbin/ip link set $1 up
sleep 1
echo "Configure $INTERFACE_BRIDGE bridge..."
sudo -p "Password for $0:" /usr/sbin/brctl addbr $INTERFACE_BRIDGE
sudo -p "Password for $0:" /usr/sbin/brctl addif $INTERFACE_BRIDGE $1
sudo -p "Password for $0:" /usr/sbin/brctl addif $INTERFACE_BRIDGE $INTERFACE_LAN
echo "Activating promiscuous mode on $1 and $INTERFACE_LAN..."
sudo -p "Password for $0:" /sbin/ifconfig $1 0.0.0.0 promisc up
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_LAN 0.0.0.0 promisc up
sleep 2
echo "IP address on $INTERFACE_BRIDGE..."
# static
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_BRIDGE 192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0
# or dhcp
# sudo -p "Password for $0:" /sbin/dhclient br0
echo "Done."

On teste notre réseau :
qemu -hda qemu_xp.img -net nic -net tap

la commande ifconfig affiche maintenant 3 interfaces (eth0, tap0 et br0) :

br0       Link encap:Ethernet  HWaddr 00:0D:87:F3:06:4F
         inet adr:192.168.1.1  Bcast:192.168.1.255  Masque:255.255.255.0
         adr inet6: fe80::20d:87ff:fef3:64f/64 Scope:Lien
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:323402 errors:0 dropped:0 overruns:0 frame:0
         TX packets:130299 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:0
         RX bytes:156816836 (149.5 MiB)  TX bytes:16901096 (16.1 MiB)

eth0      Link encap:Ethernet  HWaddr 00:0D:87:F3:06:4F
         adr inet6: fe80::20d:87ff:fef3:64f/64 Scope:Lien
         UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
         RX packets:321695 errors:0 dropped:0 overruns:0 frame:4066
         TX packets:244189 errors:0 dropped:0 overruns:0 carrier:19
         collisions:40108 lg file transmission:1000
         RX bytes:149447785 (142.5 MiB)  TX bytes:50003105 (47.6 MiB)
         Interruption:20

tap0      Link encap:Ethernet  HWaddr CE:86:70:8A:95:6E
         adr inet6: fe80::cc86:70ff:fe8a:956e/64 Scope:Lien
         UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:500
         RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Il faudra ensuite configurer le réseau de notre machine virtuelle :
- Adresse IP : 192.168.1.2
- Masque : 255.255.255.0

Notre machine virtuelle a maintenant accès à notre LAN comme si nous utilisions une machine physique !

Notre script modifie la configuration du réseau sur notre machine hôte. Il est souhaitable de tout reconfigurer lors de l’arrêt de notre machine virtuelle. Pour cela, il suffit de créer un script qui executera qemu et réinitialisera notre réseau lorsque l’execution de qemu sera terminée. par exemple, nous pouvons créer un fichier run_qemu.sh :

#!/bin/bash

INTERFACE_LAN=eth0
INTERFACE_BRIDGE=br0

# start qemu
echo "Start qemu ..."
qemu -hda ~/images_qemu/qemu_xp.img -net nic -net tap
sleep 2

# on desactive le bridge
echo "Deleting bridge ..."
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_BRIDGE down
sleep 1
# on supprime le bridge
sudo -p "Password for $0:" /usr/sbin/brctl delbr $INTERFACE_BRIDGE
echo "Stop promiscuous mode ..."
# on supprime le mode promiscuite
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_LAN -promisc down

sleep 1
# on reconfigure l'interface eth0
echo "IP address on $INTERFACE_LAN ..."
# static
sudo -p "Password for $0:" /sbin/ifconfig $INTERFACE_LAN 192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0

# or dhcp
# sudo -p "Password for $0:" /sbin/dhclient eth0
echo "Done."

Rendre executable : chmod 755 run_qemu.sh

Execution du script jusqu’à l’arrêt de notre machine virtuelle :

./run_qemu.sh
Start qemu ...
Configure tap0 interface...
Activating link for tap0...
Configure br0 bridge...
Activating promiscuous mode on tap0 and eth0...
IP address on br0...
Done.
Deleting bridge ...
Stop promiscuous mode ...
IP address on eth0 ...
Done.

Conclusion

Comme nous l’avons vu, il est très simple d’accéder à internet via notre machine virtuelle en executant qemu en User mode network. Ce mode convient bien à une utilisation classique du web (surf, messagerie,...).

Par contre si l’on désire avoir accès à des services plus avancés (comme par exemple joindre un domaine NT), on sera obligé d’utiliser le mode bridged.

Voir aussi :
- j’émule, tu émules, il émule...
- qemu-launcher, ou comment utiliser Qemu simplement

Si vous avez des commentaires ou vous constatez des omissions, n’hésitez pas à me contacter.


20/03/2007

Répondre à cet article


Suivre la vie du site | Valid HTML 4.01! | Valid CSS! | Plan du site | Espace privé | SPIP