Aller au contenu
Réseaux medium

Homelab réseau : créer un labo avec 2 VMs

23 min de lecture

Pour pratiquer le réseau sans risque, créez un labo isolé avec 2 VMs : une passerelle qui route le trafic vers Internet, et un client sur un réseau interne. Ce guide vous accompagne pas à pas pour configurer cette architecture en 30 minutes. À la fin, votre client VM accédera à Internet en passant par votre passerelle, exactement comme dans un réseau d'entreprise.

À la fin de ce module, vous saurez :

  • Comprendre ce qu'est un réseau interne, une passerelle et une route par défaut
  • Configurer le NAT (masquerade) pour partager une connexion Internet
  • Diagnostiquer : vérifier IP, route, DNS, NAT
  • Rendre persistant la configuration réseau
MachineRègleVérification
ClientRoute par défaut → 10.0.0.1ip route | grep default
GatewayIP forwarding = 1cat /proc/sys/net/ipv4/ip_forward
GatewayNAT sur l'interface Internetsudo iptables -t nat -S | grep MASQUERADE

Architecture du homelab avec passerelle et client

Un homelab (home laboratory) est un environnement de test personnel. Pour le réseau, il permet de :

  • Expérimenter sans risque : vos erreurs n'affectent pas votre connexion principale
  • Comprendre le routage : voir concrètement comment les paquets traversent une passerelle
  • Préparer les certifications : CCNA, LFCS, CKA nécessitent de manipuler des réseaux
  • Tester des outils : pare-feu, VPN, monitoring en conditions réelles

Notre labo comporte 2 machines virtuelles :

MachineRôleInterfacesAdresses IP
GatewayPasserelle NATeth0 (NAT vers host), eth1 (interne)192.168.122.x/24, 10.0.0.1/24
ClientPoste utilisateureth0 (interne)10.0.0.10/24

Le réseau interne (10.0.0.0/24) est complètement isolé. Le client ne peut atteindre Internet qu'en passant par la passerelle qui effectue du NAT (Network Address Translation).

Avant de commencer, vérifiez que vous disposez de :

  • Hyperviseur : VirtualBox, VMware, KVM/libvirt, ou Proxmox
  • RAM disponible : 2 Go minimum (1 Go par VM)
  • Espace disque : 20 Go (10 Go par VM)
  • ISO Linux : Debian 12, Ubuntu Server 22.04, ou Rocky Linux 9

Avant de commencer, choisissez votre approche :

Pour qui ? Débutants qui veulent un labo fonctionnel après redémarrage.

Approche : configuration persistante dès le départ avec NetworkManager + firewalld (ou nftables).

Avantage : ça marche encore après un reboot.

Ce guide : suivez les onglets "Persistant" quand ils apparaissent.

  1. Créez le réseau NAT (accès Internet)

    La plupart des hyperviseurs proposent un réseau NAT par défaut. Avec libvirt :

    Fenêtre de terminal
    # Vérifier le réseau NAT par défaut
    virsh net-list --all

    Sortie attendue :

    Name State Autostart Persistent
    default active yes yes
  2. Créez le réseau interne isolé

    Ce réseau n'a pas de passerelle externe, seules les VMs peuvent s'y connecter. Pensez-y comme un switch virtuel isolé : pas de DHCP, pas d'Internet.

    Créez le fichier internal-net.xml :

    <network>
    <name>internal</name>
    <bridge name="virbr-internal" stp="on" delay="0"/>
    <!-- Pas de forward = réseau isolé, pas d'accès Internet -->
    <!-- Pas de DHCP = IPs manuelles -->
    </network>

    Activez le réseau :

    Fenêtre de terminal
    virsh net-define internal-net.xml
    virsh net-start internal
    virsh net-autostart internal

    Vérifiez que le bridge existe sur l'hôte :

    Fenêtre de terminal
    ip link show virbr-internal
  3. Vérifiez les deux réseaux

    Fenêtre de terminal
    # libvirt
    virsh net-list

    Vous devez voir default (NAT) et internal (isolé).

