Aller au contenu
Réseaux medium

Le NAT : SNAT, DNAT et port forwarding

12 min de lecture

Le NAT (Network Address Translation) réécrit les adresses IP des paquets qui traversent un routeur. C'est lui qui permet à toutes les machines d'un réseau privé (192.168.x.x) de partager une seule IP publique pour sortir sur Internet. On distingue le SNAT (réécrit l'adresse source, trafic sortant) et le DNAT (réécrit la destination, c'est le port forwarding). Ce guide explique les deux sens, le rôle central du suivi de connexion (conntrack), le CGNAT des fournisseurs d'accès, et pourquoi IPv6 s'en passe, le tout avec un lab Linux en iptables et nftables.

  • Comprendre le NAT : pourquoi et comment il partage une IP publique.
  • Distinguer SNAT et DNAT, et savoir dans quelle chaîne chacun agit.
  • Faire du port forwarding sous Linux (iptables et nftables).
  • Lire une entrée conntrack pour voir une traduction en direct.
  • Reconnaître le CGNAT et comprendre le double NAT.
  • Savoir pourquoi IPv6 n'utilise pas de NAT.

Le NAT réécrit les adresses IP (et souvent les ports) dans l'en-tête des paquets qui traversent un routeur. Son usage dominant : faire sortir un réseau d'adresses privées vers une IP publique partagée.

Les plages privées (RFC 1918) ne sont pas routables sur Internet :

PlageNotation
10.0.0.0/8classe A privée
172.16.0.0/12classe B privée
192.168.0.0/16classe C privée

Le NAT a retardé l'épuisement d'IPv4 en laissant des milliers de machines partager quelques IP publiques. Voir le détail de ces plages dans le guide IP et sous-réseaux.

Tout le NAT se résume à quelle adresse on réécrit et dans quelle chaîne :

SNATDNAT
RéécritIP sourceIP destination
Senstrafic sortanttrafic entrant
ChaînePOSTROUTINGPREROUTING
Usagepartager une IP publiqueport forwarding

Pourquoi ces chaînes ? Le DNAT agit en PREROUTING parce que la nouvelle destination doit être connue avant que le noyau décide où router le paquet. Le SNAT agit en POSTROUTING parce que l'IP de sortie n'est connue qu'après le choix de l'interface.

Fenêtre de terminal
# SNAT dynamique (MASQUERADE) : prend l'IP de l'interface de sortie
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# SNAT fixe : IP publique connue (plus performant)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
# DNAT : redirige le port 80 entrant vers un serveur interne
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080

Trois termes prêtent à confusion :

  • MASQUERADE est un SNAT dynamique : il prend automatiquement l'IP de l'interface de sortie. Idéal quand l'IP publique est attribuée par DHCP (elle peut changer). C'est ce qu'utilise le guide homelab réseau pour partager Internet.
  • SNAT --to-source fixe une IP publique connue : plus performant (pas de recalcul à chaque connexion), à privilégier sur IP fixe.
  • PAT (Port Address Translation, ou « NAT overload ») désigne le fait que plusieurs machines partagent une seule IP, distinguées par le port source réécrit. En pratique, le masquerade domestique est du PAT.
TypeRapportUsage
NAT statique 1:1une IP privée -> une IP publique dédiéeexposer un serveur
PAT (n:1)N machines -> 1 IP publiquebox, masquerade

Le NAT ne s'applique qu'au premier paquet d'un flux. Ensuite, le suivi de connexion (conntrack) de Netfilter mémorise la traduction et l'applique automatiquement aux paquets suivants et aux réponses.

conntrack -L affiche deux tuples par connexion : l'original (ce que l'émetteur envoie) et le reply (ce que le noyau attend en retour). Quand il y a NAT, le reply n'est pas l'inverse de l'original. Voici une entrée réelle issue du lab, où un client privé 10.0.0.10 sort vers 1.1.1.1 :

icmp 1 29 src=10.0.0.10 dst=1.1.1.1 type=8 ...
src=1.1.1.1 dst=172.17.0.5 type=0 ...

Lecture : le client envoie depuis 10.0.0.10, mais le serveur répond à 172.17.0.5, l'IP de la passerelle après SNAT. Ce décalage entre les src=/dst= des deux lignes est la signature du NAT.

Fenêtre de terminal
conntrack -L # toutes les connexions suivies
conntrack -L --src-nat # uniquement les connexions SNAT
conntrack -L --dst-nat # uniquement les connexions DNAT

