Filtrage du trafic réseau, NAT et règles de pare-feu sous Linux.
Sujets associés : NAT, Pile réseau — Vue d’ensemble, Interfaces et routage
Architecture iptables
iptables opère via des tables contenant des chaînes de règles :
Tables :
filter ← filtrage par défaut (INPUT, FORWARD, OUTPUT)
nat ← translation d'adresses (PREROUTING, POSTROUTING, OUTPUT)
mangle ← modification des paquets (TTL, TOS, mark)
raw ← désactiver le suivi de connexion
Chaînes principales (table filter) :
INPUT ← paquets à destination de la machine locale
FORWARD ← paquets traversant la machine (routage)
OUTPUT ← paquets émis par la machine locale
Politiques par défaut : ACCEPT ou DROP
iptables — commandes essentielles
Lister les règles
# Lister les règles de la table filter
sudo iptables -L
sudo iptables -L -v # avec compteurs (paquets/octets)
sudo iptables -L -n # sans résolution DNS
sudo iptables -L -n --line-numbers # avec numéros de ligne
# Lister une chaîne spécifique
sudo iptables -L INPUT -n -v
# Lister la table NAT
sudo iptables -t nat -L -n -vPolitique par défaut
# Tout bloquer par défaut puis autoriser explicitement (whitelist)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# Tout autoriser (permissif)
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPTRègles de base — INPUT (trafic entrant)
# Autoriser les connexions déjà établies (CRITIQUE — à mettre en premier)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Autoriser le loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Autoriser SSH (port 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Autoriser SSH depuis un réseau spécifique seulement
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# Autoriser HTTP / HTTPS
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# Autoriser ICMP (ping)
sudo iptables -A INPUT -p icmp -j ACCEPT
# Bloquer une IP spécifique
sudo iptables -A INPUT -s 203.0.113.5 -j DROP
# Limiter le débit (rate limiting) — protection contre les scans
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 5 -j ACCEPT
# Journaliser avant de bloquer
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
sudo iptables -A INPUT -j DROPSupprimer des règles
# Supprimer par numéro de ligne
sudo iptables -L INPUT -n --line-numbers
sudo iptables -D INPUT 3 # supprimer la règle n°3
# Supprimer en spécifiant la règle exacte
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# Vider toutes les règles d'une chaîne
sudo iptables -F INPUT # flush INPUT
sudo iptables -F # flush toutes les chaînes
# Remettre à zéro les compteurs
sudo iptables -ZNAT (table nat)
# MASQUERADE : SNAT dynamique (pour partager une connexion Internet)
# Activer le forwarding IP d'abord
sudo sysctl -w net.ipv4.ip_forward=1
# Trafic sortant via eth0 → masquer l'IP source
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# SNAT statique (IP publique fixe)
sudo iptables -t nat -A POSTROUTING -o eth0 \
-j SNAT --to-source 203.0.113.1
# DNAT : redirection de port entrant (port forwarding)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.1.10:8080
# → le port 80 de la machine est redirigé vers 192.168.1.10:8080
# Redirection locale (OUTPUT) — utile pour rediriger localhost
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 \
-j REDIRECT --to-port 8080FORWARD (routeur / passerelle)
# Permettre le forwarding entre deux interfaces
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
# Permettre le trafic vers un réseau spécifique seulement
sudo iptables -A FORWARD -s 192.168.1.0/24 -d 10.0.0.0/8 -j ACCEPTPersister les règles
# Debian/Ubuntu
sudo apt install iptables-persistent
sudo netfilter-persistent save # sauvegarder
sudo netfilter-persistent reload # recharger
# Sauvegarder manuellement
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
# Restaurer
sudo iptables-restore < /etc/iptables/rules.v4ufw — interface simplifiée (Ubuntu)
ufw (Uncomplicated Firewall) est une couche d’abstraction au-dessus d’iptables.
# Activer / désactiver
sudo ufw enable
sudo ufw disable
sudo ufw status verbose
# Politique par défaut
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Autoriser / refuser par service ou port
sudo ufw allow ssh # utilise /etc/services
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443
sudo ufw deny 23 # bloquer Telnet
# Autoriser un port depuis une IP spécifique
sudo ufw allow from 192.168.1.0/24 to any port 22
sudo ufw allow from 10.0.0.5 to any port 5432
# Limiter les tentatives de connexion (fail2ban-like)
sudo ufw limit ssh
# Supprimer une règle
sudo ufw delete allow 80
sudo ufw status numbered # voir les numéros
sudo ufw delete 3 # supprimer par numéro
# Voir les règles iptables générées par ufw
sudo iptables -L -n -vnftables — successeur d’iptables (moderne)
# Afficher les règles actuelles
sudo nft list ruleset
# Afficher une table spécifique
sudo nft list table inet filter
# Exemple de configuration complète
sudo nft -f - <<'EOF'
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif lo accept
ip protocol icmp accept
tcp dport 22 accept
tcp dport { 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
EOF
# Ajouter une règle
sudo nft add rule inet filter input tcp dport 8080 accept
# Supprimer la ruleset complète
sudo nft flush ruleset
# Persister
sudo nft list ruleset > /etc/nftables.conf
sudo systemctl enable nftablesRecettes complètes
# Pare-feu serveur web minimal
sudo iptables -F
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT # SSH restreint
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# NAT pour partager la connexion Internet du serveur
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Bloquer une IP après trop de tentatives (exemple manuel)
sudo iptables -A INPUT -s 203.0.113.5 -j DROPEn relation avec
- Linux Réseau — Vue d’ensemble — index des commandes réseau Linux
- NAT — concept de la translation d’adresses
- Interfaces et routage — ip forwarding, tables de routage
- Ports et Sockets — identifier les ports à ouvrir / fermer
- Proxy — Commandes — rediriger le trafic via iptables REDIRECT