La passerelle a deux interfaces réseau : une vers Internet, une vers le réseau interne.

  1. Créez la VM avec 2 interfaces

    • Interface 1 : réseau NAT (default)
    • Interface 2 : réseau interne (internal)
    Fenêtre de terminal
    # Exemple libvirt avec virt-install
    virt-install --name gateway \
    --ram 1024 --vcpus 1 \
    --disk size=10 \
    --cdrom debian-12-netinst.iso \
    --network network=default \
    --network network=internal \
    --graphics vnc
  2. Identifiez les interfaces après installation

    Connectez-vous à la VM et listez les interfaces :

    Fenêtre de terminal
    ip link show

    Sortie typique :

    1: lo: <LOOPBACK,UP,LOWER_UP> ...
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... # NAT
    3: enp7s0: <BROADCAST,MULTICAST> ... # Interne (DOWN)
  3. Configurez l'interface interne

    L'interface NAT a déjà une IP (DHCP). Configurez manuellement l'interface interne :

    Fenêtre de terminal
    # Activer l'interface
    sudo ip link set enp7s0 up
    # Assigner une IP statique
    sudo ip addr add 10.0.0.1/24 dev enp7s0

    Vérifiez :

    Fenêtre de terminal
    ip addr show enp7s0

    Sortie attendue :

    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
    inet 10.0.0.1/24 scope global enp7s0
  4. Activez le routage IP (IP forwarding)

    Par défaut, Linux ne route pas les paquets entre interfaces. Activez-le :

    Fenêtre de terminal
    # Activation temporaire
    sudo sysctl -w net.ipv4.ip_forward=1
    # Activation permanente
    echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ip-forward.conf

    Vérifiez :

    Fenêtre de terminal
    cat /proc/sys/net/ipv4/ip_forward

    Doit afficher 1.

  5. Configurez le NAT avec iptables

    Le NAT masquerade permet aux clients internes d'accéder à Internet via l'IP de la passerelle.

    Fenêtre de terminal
    # Identifier l'interface Internet (celle avec la route par défaut)
    IF_EXT=$(ip route | grep default | awk '{print $5}')
    echo "Interface Internet : $IF_EXT"
    # NAT masquerade sur l'interface Internet
    sudo iptables -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
    # Autoriser le forwarding UNIQUEMENT depuis le réseau interne
    sudo iptables -A FORWARD -i enp7s0 -s 10.0.0.0/24 -o $IF_EXT -j ACCEPT
    sudo iptables -A FORWARD -i $IF_EXT -o enp7s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    # (Optionnel) Bloquer tout autre forwarding
    sudo iptables -P FORWARD DROP
  6. Vérifiez la configuration complète

    Fenêtre de terminal
    # Interfaces
    ip addr
    # Routage activé
    sysctl net.ipv4.ip_forward
    # Règles NAT
    sudo iptables -t nat -L -n -v

Le client n'a qu'une interface sur le réseau interne.

  1. Créez la VM avec 1 interface interne

    Fenêtre de terminal
    virt-install --name client \
    --ram 1024 --vcpus 1 \
    --disk size=10 \
    --cdrom debian-12-netinst.iso \
    --network network=internal \
    --graphics vnc
  2. Configurez l'adresse IP statique

    Fenêtre de terminal
    # Activer l'interface
    sudo ip link set enp1s0 up
    # Assigner une IP
    sudo ip addr add 10.0.0.10/24 dev enp1s0
  3. Configurez la passerelle par défaut

    Indiquez au client que tout le trafic vers l'extérieur passe par 10.0.0.1 :

    Fenêtre de terminal
    sudo ip route add default via 10.0.0.1

    Vérifiez la table de routage :

    Fenêtre de terminal
    ip route

    Sortie attendue :

    default via 10.0.0.1 dev enp1s0
    10.0.0.0/24 dev enp1s0 proto kernel scope link src 10.0.0.10
  4. Configurez le DNS

    Fenêtre de terminal
    echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf

