Retour au cours

infra / reseaux-tcp-ip

NAT et PAT

Leçon 81 exercice

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 iptables ou nftables
  • 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 NATDirectionCas d'usage
SNAT / MASQUERADETrafic sortantRéseau local qui sort vers Internet
DNAT (port forwarding)Trafic entrantExposer 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

text
# 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
bash
# 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 443

Résumé

  • NAT traduit des adresses, PAT (NAT overload) permet à plusieurs machines de partager UNE IP publique via les ports.
  • MASQUERADE/SNAT gè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

1 disponible
1

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.

Résoudre l’exercice →