Exposer un service interne vers l'extérieur, c'est du DNAT. Mais une règle DNAT seule ne suffit pas : c'est l'erreur la plus fréquente.

  1. Activer le routage IP

    Fenêtre de terminal
    sudo sysctl -w net.ipv4.ip_forward=1
    # persistant : net.ipv4.ip_forward=1 dans /etc/sysctl.d/99-nat.conf
  2. Ajouter la règle DNAT (PREROUTING)

    Fenêtre de terminal
    sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
  3. Autoriser le flux dans FORWARD

    Fenêtre de terminal
    sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT

Le lab confirme la règle DNAT en place :

-A PREROUTING -p tcp -m tcp --dport 9090 -j DNAT --to-destination 10.0.0.10:8080

Sans ip_forward=1 et sans règle FORWARD qui accepte le trafic (la chaîne a souvent une politique DROP), le DNAT semble inerte. C'est le piège classique du port forwarding.

Pour la VoIP, les jeux et le P2P, le comportement du NAT compte. Quatre types classiques (RFC 3489), du plus permissif au plus strict :

TypeComportement
Full-conemapping fixe ; tout hôte externe peut joindre le port public
Restricted-coneseul un hôte déjà contacté (même IP) peut répondre
Port-restrictedrestriction sur l'IP et le port externes
Symmetricun mapping public différent par destination

Le NAT symétrique casse le P2P : un serveur STUN apprend à l'hôte son IP:port public, mais avec un NAT symétrique, le port alloué pour parler au pair diffère de celui vu par STUN. L'adresse apprise est inutilisable. D'où trois briques en VoIP/WebRTC :

  • STUN : découvre l'adresse publique (marche sauf en symétrique).
  • TURN : serveur relais quand le direct échoue (toujours fonctionnel, mais coûteux).
  • ICE : choisit le meilleur chemin parmi les candidats, et bascule sur TURN si besoin.

Le CGNAT (Carrier-Grade NAT) mutualise une IP publique entre plusieurs abonnés chez le fournisseur d'accès. Il utilise la plage dédiée RFC 6598 : 100.64.0.0/10, choisie pour ne pas entrer en collision avec le RFC 1918 des réseaux domestiques.

Si vous voyez une adresse en 100.64.x.x sur le WAN de votre box, vous êtes en double NAT (NAT de la box + CGNAT du fournisseur). Conséquence concrète : le port forwarding devient impossible côté client, donc pas d'auto-hébergement direct. Les contournements : demander une IPv4 publique au fournisseur, ou passer par un tunnel/relais.

En IPv6, le NAT n'est en principe pas nécessaire : l'espace d'adressage est assez vaste pour donner une adresse globale unique à chaque machine, ce qui restaure la connectivité de bout en bout.

  • NAT66 (IPv6 vers IPv6) est déconseillé par l'IETF (RFC 5902).
  • NPTv6 (translation de préfixe) existe pour des cas précis (multi-homing) mais reste marginal.
  • L'approche recommandée : préfixe global routable + pare-feu IPv6 à états qui bloque l'entrant par défaut. Même protection perçue que le NAT, sans casser le bout-en-bout.

En 2026, la position est stable : pas de NAT en IPv6, la sécurité passe par le pare-feu, pas par la traduction d'adresse.

  • Oublier ip_forward=1 : le noyau ne route pas, le DNAT paraît inerte.
  • Oublier la règle FORWARD : politique DROP, le trafic redirigé est jeté malgré un DNAT correct.
  • Hairpin NAT : accéder à son service via son IP publique depuis le LAN échoue souvent (le serveur répond en direct au client local sans repasser par le routeur). Correctif : un SNAT sur le trafic interne -> interne pour forcer le retour par le routeur.
  • Confondre SNAT et DNAT : SNAT en POSTROUTING (source, sortant), DNAT en PREROUTING (destination, entrant). Inverser ne produit aucun effet.
  • Double NAT (CGNAT + box) : empile deux traductions et casse le port forwarding.
  • Le NAT réécrit les adresses IP pour faire passer un réseau privé (RFC 1918) derrière une IP publique partagée.
  • SNAT réécrit la source en POSTROUTING (sortie) ; DNAT réécrit la destination en PREROUTING (entrée, port forwarding).
  • MASQUERADE = SNAT dynamique (IP de l'interface) ; le masquerade domestique est en réalité du PAT (partage par les ports).
  • Le NAT s'appuie sur conntrack : le décalage entre les tuples original et reply est la signature d'une traduction.
  • Le port forwarding exige ip_forward=1 et une règle FORWARD, pas seulement le DNAT.
  • Le CGNAT (100.64.0.0/10) partage l'IP du fournisseur et empêche le port forwarding côté client.
  • IPv6 n'utilise pas de NAT : adresses globales + pare-feu à états (NAT66 déconseillé).

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