Files
BUT2/TP_SCR3.2/revision_scr3.2/Guide complet de iptables -t nat.md
2025-12-10 01:26:13 +01:00

12 KiB

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