Aller au contenu
English
English
Virtualisation medium

Bridge KVM sans NetworkManager (Debian/Ubuntu ifupdown)

30 min de lecture

Vous utilisez Debian ou Ubuntu serveur sans NetworkManager ? Cette recette vous montre comment créer un bridge avec ifupdown pour connecter vos VMs au LAN.

  • Relever la configuration réseau avant d'y toucher, passerelle comprise
  • Créer un bridge dans /etc/network/interfaces, sans NetworkManager
  • Y rattacher une VM et vérifier qu'elle obtient une adresse du LAN
  • Revenir en arrière si la machine perd le réseau

Une condition n'apparaît pas dans la liste et conditionne pourtant tout le reste : le réseau de l'hôte doit réellement être piloté par ifupdown, donc par le fichier /etc/network/interfaces. Un Ubuntu Server récent est livré avec netplan et n'a même pas ce fichier ; si ls /etc/netplan/ rend des fichiers YAML, c'est lui qui décide et il faut suivre la méthode Netplan du guide réseau. L'accès console est le seul point non négociable de la liste.

  • Debian 11+ ou Ubuntu Server 20.04+
  • Pas de NetworkManager (vérifier avec systemctl status NetworkManager)
  • Accès root
  • Accès console (IPMI, KVM physique) en cas de perte d'accès SSH

Trois valeurs sont à relever avant de toucher au moindre fichier, et ce sont exactement celles que vous allez recopier dans le bridge : le nom de l'interface, son adresse IP et la passerelle. La seconde commande donne la vue la plus lisible, ip -br link affichant une ligne par interface avec son état. Notez-les ailleurs que sur la machine elle-même : si la manipulation échoue, vous en aurez besoin depuis la console.

Fenêtre de terminal
# Interface physique et IP actuelle
ip addr show
# Nom de l'interface (ex: eno1, enp3s0, eth0)
ip -br link | grep -v lo
# Passerelle actuelle
ip route show default

Notez :

  • Le nom de l'interface physique (ex: eno1)
  • L'IP actuelle (ex: 192.168.1.100/24)
  • La gateway (ex: 192.168.1.1)

Cette copie n'est pas une formalité : elle est la seule voie de retour si le réseau ne remonte pas, et la section de restauration plus bas ne fait rien d'autre que la remettre en place. Faites-la avant la première édition, jamais après avoir commencé à modifier le fichier, sinon vous sauvegardez déjà l'état cassé. Gardez le suffixe .backup en tête : ifupdown ne lit que /etc/network/interfaces et ignore ce fichier.

Fenêtre de terminal
sudo cp /etc/network/interfaces /etc/network/interfaces.backup

Le principe tient en deux lignes de configuration. La carte physique passe en inet manual, c'est-à-dire montée mais sans adresse, et le bridge br0 reprend l'adresse, le masque et la passerelle qu'elle portait. La directive bridge_ports est ce qui les relie : elle dit quelles interfaces deviennent des ports du switch. Ces directives bridge_* viennent du paquet bridge-utils, d'où la première étape ci-dessous.

  1. Installer bridge-utils (si pas déjà installé)

    Fenêtre de terminal
    sudo apt install bridge-utils
  2. Éditer /etc/network/interfaces

    Fenêtre de terminal
    sudo nano /etc/network/interfaces

    Remplacez la configuration existante par :

    /etc/network/interfaces
    # Loopback
    auto lo
    iface lo inet loopback
    # Interface physique : pas d'IP, esclave du bridge
    auto eno1
    iface eno1 inet manual
    # Bridge avec IP statique
    auto br0
    iface br0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 1.1.1.1
    bridge_ports eno1
    bridge_stp off
    bridge_fd 0
  3. Appliquer la configuration

    Fenêtre de terminal
    sudo systemctl restart networking

    Ou sur les anciennes versions :

    Fenêtre de terminal
    sudo ifdown eno1 && sudo ifup br0
  4. Vérifier

    Fenêtre de terminal
    # Le bridge a l'IP
    ip addr show br0
    # L'interface physique est dans le bridge
    bridge link show
    # Connectivité
    ping -c 2 192.168.1.1
    ping -c 2 1.1.1.1

Une fois br0 en place, libvirt n'a rien à configurer : on lui passe directement le nom de l'interface système, et non un objet réseau libvirt comme pour le NAT. C'est la différence à retenir entre les deux modes, le XML la porte lui aussi avec type='bridge' et source bridge= là où le NAT utilise type='network'. La VM obtiendra son adresse du DHCP du LAN, pas de dnsmasq.

Dans virt-install :

Fenêtre de terminal
virt-install --network bridge=br0 ...

Ou dans le XML de la VM :

<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>

La procédure de secours tient en deux commandes, et c'est tout l'intérêt d'avoir sauvegardé avant : on remet le fichier d'origine, on relance le réseau, l'hôte retrouve l'adresse qu'il avait. Tapez-les depuis la console, jamais en SSH, puisque c'est justement la session SSH qui est tombée. Si restart networking ne suffit pas, ifdown br0 && ifup eno1 reprend la main interface par interface.

Si vous perdez l'accès, depuis la console :

Fenêtre de terminal
sudo cp /etc/network/interfaces.backup /etc/network/interfaces
sudo systemctl restart networking

Les deux configurations qui suivent partent du même fichier et ne changent qu'une ligne ou deux. La première fait entrer le bridge dans un VLAN étiqueté, la seconde ajoute un bridge isolé à côté du premier. Elles se combinent sans difficulté, mais appliquez-les l'une après l'autre : un fichier /etc/network/interfaces modifié sur trois points d'un coup se diagnostique beaucoup moins facilement.

Le cas typique est un hôte relié à un port trunk : la carte physique reçoit plusieurs VLAN étiquetés, et vous ne voulez exposer les VMs que sur l'un d'eux. La déclaration intermédiaire eno1.100 crée l'interface VLAN (ici le VLAN 100) et c'est elle, pas eno1, qui devient le port du bridge. La directive vlan-raw-device indique la carte porteuse.

/etc/network/interfaces
auto eno1
iface eno1 inet manual
auto eno1.100
iface eno1.100 inet manual
vlan-raw-device eno1
auto br0
iface br0 inet static
address 192.168.100.10
netmask 255.255.255.0
gateway 192.168.100.1
bridge_ports eno1.100
bridge_stp off
bridge_fd 0

Rien n'oblige un bridge à posséder un port physique. C'est ce que dit bridge_ports none : br1 existe, porte une adresse, commute les trames entre les VMs qui s'y branchent, et ne mène nulle part en dehors de l'hôte. On obtient ainsi deux domaines de diffusion séparés sur la même machine, br0 vers le LAN et br1 entre VMs, sans toucher au matériel.

/etc/network/interfaces
auto br0
iface br0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
bridge_ports eno1
bridge_stp off
bridge_fd 0
auto br1
iface br1 inet static
address 10.0.0.1
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0

br1 est un bridge isolé (pas connecté au réseau physique), utile pour des labs internes.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn