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