374 lines
12 KiB
Markdown
374 lines
12 KiB
Markdown
|
|
# **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
|
||
|
|
|