MAJ
This commit is contained in:
373
TP_SCR3.2/revision_scr3.2/Guide complet de iptables -t nat.md
Normal file
373
TP_SCR3.2/revision_scr3.2/Guide complet de iptables -t nat.md
Normal file
@@ -0,0 +1,373 @@
|
||||
# **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
|
||||
|
||||
Reference in New Issue
Block a user