Architecture des réseaux · Étape 19

Comprends NAT et publie un service

Observe un aller sans retour, ajoute un masquerade pour la sortie puis un DNAT pour publier un serveur interne vers un réseau externe simulé.

Durée indicative · ~1 h 30Niveau intermédiairePrérequis conseillé · Leçons 17 et 18 — routage et nftablesPratique · TP
L’idée reçue

« NAT protège le réseau comme un pare-feu. »

NAT traduit des adresses et des ports. Il peut rendre une connexion entrante impossible en l’absence de traduction, mais il ne remplace ni une politique de filtrage ni l’analyse des flux autorisés.

Interne10.50.20.21client privé
Routeur203.0.113.1traduction
Externe203.0.113.2serveur simulé

01Construire le laboratoire

chmod +x module4-nat-lab.sh
sudo ./module4-nat-lab.sh setup

Le namespace externe m4n-wan connaît seulement le réseau 203.0.113.0/24. Il ne possède aucune route vers 10.50.0.0/16.

02Observer l’aller sans retour

Lance un serveur HTTP externe :

sudo ip netns exec m4n-wan python3 -m http.server 8080 --bind 203.0.113.2

Dans un autre terminal :

sudo ip netns exec m4n-r1 tcpdump -ni any 'tcp port 8080'

Puis depuis le client :

sudo ip netns exec m4n-cli curl --max-time 3 http://203.0.113.2:8080/
La requête traverse le routeur avec la source privée 10.50.20.21. Le serveur externe ne possède aucune route de retour vers cette adresse. Le problème n’est pas l’aller, mais le retour.

03Ajouter le masquerade

cat > /tmp/m4-nat.nft <<'EOF'
flush ruleset

table ip nat {
chain prerouting {
  type nat hook prerouting priority dstnat; policy accept;
}

chain postrouting {
  type nat hook postrouting priority srcnat; policy accept;
  oifname "wan0" ip saddr 10.50.0.0/16 masquerade
}
}
EOF

sudo ip netns exec m4n-r1 nft -f /tmp/m4-nat.nft
sudo ip netns exec m4n-cli curl -s http://203.0.113.2:8080/ | head
Comprends ce qui change réellement

Le routeur remplace la source 10.50.20.21 par son adresse WAN 203.0.113.1. Le serveur externe sait répondre à cette adresse locale. Conntrack mémorise la traduction et restitue la destination privée au retour.

04Publier un serveur interne

Arrête le serveur externe. Lance ensuite le service interne :

sudo ip netns exec m4n-srv python3 -m http.server 8080 --bind 10.50.30.10

Ajoute la règle DNAT dans la chaîne prerouting :

sudo ip netns exec m4n-r1 nft add rule ip nat prerouting iifname "wan0" ip daddr 203.0.113.1 tcp dport 8080 dnat to 10.50.30.10:8080

sudo ip netns exec m4n-wan curl -s http://203.0.113.1:8080/ | head
Le client externe croit contacter 203.0.113.1:8080. Le routeur remplace la destination par 10.50.30.10:8080, puis traduit le chemin retour grâce à l’état de connexion.

05Distinguer NAT et filtrage

QuestionNATPare-feu
Quelle adresse apparaît sur le WAN ?Décide la traductionNe change pas l’adresse
Quel port interne reçoit la connexion ?DNAT peut le modifierAutorise ou bloque
Qui a le droit de se connecter ?Ne suffit pasDécision de politique
Le retour appartient-il à la même connexion ?Conntrack restitue la traductionConntrack peut autoriser l’état established
Panne volontaire

Publie vers une adresse inexistante

  1. remplace temporairement la destination DNAT par 10.50.30.99 ;
  2. capture ARP sur srv0 dans le routeur ;
  3. relance la requête externe ;
  4. montre que le routeur cherche une machine qui ne répond pas ;
  5. rétablis 10.50.30.10.

06Nettoyer

sudo ip netns exec m4n-r1 nft flush ruleset
sudo ./module4-nat-lab.sh cleanup

Ce que tu retiens

Le SNAT ou masquerade donne une source routable aux connexions sortantes. Le DNAT publie une destination interne. Ces traductions s’appuient sur l’état de connexion, mais elles ne définissent pas à elles seules une politique de sécurité.

Ta progression

Chargement de l’état… Se connecter pour synchroniser.