326 lines
11 KiB
Plaintext
326 lines
11 KiB
Plaintext
|
|
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
|