
Vos VMs n’ont pas de réseau ? Vous ne savez pas si vous devez utiliser NAT ou Bridge ? Ce guide vous explique le modèle réseau libvirt et vous aide à configurer le bon mode.
| Situation | Mode | Ce que ça fait |
|---|---|---|
| Lab / développement | NAT (défaut) | VMs isolées, accès Internet via l’hôte |
| Services exposés / production | Bridge | VMs directement sur le LAN |
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- La différence entre L2 (bridge) et L3 (NAT/routage)
- Le fonctionnement du réseau NAT libvirt (virbr0 + dnsmasq)
- Comment créer un bridge pour exposer vos VMs
- Les commandes virsh essentielles pour le réseau
Concepts réseau : L2 vs L3
Section intitulée « Concepts réseau : L2 vs L3 »Avant de configurer, comprenez comment les paquets circulent.
| Couche | Ce qu’elle gère | Identifiant | Équipement |
|---|---|---|---|
| L2 (liaison) | Trames sur le même réseau | Adresse MAC | Switch |
| L3 (réseau) | Paquets entre réseaux | Adresse IP | Routeur |
Le point clé :
- Un bridge = switch logiciel = travaille en L2 (il regarde les MAC)
- Le NAT = travaille en L3 (il réécrit les IP)
virbr0 n’est pas “le NAT”
Section intitulée « virbr0 n’est pas “le NAT” »Confusion fréquente : virbr0 est un bridge (L2). Le NAT vient de :
<forward mode='nat'/>dans la définition XML- Des règles firewall ajoutées automatiquement par libvirt
Le bridge virbr0 est juste le switch interne qui connecte vos VMs entre elles et à l’hôte.
Le modèle réseau libvirt (NAT default)
Section intitulée « Le modèle réseau libvirt (NAT default) »Après installation de libvirt, un réseau “default” est créé automatiquement :
VM (eth0) → vnet0 → virbr0 → règles firewall (NAT) → interface physique → InternetCe que libvirt crée pour vous :
| Composant | Rôle |
|---|---|
| virbr0 | Bridge virtuel (switch L2 interne) |
| dnsmasq | Serveur DHCP + DNS pour les VMs |
| Règles firewall | NAT (MASQUERADE) pour l’accès Internet |
Les VMs obtiennent une IP en 192.168.122.x, avec l’hôte comme passerelle (192.168.122.1).
Objets réseau libvirt
Section intitulée « Objets réseau libvirt »| Objet | Ce que c’est | Exemple |
|---|---|---|
| Virtual Network | Réseau géré par libvirt | default (NAT) |
| Bridge | Switch virtuel | virbr0 |
| vNIC | Carte réseau d’une VM | Définie dans le XML |
| tap | Interface hôte connectée à une vNIC | vnet0, vnet1 |
Choisir NAT ou Bridge
Section intitulée « Choisir NAT ou Bridge »| Critère | NAT (default) | Bridge |
|---|---|---|
| Configuration | Automatique | Manuelle |
| IP des VMs | Privées (192.168.122.x) | LAN (même réseau que l’hôte) |
| Accès depuis le LAN | Non (sauf port forward) | Oui |
| Isolation | VMs isolées | VMs exposées |
| Cas d’usage | Lab, développement | Production, services |
Pourquoi le bridge “consomme une IP”
Section intitulée « Pourquoi le bridge “consomme une IP” »En mode bridge, chaque VM apparaît comme une machine physique sur le LAN. Elle obtient donc une IP du réseau (via DHCP ou statique). Si vous avez un plan d’adressage limité, c’est un point à considérer.
Mode NAT : vérifier et utiliser
Section intitulée « Mode NAT : vérifier et utiliser »Vérifier le réseau default
Section intitulée « Vérifier le réseau default »virsh net-list --allSortie réelle :
Name State Autostart Persistent-------------------------------------------- default active yes yesDécryptage :
| Colonne | Signification |
|---|---|
| State: active | Le réseau est démarré, les VMs peuvent l’utiliser |
| Autostart: yes | Démarre automatiquement au boot de l’hôte |
| Persistent: yes | Défini de façon permanente (pas juste en mémoire) |
Si le réseau n’est pas actif :
virsh net-start defaultvirsh net-autostart defaultVoir les détails du réseau
Section intitulée « Voir les détails du réseau »virsh net-info defaultSortie réelle :
Name: defaultUUID: 3f61d934-34f7-4f6d-b394-b186699c16f2Active: yesPersistent: yesAutostart: yesBridge: virbr0Le point clé : Bridge: virbr0 — c’est l’interface sur laquelle vos VMs seront connectées.
Voir la configuration complète (XML)
Section intitulée « Voir la configuration complète (XML) »virsh net-dumpxml defaultSortie réelle :
<network> <name>default</name> <uuid>3f61d934-34f7-4f6d-b394-b186699c16f2</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:a5:f2:39'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip></network>Décryptage ligne par ligne :
| Élément XML | Ce que ça fait |
|---|---|
<forward mode='nat'> | Active le NAT (MASQUERADE via iptables) |
<port start='1024' end='65535'/> | Ports sources utilisés pour le NAT |
<bridge name='virbr0'/> | Nom du bridge virtuel |
<ip address='192.168.122.1'> | IP de l’hôte sur ce réseau (passerelle) |
<dhcp><range.../> | Plage DHCP : .2 à .254 (253 IPs disponibles) |
Connecter une VM au réseau NAT
Section intitulée « Connecter une VM au réseau NAT »Avec virt-install :
virt-install --network network=default ...Ou dans le XML de la VM :
<interface type='network'> <source network='default'/> <model type='virtio'/></interface>Vérifier l’infrastructure côté hôte
Section intitulée « Vérifier l’infrastructure côté hôte »Le bridge virbr0 existe ?
ip addr show virbr0Sortie réelle :
178: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 52:54:00:a5:f2:39 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft foreverDécryptage :
state DOWN+NO-CARRIER= normal si aucune VM n’est connectéeinet 192.168.122.1/24= l’hôte est la passerelle pour les VMs
Le serveur DHCP (dnsmasq) tourne ?
ps aux | grep dnsmasq | grep libvirtSortie réelle :
libvirt+ 3754413 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf ...libvirt lance automatiquement dnsmasq pour fournir DHCP et DNS aux VMs.
Les règles NAT sont en place ?
sudo iptables -t nat -L LIBVIRT_PRT -n -vSortie réelle :
Chain LIBVIRT_PRT (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN 0 -- * * 192.168.122.0/24 224.0.0.0/24 0 0 MASQUERADE 6 -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 0 0 MASQUERADE 17 -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 0 0 MASQUERADE 0 -- * * 192.168.122.0/24 !192.168.122.0/24Décryptage : le trafic venant de 192.168.122.0/24 (vos VMs) vers l’extérieur est “masqué” (MASQUERADE = NAT dynamique).
Vérifier la connectivité depuis une VM
Section intitulée « Vérifier la connectivité depuis une VM »Une fois votre VM démarrée et connectée au réseau default :
# Dans la VMip addr # IP en 192.168.122.x ?ping -c 2 192.168.122.1 # Passerelle (l'hôte)ping -c 2 1.1.1.1 # Internethost google.com # DNS (fourni par dnsmasq)Mode Bridge : créer et configurer
Section intitulée « Mode Bridge : créer et configurer »En mode bridge, vos VMs sont directement connectées au réseau physique.
Identifier votre interface physique
Section intitulée « Identifier votre interface physique »ip link show | grep -E '^[0-9]+:' | grep -v -E 'lo|virbr|docker|veth|br-'Sortie exemple :
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ... state UP ...3: enp3s0: <BROADCAST,MULTICAST> mtu 1500 ... state DOWN ...L’interface UP (ici enp2s0) est celle connectée au réseau.
Méthode 1 : Netplan (Ubuntu 18.04+)
Section intitulée « Méthode 1 : Netplan (Ubuntu 18.04+) »C’est la méthode standard sur Ubuntu Server. Vérifiez votre config actuelle :
cat /etc/netplan/*.yamlExemple de config actuelle :
network: ethernets: enp2s0: dhcp4: true version: 2Créer un bridge — Modifiez le fichier (ou créez /etc/netplan/01-bridge.yaml) :
network: version: 2 ethernets: enp2s0: dhcp4: false # Plus de DHCP sur l'interface physique bridges: br0: interfaces: [enp2s0] # L'interface physique rejoint le bridge dhcp4: true # Le bridge obtient l'IP # OU pour IP statique : # addresses: [192.168.1.100/24] # routes: # - to: default # via: 192.168.1.1 # nameservers: # addresses: [192.168.1.1, 8.8.8.8]Appliquer (avec rollback automatique si échec) :
sudo netplan try # Applique pendant 120s, rollback si pas confirmé# Si OK, tapez ENTER pour confirmersudo netplan apply # Application définitiveMéthode 2 : NetworkManager (Fedora, RHEL, Ubuntu Desktop)
Section intitulée « Méthode 2 : NetworkManager (Fedora, RHEL, Ubuntu Desktop) »-
Identifier votre interface physique
Fenêtre de terminal nmcli device status -
Créer le bridge
Fenêtre de terminal sudo nmcli connection add type bridge ifname br0 con-name br0sudo nmcli connection modify br0 ipv4.method auto # ou manual pour IP statique -
Connecter l’interface physique au bridge
Fenêtre de terminal sudo nmcli connection add type bridge-slave ifname enp2s0 master br0 -
Activer le bridge
Fenêtre de terminal sudo nmcli connection down "Wired connection 1" # Connexion actuellesudo nmcli connection up br0 -
Vérifier
Fenêtre de terminal ip addr show br0 # Le bridge a l'IPbridge link show # enp2s0 est connecté au bridge
Vérifier le bridge créé
Section intitulée « Vérifier le bridge créé »ip addr show br0Sortie attendue :
XX: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ... state UP ... inet 192.168.1.100/24 ... # L'IP est sur le bridge, pas sur enp2s0bridge link showSortie attendue :
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... master br0 state forwardingL’interface physique (enp2s0) est maintenant esclave du bridge (master br0).
Déclarer le bridge dans libvirt (optionnel)
Section intitulée « Déclarer le bridge dans libvirt (optionnel) »Si vous voulez utiliser --network network=... plutôt que --network bridge=... :
cat > /tmp/host-bridge.xml << 'EOF'<network> <name>host-bridge</name> <forward mode="bridge"/> <bridge name="br0"/></network>EOF
virsh net-define /tmp/host-bridge.xmlvirsh net-start host-bridgevirsh net-autostart host-bridgeConnecter une VM au bridge
Section intitulée « Connecter une VM au bridge »Option directe (recommandée) :
virt-install --network bridge=br0 ...Ou dans le XML :
<interface type='bridge'> <source bridge='br0'/> <model type='virtio'/></interface>Vérifier la connectivité
Section intitulée « Vérifier la connectivité »# Sur l'hôte : la VM est connectée au bridgebridge link show br0# Doit montrer : eno1 + vnetX
# Depuis la VMip addr # IP du LAN (ex: 192.168.1.x)ping 192.168.1.1 # Passerelle du LAN
# Depuis une autre machine du LANping <ip-de-la-vm> # Doit répondreCommandes virsh essentielles
Section intitulée « Commandes virsh essentielles »| Commande | Description | Exemple de sortie |
|---|---|---|
virsh net-list --all | Lister les réseaux | default active yes yes |
virsh net-info <nom> | Détails d’un réseau | Bridge, UUID, état |
virsh net-dumpxml <nom> | Configuration XML complète | Voir plus haut |
virsh net-start <nom> | Démarrer un réseau | |
virsh net-autostart <nom> | Activer au boot | |
virsh domiflist <vm> | Interfaces d’une VM | vnet0 bridge virbr0 |
virsh domifaddr <vm> | IP d’une VM | Nécessite guest agent |
Dépannage rapide
Section intitulée « Dépannage rapide »| Symptôme | Diagnostic | Solution |
|---|---|---|
virsh net-list vide | virsh uri → qemu:///session | Configurer LIBVIRT_DEFAULT_URI |
| Réseau default inactif | virsh net-list → State inactive | virsh net-start default |
| VM n’obtient pas d’IP | ps aux | grep dnsmasq | Vérifier que dnsmasq tourne |
| VM pas de sortie Internet | sudo iptables -t nat -L | Vérifier règles MASQUERADE |
| Bridge br0 sans IP | ip addr show br0 | L’interface physique n’est pas esclave |
À retenir
Section intitulée « À retenir »-
NAT = réseau privé (192.168.122.x), VMs isolées, accès Internet via l’hôte. C’est le défaut libvirt.
-
Bridge = VMs sur le LAN, chaque VM consomme une IP, nécessite configuration manuelle.
-
virbr0 est un bridge L2. Le NAT vient de
<forward mode='nat'/>+ règles iptables (MASQUERADE). -
dnsmasq fournit DHCP + DNS aux VMs en mode NAT.
-
Netplan (Ubuntu) ou NetworkManager (Fedora/RHEL) pour créer un bridge.
-
Toujours avoir un accès console avant de modifier le réseau.
Prochaines étapes
Section intitulée « Prochaines étapes »Références
Section intitulée « Références »- libvirt — NAT forwarding (virtual networks) — Explication des règles NAT sur virbr0
- libvirt — Firewall and network filtering — Règles firewall gérées par libvirt
- Fedora — libvirt nftables — Migration vers nftables
- Red Hat — Configuring a network bridge — Guide officiel bridge