Aller au contenu

Bridge ou NAT pour votre Homelab ?

Mise à jour :

Lorsque vous travaillez avec des machines virtuelles, comprendre les modes réseau disponibles est essentiel pour répondre à vos besoins en connectivité. Les deux modes les plus populaires, le bridge et le NAT, offrent des solutions adaptées à différents scénarios.

Dans ce guide, nous allons approfondir ces modes réseau, explorer leurs fonctionnalités, apprendre à les configurer, et déterminer lequel choisir en fonction de vos besoins.

Introduction

Les machines virtuelles (VM) nécessitent une connectivité réseau pour interagir avec le monde extérieur, que ce soit pour accéder à Internet, communiquer avec d’autres machines locales ou être accessibles depuis le réseau. Deux solutions principales s’offrent à vous :

  • Le mode bridge : Vos VM obtiennent une adresse IP sur le réseau local, comme si elles étaient des machines physiques connectées directement au réseau.
  • Le mode NAT : Vos VM utilisent l’adresse IP de l’hôte pour accéder à Internet, tout en restant isolées du réseau local.

Ces modes réseau sont à la base de toute infrastructure virtuelle bien pensée et sont indispensables pour tout administrateur système souhaitant optimiser la connectivité de ses VM.

Historique

Au début de la virtualisation, les besoins étaient simples : permettre aux VM d’accéder à Internet pour les mises à jour et les téléchargements.

Le NAT (Network Address Translation) suffisait largement. Cependant, avec l’évolution des architectures réseau et l’adoption massive de la virtualisation, les besoins se sont complexifiés. Les entreprises ont commencé à déployer des applications critiques sur des VM, nécessitant une intégration plus étroite avec le réseau local.

C’est là que le bridge est devenu indispensable, permettant aux VM de communiquer directement avec le réseau local, comme si elles étaient des machines physiques.

Comparaison entre Bridge et NAT

Le mode Bridge

  • Adresse IP individuelle : Chaque VM reçoit une adresse IP distincte du serveur DHCP du réseau local ou via une configuration statique.
  • Communication directe : Les VM peuvent communiquer directement avec toutes les machines du réseau local.
  • Accessibilité : Idéal pour les serveurs ou les applications qui doivent être accessibles depuis le réseau local ou Internet.
  • Transparence réseau : Les VM apparaissent comme des machines physiques sur le réseau.

Le mode NAT

  • Adresse IP masquée : Les VM utilisent l’adresse IP de l’hôte pour accéder à Internet.
  • Isolation : Les VM ne sont pas directement accessibles depuis le réseau local.
  • Simplicité : Configuration rapide et facile à mettre en place.
  • Sécurité par défaut : Moins exposées aux menaces du réseau local.
CaractéristiqueMode BridgeMode NAT
Adresse IPAttribuée par le réseau localPartagée avec l’hôte
SécuritéMoins sécurisé (exposé)Plus sécurisé (isolé)
PerformanceOptimaleLégère surcharge possible
ComplexitéConfiguration plus complexeConfiguration simple
AccessibilitéDirecte depuis le réseauIndirecte (nécessite une redirection de port)

Configuration avec libvirt/KVM

Par défaut, libvirt (KVM) crée un réseau virtuel nommé default qui utilise le mode NAT (Network Address Translation). Ce réseau permet aux machines virtuelles de partager l’adresse IP de l’hôte pour accéder à Internet, tout en restant isolées du réseau physique. Le réseau default utilise généralement la plage d’adresses IP 192.168.122.0/24.

Vérifier l’état du réseau par défaut

Avant de configurer ou de modifier le réseau par défaut, il est important de vérifier s’il existe et s’il est actif.

Terminal window
sudo virsh net-list --all

La sortie devrait ressembler à ceci :

Nom État Démarrage automatique Persistant
----------------------------------------------------------
default actif oui oui

Pour obtenir les détails du réseau par défaut, utilisez la commande suivante :

Terminal window
sudo virsh net-dumpxml default
<network>
<name>default</name>
<uuid>edfcf52f-0141-4d4f-ba62-ca260aacbdac</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:d9:f9:85'/>
<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>