Testez chaque étape pour confirmer que le labo fonctionne.

  1. Depuis le client, ping la passerelle

    Fenêtre de terminal
    ping -c 3 10.0.0.1

    ✅ Doit répondre, prouve que le réseau interne fonctionne.

  2. Depuis le client, ping Internet

    Fenêtre de terminal
    ping -c 3 8.8.8.8

    ✅ Doit répondre, prouve que le NAT fonctionne.

  3. Depuis le client, résolution DNS

    Fenêtre de terminal
    ping -c 3 google.com

    ✅ Doit répondre, prouve que le DNS fonctionne.

  4. Test HTTP depuis le client

    Fenêtre de terminal
    curl -I https://example.com

    ✅ Doit retourner HTTP/2 200, connectivité complète confirmée.

Voir le trafic avec tcpdump (optionnel mais recommandé)

Section intitulée « Voir le trafic avec tcpdump (optionnel mais recommandé) »

tcpdump permet de voir exactement ce qui se passe sur le réseau. C'est le meilleur outil pour comprendre et déboguer.

Sur la gateway, observez l'interface interne pendant que le client ping :

Fenêtre de terminal
# Terminal 1 (gateway) : écouter l'interface interne
sudo tcpdump -i enp7s0 icmp -n
# Terminal 2 (client) : envoyer un ping
ping -c 3 8.8.8.8

Sortie attendue sur la gateway :

10.0.0.10 > 8.8.8.8: ICMP echo request
8.8.8.8 > 10.0.0.10: ICMP echo reply

Ce que ça prouve : le paquet arrive bien du client (10.0.0.10) vers Internet.

  1. Vérifiez que l'interface interne de la gateway est UP

    Sur la gateway :

    Fenêtre de terminal
    ip link show enp7s0

    Si l'état est DOWN, activez-la :

    Fenêtre de terminal
    sudo ip link set enp7s0 up
  2. Vérifiez les IPs sur les deux VMs

    Gateway :

    Fenêtre de terminal
    ip addr show enp7s0 | grep inet
    # Doit afficher 10.0.0.1/24

    Client :

    Fenêtre de terminal
    ip addr show enp1s0 | grep inet
    # Doit afficher 10.0.0.10/24
  3. Vérifiez que les VMs sont sur le même réseau virtuel

    Les deux doivent être connectées au réseau internal.

  1. Vérifiez que le routage IP est activé sur la gateway

    Fenêtre de terminal
    cat /proc/sys/net/ipv4/ip_forward
    # Doit afficher 1

    Si 0 :

    Fenêtre de terminal
    sudo sysctl -w net.ipv4.ip_forward=1
  2. Vérifiez la règle NAT

    Fenêtre de terminal
    sudo iptables -t nat -L POSTROUTING -n -v

    Doit contenir une règle MASQUERADE sur l'interface NAT.

  3. Vérifiez que la gateway elle-même accède à Internet

    Sur la gateway :

    Fenêtre de terminal
    ping -c 3 8.8.8.8

    Si ça échoue, le problème est la connexion NAT de la gateway, pas le client.

Le DNS ne fonctionne pas. Vérifiez /etc/resolv.conf sur le client :

Fenêtre de terminal
cat /etc/resolv.conf
# Doit contenir : nameserver 8.8.8.8

Les commandes ip et iptables sont temporaires. Pour une configuration permanente :

Éditez /etc/network/interfaces :

Fenêtre de terminal
# Gateway - interface interne
auto enp7s0
iface enp7s0 inet static
address 10.0.0.1
netmask 255.255.255.0
# Client
auto enp1s0
iface enp1s0 inet static
address 10.0.0.10
netmask 255.255.255.0
gateway 10.0.0.1
dns-nameservers 8.8.8.8

Pour iptables :

Fenêtre de terminal
sudo apt install iptables-persistent
sudo netfilter-persistent save
  • Un homelab permet de pratiquer le réseau en toute sécurité
  • La passerelle NAT connecte un réseau interne isolé à Internet
  • L'IP forwarding (net.ipv4.ip_forward=1) active le routage Linux
  • Le NAT masquerade traduit les adresses sources pour les paquets sortants
  • La route par défaut (ip route add default via) indique au client où envoyer le trafic externe
  • Les commandes ip et iptables sont temporaires, utilisez la configuration persistante pour un labo permanent
  • tcpdump est votre meilleur ami pour voir ce qui se passe vraiment sur le réseau

