Suivant: , Monter: Machines virtuelles   [Table des matières][Index]


5.1 Pont réseau pour QEMU

Par défaut, QEMU utilise un moteur réseau hôte en « mode utilisateur », qui est pratique comme il n’a pas besoin de configuration. Malheureusement, il est aussi très limité. Dans ce mode, la VM (machine virtuelle) invitée peut accéder au réseau de la même manière que l’hôte, mais elle ne peut pas être atteinte depuis l’hôte. De plus, comme le mode de réseau utilisateur de QEMU se base sur ICMP, les outils de réseau basés sur ICMP comme ping ne fonctionnent pas dans ce mode. Ainsi, il est souvent préférable de configurer un pont réseau, qui permet à l’invité de participer pleinement au réseau. Cela est nécessaire, par exemple, lorsque l’invité est utilisé comme serveur.

5.1.1 Créer une interface réseau pont

Il y a plusieurs manières de créer un pont réseau. La commande suivante indique comment utiliser NetworkManager et son outil en ligne de commande nmcli, qui devrait déjà être disponible si votre déclaration de système d’exploitation se base sur l’un des modèles de systèmes de bureau :

# nmcli con add type bridge con-name br0 ifname br0

Pour que ce pont fasse partie de votre réseau, vous devez associer votre pont réseau à l’interface Ethernet utilisée pour vous connecter au réseau. En supposant que cette interface est nommée ‘enp2s0’, la commande suivante peut être utilisée pour cela :

# nmcli con add type bridge-slave ifname enp2s0 master br0

Important : Seules les interfaces Ethernet peut être ajoutées à un pont. Pour les interfaces sans fil, envisagez l’approche par réseau routé détaillée dans Voir Réseau routé pour libvirt.

By default, the network bridge will allow your guests to obtain their IP address via DHCP, if available on your local network. For simplicity, this is what we will use here. To easily find the guests, they can be configured to advertise their host names via mDNS.

5.1.2 Configuring the QEMU bridge helper script

QEMU comes with a helper program to conveniently make use of a network bridge interface as an unprivileged user voir Network options dans QEMU Documentation. The binary must be made setuid root for proper operation; this can be achieved by adding it to the privileged-programs field of your (host) operating-system definition, as shown below:

(privileged-programs
 (cons (privileged-program
         (program (file-append qemu "/libexec/qemu-bridge-helper"))
         (setuid? #t))
       %default-privileged-programs))

The file /etc/qemu/bridge.conf must also be made to allow the bridge interface, as the default is to deny all. Add the following to your list of services to do so:

(extra-special-file "/etc/qemu/host.conf" "allow br0\n")

5.1.3 Invoking QEMU with the right command line options

When invoking QEMU, the following options should be provided so that the network bridge is used, after having selected a unique MAC address for the guest.

Important : By default, a single MAC address is used for all guests, unless provided. Failing to provide different MAC addresses to each virtual machine making use of the bridge would cause networking issues.

$ qemu-system-x86_64 [...] \
    -device virtio-net-pci,netdev=user0,mac=XX:XX:XX:XX:XX:XX \
    -netdev bridge,id=user0,br=br0 \
    [...]

To generate MAC addresses that have the QEMU registered prefix, the following snippet can be employed:

mac_address="52:54:00:$(dd if=/dev/urandom bs=512 count=1 2>/dev/null \
                           | md5sum \
                           | sed -E 's/^(..)(..)(..).*$/\1:\2:\3/')"
echo $mac_address

5.1.4 Networking issues caused by Docker

If you use Docker on your machine, you may experience connectivity issues when attempting to use a network bridge, which are caused by Docker also relying on network bridges and configuring its own routing rules. The solution is add the following iptables snippet to your operating-system declaration:

(service iptables-service-type
             (iptables-configuration
              (ipv4-rules (plain-file "iptables.rules" "\
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i br0 -o br0 -j ACCEPT
COMMIT
"))

Suivant: Réseau routé pour libvirt, Monter: Machines virtuelles   [Table des matières][Index]