# **Guide complet de `iptables -t nat`** ## **Structure de base** `iptables -t nat -A CHAINE [CRITÈRES] -j ACTION [OPTIONS]` * `-t nat` \= table NAT (obligatoire ici) * `-A` \= Append (ajouter à la fin) * `CHAINE` \= `PREROUTING`, `POSTROUTING` ou `OUTPUT` * `ACTION` \= `SNAT`, `DNAT`, `MASQUERADE`, `REDIRECT` --- ## **Les 3 chaînes principales de NAT** ### **1\. Chaîne `PREROUTING` \- Avant le routage** Quand : Paquets qui viennent d'arriver sur la machine Fonction : Changer la DESTINATION Typique pour : Port forwarding, redirection ### **2\. Chaîne `POSTROUTING` \- Après le routage** Quand : Paquets qui vont sortir de la machine Fonction : Changer la SOURCE Typique pour : Masquer l'adresse source, NAT sortant ### **3\. Chaîne `OUTPUT` (nat) \- Paquets générés localement** Quand : Paquets créés par la machine elle-même Fonction : Changer la destination pour le trafic local --- ## **Actions NAT principales** ### **A. `SNAT` (Source NAT) \- Changer l'adresse source** `-j SNAT --to-source ADRESSE[:PORT-PORT]` Exemples : *`# Changer la source en IP fixe`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.1` *`# Changer la source avec range de ports`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.1:1024-65535` *`# Dans ton TP`* `iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 172.16.2.254` ### **B. `MASQUERADE` \- SNAT avec IP dynamique** `-j MASQUERADE [--to-ports PORT-PORT]` Exemples : *`# Masquer tout un réseau (typique pour Internet)`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE` *`# Masquer avec ports spécifiques`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE --to-ports 1024-65535` Différence SNAT vs MASQUERADE : * `SNAT` : IP source fixe (connue à l'avance) * `MASQUERADE` : IP source \= celle de l'interface (dynamique, typique pour connexions Internet) ### **C. `DNAT` (Destination NAT) \- Changer l'adresse destination** `-j DNAT --to-destination ADRESSE[:PORT]` Exemples : *`# Port forwarding simple`* `iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80` *`# Rediriger vers un autre port`* `iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80` *`# Load balancing entre 2 serveurs`* `iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.101:80` `iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.102:80` ### **D. `REDIRECT` \- Rediriger vers un port local** `-j REDIRECT --to-ports PORT[-PORT]` Exemples : *`# Rediriger le port 80 vers 8080 local`* `iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080` *`# Rediriger vers un range de ports`* `iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080-8090` --- ## **Critères de filtrage (communs avec filter)** ### **Par adresse IP** *`# Source spécifique`* `iptables -t nat -A POSTROUTING -s 192.168.1.100 -j SNAT --to-source 203.0.113.1` *`# Destination spécifique`* `iptables -t nat -A PREROUTING -d 203.0.113.1 -j DNAT --to-destination 192.168.1.100` *`# Réseau entier`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE` ### **Par interface** *`# Interface d'entrée (-i)`* `iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100` *`# Interface de sortie (-o)`* `iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE` ### **Par protocole et port** *`# TCP`* `iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.100:22` *`# UDP`* `iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.100:53` *`# Multiple ports`* `iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 192.168.1.100` ### **Par état de connexion** *`# Seulement les nouvelles connexions`* `iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -j DNAT --to-destination 192.168.1.100` --- ## **Exemples complets pour ton TP** ### **Exemple 1 : Routeur simple avec Internet** *`# Activer le forwarding IP`* `echo 1 > /proc/sys/net/ipv4/ip_forward` *`# NAT pour le réseau local vers Internet`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE` *`# Autoriser le trafic forwardé`* `iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT` `iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT` ### **Exemple 2 : Serveur avec port forwarding** *`# Forwarding SSH`* `iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.100:22` *`# Forwarding HTTP/HTTPS`* `iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80` `iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443` *`# NAT de retour (conntrack gère automatiquement normalement)`* *`# Mais parfois besoin de :`* `iptables -t nat -A POSTROUTING -s 192.168.1.100 -j SNAT --to-source 203.0.113.1` ### **Exemple 3 : Dans ton TP02** *`# Sur GW1 : NAT entre S1 et S2`* `iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -d 172.16.2.0/24 -j SNAT --to-source 172.16.2.253` *`# Sur GW2 : NAT vers Internet`* `iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth2 -j SNAT --to-source 45.45.45.254` `iptables -t nat -A POSTROUTING -s 172.16.2.0/24 -o eth2 -j SNAT --to-source 45.45.45.254` *`# Sur GW2 : DNAT pour le FTP`* `iptables -t nat -A PREROUTING -d 45.45.45.254 -p tcp --dport 21 -j DNAT --to-destination 172.16.2.10:21` ### **Exemple 4 : Proxy transparent** *`# Rediriger tout le HTTP vers un proxy local`* `iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128` *`# Rediriger le HTTPS (nécessite proxy SSL)`* `iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 3129` ### **Exemple 5 : Load balancing** *`# Répartir la charge entre 3 serveurs web`* `iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80` `iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:80` `iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.103:80` --- ## **Chemin d'un paquet avec NAT** `Paquet entre sur eth0` `↓` `PREROUTING (nat) ← DNAT/REDIRECT (changer destination)` `↓` `ROUTAGE (décision) ← Où aller ?` `↓` `├── Pour la machine → INPUT (filter) → processus` `│` `├── Pour traverser → FORWARD (filter)` `│ ↓` `│ POSTROUTING (nat) ← SNAT/MASQUERADE (changer source)` `│ ↓` `│ Sort par interface` `│` `└── Généré localement → OUTPUT (nat) ← DNAT pour trafic local` `↓` `OUTPUT (filter)` `↓` `POSTROUTING (nat)` `↓` `Sort par interface` --- ## **Règles importantes avec connection tracking** Le NAT utilise le connection tracking pour gérer les états : *`# Voir les connexions NAT actives`* `cat /proc/net/nf_conntrack` *`# ou`* `conntrack -L` *`# Voir le statut d'une connexion spécifique`* `conntrack -L -s 192.168.1.100` *`# Effacer les connexions`* `conntrack -D` Exemple de sortie : `tcp 6 117 ESTABLISHED src=192.168.1.100 dst=8.8.8.8 sport=54321 dport=53 src=8.8.8.8 dst=203.0.113.1 sport=53 dport=54321 [ASSURED] mark=0 use=1` --- ## **Bonnes pratiques et pièges courants** ### **1\. Ordre des règles NAT** *`# Mauvais ordre`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE` `iptables -t nat -A POSTROUTING -s 192.168.1.100 -j SNAT --to-source 203.0.113.2` *`# La règle 2 n'est jamais atteinte !`* *`# Bon ordre (spécifique avant générale)`* `iptables -t nat -A POSTROUTING -s 192.168.1.100 -j SNAT --to-source 203.0.113.2` `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE` ### **2\. NAT et filtrage** *`# IMPORTANT : Les règles filter voient les adresses APRÈS PREROUTING`* *`# Donc pour DNAT :`* `iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80` *`# Puis en filter :`* `iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT # Pas 203.0.113.1 !` ### **3\. FTP avec NAT (cas spécial)** *`# FTP actif nécessite des modules spéciaux`* `modprobe nf_conntrack_ftp` `modprobe nf_nat_ftp` *`# Puis les règles NAT normales marchent`* `iptables -t nat -A PREROUTING -d IP_PUBLIQUE -p tcp --dport 21 -j DNAT --to-destination IP_FTP:21` ### **4\. Problèmes courants** *`# Oublier d'activer le forwarding`* `echo 1 > /proc/sys/net/ipv4/ip_forward` *`# Oublier les règles FORWARD après le NAT`* `iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT` `iptables -A FORWARD -i INTERNE -o EXTERNE -j ACCEPT` *`# NAT asymétrique (à éviter)`* `iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source IP_ETH0` `iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source IP_ETH1` *`# Le mieux : une seule règle MASQUERADE`* --- ## **Commandes de débogage** *`# Voir les règles NAT`* `iptables -t nat -L -v -n` *`# Voir avec numéros de ligne`* `iptables -t nat -L --line-numbers` *`# Voir les compteurs`* `iptables -t nat -L -v -n -x` *`# Tracer le chemin d'un paquet`* `iptables -t nat -L -v -n | grep -A5 -B5 "nom_regle"` *`# Voir le connection tracking`* `cat /proc/net/nf_conntrack | grep -i "ton_ip"` *`# Logguer le NAT`* `iptables -t nat -A PREROUTING -p tcp --dport 80 -j LOG --log-prefix "DNAT-80: "` `iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80` --- ## **Exemple complet de configuration type** `#!/bin/bash` *`# Configuration NAT complète pour un routeur`* *`# Réinitialiser`* `iptables -t nat -F` `iptables -t nat -X` *`# Activer le forwarding`* `sysctl -w net.ipv4.ip_forward=1` *`# === NAT SORTANT (Internet) ===`* `iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE` *`# === PORT FORWARDING ===`* *`# SSH`* `iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.100:22` *`# HTTP/HTTPS`* `iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.101:80` `iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.101:443` *`# === RÈGLES FILTER CORRESPONDANTES ===`* `iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT` `iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 22 -j ACCEPT` `iptables -A FORWARD -d 192.168.1.101 -p tcp --dport 80 -j ACCEPT` `iptables -A FORWARD -d 192.168.1.101 -p tcp --dport 443 -j ACCEPT` `iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT` `iptables -P FORWARD DROP` *`# === SAUVEGARDE ===`* `iptables-save > /etc/iptables/rules.v4` --- Ce guide couvre l'essentiel de `iptables -t nat`. La clé est de comprendre que : * `PREROUTING` \= avant routage \= changement de DESTINATION * `POSTROUTING` \= après routage \= changement de SOURCE * Le connection tracking gère automatiquement les flux inverses * Les règles `filter` voient les adresses APRÈS le `PREROUTING` NAT