But : Comprendre l'interaction IP + route par défaut.

  1. Changez l'IP du client de 10.0.0.10 à 10.0.0.20
  2. Testez : ping 10.0.0.1, fonctionne-t-il ? Pourquoi ?
  3. Testez : ping 8.8.8.8, fonctionne-t-il ? Pourquoi ?
Solution
Fenêtre de terminal
# Supprimer l'ancienne IP
sudo ip addr del 10.0.0.10/24 dev enp1s0
# Ajouter la nouvelle
sudo ip addr add 10.0.0.20/24 dev enp1s0
  • ping 10.0.0.1 ✅ fonctionne (même sous-réseau 10.0.0.0/24)
  • ping 8.8.8.8 ✅ fonctionne aussi, la route par défaut pointe toujours vers 10.0.0.1

But : Distinguer la connectivité IP de la résolution DNS.

  1. Videz /etc/resolv.conf sur le client
  2. Testez : ping 8.8.8.8, fonctionne-t-il ?
  3. Testez : ping google.com, fonctionne-t-il ?
  4. Restaurez le DNS
Solution
Fenêtre de terminal
# Vider le DNS
echo '' | sudo tee /etc/resolv.conf
# Tests
ping 8.8.8.8 # OK : l'IP n'a pas besoin de DNS
ping google.com # echoue : "Name or service not known"
# Restaurer
echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf

Leçon : Sans DNS, les IPs marchent mais pas les noms.

But : Voir l'effet du NAT sur le routage.

  1. Sur la gateway, supprimez la règle MASQUERADE
  2. Depuis le client, testez ping 8.8.8.8
  3. Sur la gateway, lancez tcpdump sur l'interface externe
  4. Analysez ce qui se passe
Solution
Fenêtre de terminal
# Sur la gateway : supprimer le NAT
sudo iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE
# Sur le client
ping 8.8.8.8 # ❌ Pas de réponse (timeout)

Avec tcpdump sur la gateway (interface externe) :

Fenêtre de terminal
sudo tcpdump -i enp1s0 icmp -n

Vous verrez :

10.0.0.10 > 8.8.8.8: ICMP echo request
# Pas de réponse !

Analyse : Le paquet sort avec l'IP source 10.0.0.10 (privée). Internet ne sait pas comment répondre à une IP privée → pas de retour.

Restaurez :

Fenêtre de terminal
sudo iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE

But : Vérifier que le NAT gère plusieurs machines.

  1. Créez une VM "client2" connectée au réseau internal
  2. Configurez-la avec l'IP 10.0.0.11/24, passerelle 10.0.0.1, DNS 8.8.8.8
  3. Testez que client2 accède à Internet
  4. Faites un ping entre client (10.0.0.10) et client2 (10.0.0.11)
Solution
Fenêtre de terminal
# Sur client2
sudo ip link set enp1s0 up
sudo ip addr add 10.0.0.11/24 dev enp1s0
sudo ip route add default via 10.0.0.1
echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf
# Tests
ping 8.8.8.8 # ✅ fonctionne
ping google.com # ✅ fonctionne
# Depuis client (10.0.0.10)
ping 10.0.0.11 # OK : meme reseau interne

Leçon : Le NAT gère naturellement plusieurs clients. Chaque connexion est suivie individuellement.

MachineCommandeCe qu'elle vérifie
Clientip addr showIP configurée sur l'interface
Clientip routeRoute par défaut vers 10.0.0.1
Clientcat /etc/resolv.confServeur DNS configuré
Clientping 10.0.0.1Connexion au réseau interne
Clientping 8.8.8.8NAT fonctionne
Clientping google.comDNS fonctionne
Gatewaycat /proc/sys/net/ipv4/ip_forwardIP forwarding activé (doit être 1)
Gatewaysudo iptables -t nat -L -nRègle MASQUERADE présente
Gatewaysudo iptables -L FORWARD -nRègles de filtrage
Gatewaysudo tcpdump -i <iface> -nVoir le trafic en temps réel
Gatewaysudo conntrack -LConnexions NAT actives

FAQ : questions fréquentes sur le homelab réseau

Section intitulée « FAQ : questions fréquentes sur le homelab réseau »

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracking. 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