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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »À 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
Les 3 invariants à retenir
Section intitulée « Les 3 invariants à retenir »| Machine | Règle | Vérification |
|---|---|---|
| Client | Route par défaut → 10.0.0.1 | ip route | grep default |
| Gateway | IP forwarding = 1 | cat /proc/sys/net/ipv4/ip_forward |
| Gateway | NAT sur l'interface Internet | sudo iptables -t nat -S | grep MASQUERADE |
Pourquoi un homelab réseau ?
Section intitulée « Pourquoi un homelab réseau ? »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
Architecture cible
Section intitulée « Architecture cible »Notre labo comporte 2 machines virtuelles :
| Machine | Rôle | Interfaces | Adresses IP |
|---|---|---|---|
| Gateway | Passerelle NAT | eth0 (NAT vers host), eth1 (interne) | 192.168.122.x/24, 10.0.0.1/24 |
| Client | Poste utilisateur | eth0 (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).
Prérequis
Section intitulée « Prérequis »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
Choisir votre mode : Atelier ou Durable
Section intitulée « Choisir votre mode : Atelier ou Durable »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.
Pour qui ? Ceux qui veulent comprendre chaque commande.
Approche : commandes ip et iptables temporaires, puis persistance à la fin.
Attention : tout est perdu au redémarrage jusqu'à la section "Persistance".
Ce guide : suivez les commandes ip / iptables puis la section finale.
Création des réseaux virtuels
Section intitulée « Création des réseaux virtuels »-
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éfautvirsh net-list --allSortie attendue :
Name State Autostart Persistentdefault active yes yes -
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.xmlvirsh net-start internalvirsh net-autostart internalVérifiez que le bridge existe sur l'hôte :
Fenêtre de terminal ip link show virbr-internal- Fichier → Outils → Network Manager
- Onglet "Host-only Networks"
- Créez un réseau avec DHCP désactivé
- Edit → Virtual Network Editor
- Ajoutez un réseau "Host-only" sans DHCP
-
Vérifiez les deux réseaux
Fenêtre de terminal # libvirtvirsh net-listVous devez voir
default(NAT) etinternal(isolé).
Configuration de la VM Gateway
Section intitulée « Configuration de la VM Gateway »La passerelle a deux interfaces réseau : une vers Internet, une vers le réseau interne.
-
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-installvirt-install --name gateway \--ram 1024 --vcpus 1 \--disk size=10 \--cdrom debian-12-netinst.iso \--network network=default \--network network=internal \--graphics vnc - Interface 1 : réseau NAT (
-
Identifiez les interfaces après installation
Connectez-vous à la VM et listez les interfaces :
Fenêtre de terminal ip link showSortie typique :
1: lo: <LOOPBACK,UP,LOWER_UP> ...2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... # NAT3: enp7s0: <BROADCAST,MULTICAST> ... # Interne (DOWN) -
Configurez l'interface interne
L'interface NAT a déjà une IP (DHCP). Configurez manuellement l'interface interne :
Fenêtre de terminal # Activer l'interfacesudo ip link set enp7s0 up# Assigner une IP statiquesudo ip addr add 10.0.0.1/24 dev enp7s0Vérifiez :
Fenêtre de terminal ip addr show enp7s0Sortie attendue :
3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...inet 10.0.0.1/24 scope global enp7s0 -
Activez le routage IP (IP forwarding)
Par défaut, Linux ne route pas les paquets entre interfaces. Activez-le :
Fenêtre de terminal # Activation temporairesudo sysctl -w net.ipv4.ip_forward=1# Activation permanenteecho 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ip-forward.confVérifiez :
Fenêtre de terminal cat /proc/sys/net/ipv4/ip_forwardDoit afficher
1. -
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 Internetsudo iptables -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE# Autoriser le forwarding UNIQUEMENT depuis le réseau internesudo iptables -A FORWARD -i enp7s0 -s 10.0.0.0/24 -o $IF_EXT -j ACCEPTsudo iptables -A FORWARD -i $IF_EXT -o enp7s0 -m state --state RELATED,ESTABLISHED -j ACCEPT# (Optionnel) Bloquer tout autre forwardingsudo iptables -P FORWARD DROPFonctionne sur Debian/Ubuntu et RHEL/Rocky :
Fenêtre de terminal # Installer firewalld si absentsudo apt install firewalld # Debian/Ubuntu# sudo dnf install firewalld # RHEL/Rocky# Démarrer le servicesudo systemctl enable --now firewalld# Interface Internet en zone "external" (NAT automatique)sudo firewall-cmd --permanent --zone=external --change-interface=enp1s0# Interface interne en zone "internal"sudo firewall-cmd --permanent --zone=internal --change-interface=enp7s0# Activer le masquerade sur la zone externalsudo firewall-cmd --permanent --zone=external --add-masquerade# Appliquersudo firewall-cmd --reload -
Vérifiez la configuration complète
Fenêtre de terminal # Interfacesip addr# Routage activésysctl net.ipv4.ip_forward# Règles NATsudo iptables -t nat -L -n -v
Configuration de la VM Client
Section intitulée « Configuration de la VM Client »Le client n'a qu'une interface sur le réseau interne.
-
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 -
Configurez l'adresse IP statique
Fenêtre de terminal # Activer l'interfacesudo ip link set enp1s0 up# Assigner une IPsudo ip addr add 10.0.0.10/24 dev enp1s0 -
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.1Vérifiez la table de routage :
Fenêtre de terminal ip routeSortie attendue :
default via 10.0.0.1 dev enp1s010.0.0.0/24 dev enp1s0 proto kernel scope link src 10.0.0.10 -
Configurez le DNS
Fenêtre de terminal echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf
Validation complète
Section intitulée « Validation complète »Testez chaque étape pour confirmer que le labo fonctionne.
-
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.
-
Depuis le client, ping Internet
Fenêtre de terminal ping -c 3 8.8.8.8✅ Doit répondre, prouve que le NAT fonctionne.
-
Depuis le client, résolution DNS
Fenêtre de terminal ping -c 3 google.com✅ Doit répondre, prouve que le DNS fonctionne.
-
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 :
# Terminal 1 (gateway) : écouter l'interface internesudo tcpdump -i enp7s0 icmp -n
# Terminal 2 (client) : envoyer un pingping -c 3 8.8.8.8Sortie attendue sur la gateway :
10.0.0.10 > 8.8.8.8: ICMP echo request8.8.8.8 > 10.0.0.10: ICMP echo replyCe que ça prouve : le paquet arrive bien du client (10.0.0.10) vers Internet.
Sur la gateway, observez l'interface externe (côté Internet) :
# Terminal 1 (gateway) : écouter l'interface NATsudo tcpdump -i enp1s0 icmp -n # Adaptez à votre interface NAT
# Terminal 2 (client) : envoyer un pingping -c 3 8.8.8.8Sortie attendue :
192.168.122.X > 8.8.8.8: ICMP echo request8.8.8.8 > 192.168.122.X: ICMP echo replyCe que ça prouve : l'adresse source a été traduite de 10.0.0.10 vers l'IP externe de la gateway. C'est le NAT en action !
Affichez la table de traduction NAT en temps réel :
# Sur la gateway (nécessite conntrack-tools)sudo apt install conntrack # Debian/Ubuntusudo dnf install conntrack-tools # RHEL/Rocky
# Voir toutes les connexions NAT activessudo conntrack -L | grep 10.0.0.10Sortie exemple :
icmp 1 src=10.0.0.10 dst=8.8.8.8 src=8.8.8.8 dst=192.168.122.XLecture : le paquet de 10.0.0.10→8.8.8.8 revient de 8.8.8.8→192.168.122.X (l'IP NAT de la gateway).
Dépannage
Section intitulée « Dépannage »Le client ne ping pas la passerelle (10.0.0.1)
Section intitulée « Le client ne ping pas la passerelle (10.0.0.1) »-
Vérifiez que l'interface interne de la gateway est UP
Sur la gateway :
Fenêtre de terminal ip link show enp7s0Si l'état est DOWN, activez-la :
Fenêtre de terminal sudo ip link set enp7s0 up -
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/24Client :
Fenêtre de terminal ip addr show enp1s0 | grep inet# Doit afficher 10.0.0.10/24 -
Vérifiez que les VMs sont sur le même réseau virtuel
Les deux doivent être connectées au réseau
internal.
Le client ne ping pas Internet (8.8.8.8)
Section intitulée « Le client ne ping pas Internet (8.8.8.8) »-
Vérifiez que le routage IP est activé sur la gateway
Fenêtre de terminal cat /proc/sys/net/ipv4/ip_forward# Doit afficher 1Si 0 :
Fenêtre de terminal sudo sysctl -w net.ipv4.ip_forward=1 -
Vérifiez la règle NAT
Fenêtre de terminal sudo iptables -t nat -L POSTROUTING -n -vDoit contenir une règle MASQUERADE sur l'interface NAT.
-
Vérifiez que la gateway elle-même accède à Internet
Sur la gateway :
Fenêtre de terminal ping -c 3 8.8.8.8Si ça échoue, le problème est la connexion NAT de la gateway, pas le client.
Le client ping 8.8.8.8 mais pas google.com
Section intitulée « Le client ping 8.8.8.8 mais pas google.com »Le DNS ne fonctionne pas. Vérifiez /etc/resolv.conf sur le client :
cat /etc/resolv.conf# Doit contenir : nameserver 8.8.8.8Persistance de la configuration
Section intitulée « Persistance de la configuration »Les commandes ip et iptables sont temporaires. Pour une configuration permanente :
Éditez /etc/network/interfaces :
# Gateway - interface interneauto enp7s0iface enp7s0 inet static address 10.0.0.1 netmask 255.255.255.0
# Clientauto enp1s0iface enp1s0 inet static address 10.0.0.10 netmask 255.255.255.0 gateway 10.0.0.1 dns-nameservers 8.8.8.8Pour iptables :
sudo apt install iptables-persistentsudo netfilter-persistent saveUtilisez NetworkManager :
# Gateway - interface internenmcli con add type ethernet con-name internal ifname enp7s0 \ ipv4.addresses 10.0.0.1/24 ipv4.method manual
# Clientnmcli con add type ethernet con-name internal ifname enp1s0 \ ipv4.addresses 10.0.0.10/24 ipv4.gateway 10.0.0.1 \ ipv4.dns 8.8.8.8 ipv4.method manualPour le pare-feu, utilisez firewalld :
sudo firewall-cmd --permanent --zone=external --add-masqueradesudo firewall-cmd --reloadÀ retenir
Section intitulée « À retenir »- 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
ipetiptablessont 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
Exercices pratiques
Section intitulée « Exercices pratiques »Exercice 1 : Changer l'IP du client
Section intitulée « Exercice 1 : Changer l'IP du client »But : Comprendre l'interaction IP + route par défaut.
- Changez l'IP du client de 10.0.0.10 à 10.0.0.20
- Testez :
ping 10.0.0.1, fonctionne-t-il ? Pourquoi ? - Testez :
ping 8.8.8.8, fonctionne-t-il ? Pourquoi ?
Solution
# Supprimer l'ancienne IPsudo ip addr del 10.0.0.10/24 dev enp1s0
# Ajouter la nouvellesudo ip addr add 10.0.0.20/24 dev enp1s0ping 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
Exercice 2 : Couper le DNS
Section intitulée « Exercice 2 : Couper le DNS »But : Distinguer la connectivité IP de la résolution DNS.
- Videz
/etc/resolv.confsur le client - Testez :
ping 8.8.8.8, fonctionne-t-il ? - Testez :
ping google.com, fonctionne-t-il ? - Restaurez le DNS
Solution
# Vider le DNSecho '' | sudo tee /etc/resolv.conf
# Testsping 8.8.8.8 # OK : l'IP n'a pas besoin de DNSping google.com # echoue : "Name or service not known"
# Restaurerecho 'nameserver 8.8.8.8' | sudo tee /etc/resolv.confLeçon : Sans DNS, les IPs marchent mais pas les noms.
Exercice 3 : Désactiver le NAT
Section intitulée « Exercice 3 : Désactiver le NAT »But : Voir l'effet du NAT sur le routage.
- Sur la gateway, supprimez la règle MASQUERADE
- Depuis le client, testez
ping 8.8.8.8 - Sur la gateway, lancez tcpdump sur l'interface externe
- Analysez ce qui se passe
Solution
# Sur la gateway : supprimer le NATsudo iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE
# Sur le clientping 8.8.8.8 # ❌ Pas de réponse (timeout)Avec tcpdump sur la gateway (interface externe) :
sudo tcpdump -i enp1s0 icmp -nVous 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 :
sudo iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADEExercice 4 : Ajouter un second client
Section intitulée « Exercice 4 : Ajouter un second client »But : Vérifier que le NAT gère plusieurs machines.
- Créez une VM "client2" connectée au réseau
internal - Configurez-la avec l'IP 10.0.0.11/24, passerelle 10.0.0.1, DNS 8.8.8.8
- Testez que client2 accède à Internet
- Faites un ping entre client (10.0.0.10) et client2 (10.0.0.11)
Solution
# Sur client2sudo ip link set enp1s0 upsudo ip addr add 10.0.0.11/24 dev enp1s0sudo ip route add default via 10.0.0.1echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf
# Testsping 8.8.8.8 # ✅ fonctionneping google.com # ✅ fonctionne
# Depuis client (10.0.0.10)ping 10.0.0.11 # OK : meme reseau interneLeçon : Le NAT gère naturellement plusieurs clients. Chaque connexion est suivie individuellement.
Cheat sheet
Section intitulée « Cheat sheet »| Machine | Commande | Ce qu'elle vérifie |
|---|---|---|
| Client | ip addr show | IP configurée sur l'interface |
| Client | ip route | Route par défaut vers 10.0.0.1 |
| Client | cat /etc/resolv.conf | Serveur DNS configuré |
| Client | ping 10.0.0.1 | Connexion au réseau interne |
| Client | ping 8.8.8.8 | NAT fonctionne |
| Client | ping google.com | DNS fonctionne |
| Gateway | cat /proc/sys/net/ipv4/ip_forward | IP forwarding activé (doit être 1) |
| Gateway | sudo iptables -t nat -L -n | Règle MASQUERADE présente |
| Gateway | sudo iptables -L FORWARD -n | Règles de filtrage |
| Gateway | sudo tcpdump -i <iface> -n | Voir le trafic en temps réel |
| Gateway | sudo conntrack -L | Connexions NAT actives |
FAQ : questions fréquentes sur le homelab réseau
Section intitulée « FAQ : questions fréquentes sur le homelab réseau »ip_forward + MASQUERADE
Sur la VM passerelle, deux ingrédients suffisent :# 1. Activer le routage entre interfaces
sudo sysctl -w net.ipv4.ip_forward=1
# 2. NAT masquerade vers l'interface Internet
IF_EXT=$(ip route | grep default | awk '{print $5}')
sudo iptables -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
Le masquerade réécrit l'IP source des paquets du réseau interne (10.0.0.0/24) avec l'IP de la passerelle, exactement comme votre box. La VM cliente n'a plus qu'à router vers la passerelle :sudo ip route add default via 10.0.0.1
Validé en lab : un client isolé en 10.0.0.10 atteint Internet (ping 1.1.1.1) en passant par cette passerelle.La checklist des 5 points
Un client qui ne sort pas vient presque toujours d'un de ces oublis :- Forwarding désactivé :
cat /proc/sys/net/ipv4/ip_forwarddoit valoir1sur la passerelle. - NAT sur la mauvaise interface :
iptables -t nat -S | grep MASQUERADEdoit cibler l'interface Internet (-o IF_EXT). - Policy FORWARD DROP sans règle ACCEPT : si la politique par défaut est
DROP, il faut autoriser explicitement le trafic interne et le retourESTABLISHED,RELATED. - Route par défaut absente côté client :
ip route | grep defaultdoit pointer vers la passerelle (10.0.0.1). - DNS manquant :
ping 8.8.8.8marche maisping google.coméchoue ? La route est bonne, c'est le DNS qu'il faut configurer.
Le forwarding IP
Par défaut, Linux ne route pas : il ignore les paquets qui ne lui sont pas destinés. Pour en faire une passerelle :# Immediat
sudo sysctl -w net.ipv4.ip_forward=1
# Persistant (survit au reboot)
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ip-forward.conf
sudo sysctl --system
Vérifiez :cat /proc/sys/net/ipv4/ip_forward
# 1
C'est l'oubli numéro un d'un homelab : sans ip_forward=1, la passerelle reçoit les paquets du client mais ne les relaie jamais vers Internet.Deux rôles distincts
| Réseau NAT | Réseau interne isolé | |
|---|---|---|
| Accès Internet | oui, via l'hôte | non (sauf passerelle) |
| DHCP | souvent fourni | aucun (IP manuelles) |
| Usage | sortie de la passerelle | lien client - passerelle |
default de libvirt) donne aux VMs un accès Internet : l'hôte traduit les adresses. C'est l'interface externe de votre passerelle.Le réseau interne isolé est un simple switch virtuel sans accès extérieur ni DHCP. Les VMs qui y sont connectées se parlent entre elles, mais ne joignent Internet que si l'une d'elles joue le rôle de passerelle. Cet isolement rend le homelab sûr : vos erreurs n'affectent pas votre connexion principale.Persister chaque couche
La configuration en commandesip et iptables est temporaire : elle disparaît au reboot. Rendez chaque couche persistante :| Élément | Méthode persistante |
|---|---|
| Forwarding | fichier dans /etc/sysctl.d/ |
| IP et routes | netplan / systemd-networkd (Ubuntu), NetworkManager nmcli (RHEL) |
| NAT | /etc/nftables.conf ou netfilter-persistent |
ip/iptables pour comprendre, puis on reporte la config dans ces fichiers. Vérifiez toujours après un reboot que le client sort encore vers Internet.