Voici une explication des principales sections de la configuration :

  1. Nom et UUID :

    • <name>default</name> : Le nom du réseau est “default”.
    • <uuid>edfcf52f-0141-4d4f-ba62-ca260aacbdac</uuid> : Un identifiant unique pour ce réseau, utilisé pour le référencer de manière précise.
  2. Mode de transfert :

    • <forward mode='nat'>: Le réseau utilise le mode de transfert “nat” (Network Address Translation). Cela permet aux machines virtuelles de partager l’adresse IP publique de l’hôte pour accéder à l’extérieur, tout en gardant leurs adresses privées.
  3. Bridge :

    • <bridge name='virbr0' stp='on' delay='0'/>: Définit un pont réseau virtuel nommé “virbr0”.
      • stp='on' : Le protocole STP (Spanning Tree Protocol) est activé pour éviter les boucles réseau.
      • delay='0' : Le délai STP est défini à 0 secondes (ceci désactive souvent le délai d’écoute et d’apprentissage du port STP).
  4. Adresse MAC :

    • <mac address='52:54:00:d9:f9:85'/>: L’adresse MAC attribuée au pont “virbr0”.
  5. Configuration IP :

    • <ip address='192.168.122.1' netmask='255.255.255.0'>: Configure une adresse IP pour le réseau virtuel avec la passerelle à 192.168.122.1 et un masque de sous-réseau de 255.255.255.0, couvrant toute la plage d’adresses 192.168.122.0/24.
  6. DHCP :

    • <dhcp>: La section DHCP configure le service DHCP pour ce réseau.
    • <range start='192.168.122.2' end='192.168.122.254'/>: Définit la plage d’adresses IP que le serveur DHCP allouera, allant de 192.168.122.2 à 192.168.122.254.

Cette configuration permet aux machines virtuelles connectées à ce réseau de recevoir automatiquement des adresses IP dans la plage spécifiée et d’accéder à Internet par le biais de l’hôte via NAT.

Si le réseau default n’est pas actif, vous pouvez le démarrer avec la commande suivante :

Terminal window
sudo virsh net-start default

Pour vous assurer que le réseau démarre automatiquement au démarrage de libvirt, exécutez :

Terminal window
sudo virsh net-autostart default

Configurer une machine virtuelle pour utiliser le réseau par défaut

Pour configurer une machine virtuelle pour utiliser le réseau par défaut, vous devez ajouter une interface réseau virtuelle à la machine virtuelle.

Commencez par télécharger l’image ISO :

Terminal window
cd /tmp
wget http://releases.ubuntu.com/24.04/ubuntu-24.04.1-live-server-amd64.iso
sudo mkdir -p /var/kvm/images

Ensuite, créez une machine virtuelle avec l’image ISO :

Terminal window
sudo virt-install \
--name ubuntu2404 \
--ram 4096 \
--disk path=/var/kvm/images/ubuntu2404.img,size=20 \
--vcpus 2 \
--os-variant ubuntu24.04 \
--network default \
--graphics none \
--console pty,target_type=serial \
--location /tmp/ubuntu-24.04-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
--extra-args 'console=ttyS0,115200n8'

Cettte commande crée une machine virtuelle nommée ubuntu2404 avec 4 Go de RAM, 2 processeurs virtuels et une taille de disque de 20 Go. Elle utilise le système d’exploitation Ubuntu 24.04. Elle utilise le réseau virtuel default.

Après avoir configuré la VM pour utiliser le réseau par défaut, démarrez-la et connectez-vous.

Étape 1 : Vérifier l’adresse IP

Dans la VM, exécutez :

Terminal window
ip addr show

Vous devriez voir une interface réseau (par exemple, eth0 ou enp1s0) avec une adresse IP dans la plage 192.168.122.0/24.

Étape 2 : Tester l’accès à Internet

Testez la connectivité Internet en pingant une adresse externe :

Terminal window
ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=15.9 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 15.859/15.859/15.859/0.000 ms

Si vous recevez des réponses, la connexion Internet est fonctionnelle.

Étape 3 : Tester la résolution DNS

Vérifiez que la résolution DNS fonctionne :

Terminal window
ping -c 4 google.
PING google.com (142.250.75.238) 56(84) bytes of data.
64 bytes from par10s41-in-f14.1e100.net (142.250.75.238): icmp_seq=1 ttl=113 time=10.5 ms
64 bytes from par10s41-in-f14.1e100.net (142.250.75.238): icmp_seq=2 ttl=113 time=9.41 ms
64 bytes from par10s41-in-f14.1e100.net (142.250.75.238): icmp_seq=3 ttl=113 time=16.4 ms
64 bytes from par10s41-in-f14.1e100.net (142.250.75.238): icmp_seq=4 ttl=113 time=14.4 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7035ms
rtt min/avg/max/mdev = 9.414/12.674/16.368/2.819 ms

Si le ping réussit, la résolution DNS est opérationnelle.

Dépannage

Le réseau par défaut n’apparaît pas

Si le réseau default n’apparaît pas dans la liste des réseaux, vous pouvez le définir à partir du fichier XML fourni par libvirt :

Terminal window
sudo virsh net-define /usr/share/libvirt/networks/default.xml
sudo virsh net-autostart default
sudo virsh net-start default

