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