infra / reseaux-tcp-ip
NAT et PAT
Explication
Ce que vous allez apprendre
- Comprendre pourquoi le NAT a été inventé et le problème d'épuisement d'adresses qu'il résout
- Distinguer le NAT source (SNAT/MASQUERADE) du NAT destination (DNAT / port forwarding)
- Configurer une règle SNAT et une règle DNAT avec
iptablesounftables - Comprendre le rôle de la table de conntrack dans le suivi des connexions traduites
- Éviter le piège classique du DNAT configuré sans règle de filtrage correspondante
Dans quel contexte ?
Une entreprise héberge un serveur web interne à 192.168.1.10:443, injoignable depuis Internet. Pour le rendre accessible publiquement sur le port 8443 de l'IP publique 203.0.113.5, l'administrateur configure une règle DNAT sur le routeur. Mais après la configuration, les connexions restent bloquées : il a oublié d'ajouter la règle FORWARD -j ACCEPT correspondante — le NAT redirige bien le trafic, mais le pare-feu continue de le rejeter juste après.
Le problème que le NAT a résolu historiquement
Le nombre d'adresses IPv4 disponibles dans le monde est limité (environ 4,3 milliards), très insuffisant pour donner une adresse publique unique à chaque appareil connecté aujourd'hui. Le NAT (traduction d'adresse réseau) permet à tout un réseau local, utilisant des adresses privées, de partager une seule adresse publique pour sortir sur Internet. C'est cette technique qui a considérablement retardé l'épuisement des adresses IPv4.
| Type de NAT | Direction | Cas d'usage |
|---|---|---|
| SNAT / MASQUERADE | Trafic sortant | Réseau local qui sort vers Internet |
| DNAT (port forwarding) | Trafic entrant | Exposer un service interne vers l'extérieur |
Piège fréquent
Ouvrir un port en DNAT (PREROUTING -j DNAT) sans autoriser explicitement ce trafic dans la chaîne FORWARD laisse le paquet redirigé... puis bloqué par le pare-feu. Une règle DNAT doit presque toujours être accompagnée d'une règle FORWARD -j ACCEPT correspondante.
PAT : comment plusieurs machines partagent une seule adresse
Si plusieurs machines internes partagent la même adresse publique en sortie, comment le routeur sait-il à qui renvoyer chaque réponse ? C'est le rôle du PAT (traduction de port) : il attribue un port différent à chaque connexion sortante, et retient cette correspondance dans une table interne. C'est cette table qui permet de router correctement chaque réponse vers la bonne machine interne, même si toutes partagent la même adresse publique vue de l'extérieur.
SNAT et DNAT : deux directions, deux usages
Le NAT source (SNAT/MASQUERADE) s'applique au trafic qui sort du réseau local vers l'extérieur — c'est le cas le plus courant. Le NAT destination (DNAT), aussi appelé redirection de port, fait l'inverse : il permet d'exposer un service interne (par exemple un serveur web privé) vers l'extérieur, en redirigeant le trafic entrant vers la bonne machine interne. Confondre les deux directions est une source fréquente d'erreurs de configuration.
Le lien avec le pare-feu
Le NAT et le filtrage de paquets fonctionnent souvent ensemble : ouvrir un port en NAT (DNAT) sans l'autoriser explicitement dans les règles de filtrage laisse le trafic redirigé... mais bloqué. C'est un piège de configuration classique.
Commandes & code
NAT et PAT
# NAT (Network Address Translation) : traduit des IP privées en IP publique(s) et vice-versa
# PAT (Port Address Translation), aussi appelé "NAT overload" : plusieurs IP privées
# partagent UNE SEULE IP publique, distinguées par le numéro de port
Réseau local (privé) Routeur NAT/PAT Internet
192.168.1.10:51000 -----------> 203.0.113.5:51000 -----> serveur distant
192.168.1.11:51000 -----------> 203.0.113.5:51001 -----> serveur distant
# Le routeur retient la correspondance (IP privée:port) <-> (IP publique:port unique)
# dans une table de translation, pour router correctement les réponses au retour# NAT source (SNAT) : machines internes qui sortent vers Internet via une IP publique
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# MASQUERADE = SNAT dynamique, adapté quand l'IP publique peut changer (DHCP côté FAI)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.5
# SNAT explicite = IP publique fixe, légèrement plus performant que MASQUERADE
# NAT destination (DNAT) / Port forwarding : exposer un service interne vers l'extérieur
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8443 -j DNAT --to-destination 192.168.1.10:443
sudo iptables -t nat -A FORWARD -p tcp -d 192.168.1.10 --dport 443 -j ACCEPT
# Vérifier la table NAT active
sudo iptables -t nat -L -v -n
# Équivalent avec nftables
sudo nft add table ip nat
sudo nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
sudo nft add rule ip nat postrouting ip saddr 192.168.1.0/24 oif "eth0" masquerade
sudo nft add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
sudo nft add rule ip nat prerouting tcp dport 8443 dnat to 192.168.1.10:443
# Diagnostiquer un problème de NAT
conntrack -L | grep 192.168.1.10 # table de suivi de connexions (nécessite conntrack-tools)
conntrack -L -p tcp --dport 443Résumé
- NAT traduit des adresses, PAT (NAT overload) permet à plusieurs machines de partager UNE IP publique via les ports.
MASQUERADE/SNATgèrent le trafic sortant,DNAT(port forwarding) expose un service interne vers l'extérieur.- La table de conntrack garde en mémoire chaque translation active — c'est elle qu'on inspecte pour diagnostiquer un souci de NAT.
Exercices pratiques
Mission : réparer un DNAT qui redirige mais ne laisse rien passer
Objectif : Diagnostiquer et corriger un service exposé via DNAT qui reste injoignable faute de règle de filtrage correspondante.
Contexte
Une règle DNAT redirige le port 9000 externe vers 192.168.1.20:80. Un client externe qui tente de s'y connecter reçoit un timeout, pas un "connection refused" immédiat. Aucune règle FORWARD explicite n'a été ajoutée pour ce trafic.