Les VM ne reçoivent pas d’adresse IP

  • Vérifiez que le service DHCP est actif : libvirt utilise dnsmasq pour fournir des adresses IP aux VM.

    Terminal window
    ps aux | grep dnsmasq
  • Redémarrez le réseau :

    Terminal window
    sudo virsh net-destroy default
    sudo virsh net-start default
  • Vérifiez les règles de pare-feu : Assurez-vous que les règles iptables ou nftables ne bloquent pas le trafic DHCP ou DNS.

Les VM n’ont pas accès à Internet

  • Vérifiez les règles NAT : libvirt doit avoir configuré des règles NAT pour permettre aux VM d’accéder à Internet.

    Terminal window
    sudo iptables -t nat -L -n
  • Assurez-vous que le module nf_nat est chargé :

    Terminal window
    lsmod | grep nf_nat

    Si le module n’est pas chargé, chargez-le :

    Terminal window
    sudo modprobe nf_nat
  • Vérifiez la configuration réseau de l’hôte : Si l’hôte utilise des configurations réseau complexes, cela peut interférer avec le NAT de libvirt.

Réinitialiser le réseau par défaut

Si vous rencontrez des problèmes persistants, vous pouvez réinitialiser le réseau par défaut.

Terminal window
sudo virsh net-destroy default
sudo virsh net-undefine default

Redéfinissez le réseau à partir du fichier par défaut :

Terminal window
sudo virsh net-define /usr/share/libvirt/networks/default.xml
sudo virsh net-autostart default
sudo virsh net-start default

Le mode Full Bridge

Le réseau par défaut offre un moyen très simple d’obtenir une connectivité lors de la création de machines virtuelles : tout est « prêt » et fonctionne dès la sortie de la boîte. Parfois, cependant, nous souhaitons obtenir une connexion de Full Bridge où les NM sont connectés au réseau local de l’hôte sans utiliser NAT. Voyons comment procéder étape par étape.

Configuration

Pour configurer le mode Full Bridge, vous devez créer un pont virtuel et partager l’une des interfaces Ethernet physiques de l’hôte.

Créer un pont virtuel

Pour configurer le mode Full Bridge, vous devez créer un pont virtuel et partager l’une des interfaces Ethernet physiques de l’hôte.

Créez un pont virtuel nommé br0.

Terminal window
sudo ip link add br1 type bridge

Attachons-nous à l’interface physique enp3s0 de l’hôte.

Terminal window
sudo ip link set enp3s0 master br0

Vérifiez que le pont virtuel est bien attaché à l’interface physique :

Terminal window
sudo ip link show br0
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP mode DEFAULT group default qlen 1000
link/ether 58:47:ca:79:33:d2 brd ff:ff:ff:ff:ff:ff

Créez un fichier XML qui définit le pont virtuel :

bridged-network.xml
<network>
<name>bridged-network</name>
<forward mode="bridge" />
<bridge name="br0" />
</network>
```
```bash
sudo virsh net-define bridged-network.xml
sudo virsh net-autostart bridged-network
sudo virsh net-start bridged-network

Relancez la création de la VM mais en indiquant le réseau bridged-network :

Terminal window
sudo virt-install \
--name ubuntu2404 \
--ram 4096 \
--disk path=/var/kvm/images/ubuntu2404.img,size=20 \
--vcpus 2 \
--os-variant ubuntu24.04 \
--network bridged-network \
--graphics none \
--console pty,target_type=serial \
--location /tmp/ubuntu-24.04-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
--extra-args 'console=ttyS0,115200n8'

Et refaites les mêmes tests.

Mon avis : Quel mode choisir ?

Le choix entre le mode bridge et le mode NAT dépend principalement de vos besoins spécifiques en matière de réseau.

  • Mode Bridge : Si vos VM doivent être accessibles depuis le réseau local ou si elles doivent communiquer librement avec d’autres machines du réseau, le mode bridge est le plus adapté. C’est le choix idéal pour héberger des serveurs ou des services qui nécessitent une visibilité sur le réseau.
  • Mode NAT : Si vous avez besoin d’isoler vos VM du réseau local tout en leur permettant d’accéder à Internet, le mode NAT est préférable. C’est une solution simple et sécurisée pour les environnements de test, de développement ou pour des applications qui n’ont pas besoin d’être accessibles depuis le réseau local.

Personnellement, j’utilise souvent le mode bridge car je veux profiter de mon serveur DHCP défini sur ma machine de rebonds.

Conclusion

La maîtrise des modes réseau bridge et NAT sous KVM est essentielle pour optimiser la connectivité de vos machines virtuelles. En comprenant les différences entre ces modes et en sachant les configurer correctement, vous pouvez adapter votre infrastructure virtuelle à vos besoins spécifiques.

Que vous choisissiez le bridge pour une intégration complète au réseau local ou le NAT pour une isolation sécurisée, KVM offre la flexibilité nécessaire pour gérer efficacement vos réseaux virtuels.

Références utiles