Iptables est l’outil de pare-feu Linux classique pour le filtrage, le NAT et la manipulation de paquets. Ce memo couvre les commandes les plus courantes pour inspecter les règles, autoriser ou bloquer le trafic, effectuer la redirection de ports et gérer la persistance.
1. Consultation des règles#
| Commande |
Description |
sudo iptables -L |
Lister les règles |
sudo iptables -L -n |
Lister sans résolution DNS |
sudo iptables -L -v |
Sortie détaillée (compteurs, interfaces) |
sudo iptables -L -n --line-numbers |
Afficher les numéros de règle |
sudo iptables -S |
Afficher les règles sous forme de commandes |
sudo iptables -t nat -L -n -v |
Voir les règles NAT |
2. Politiques par défaut#
| Commande |
Description |
sudo iptables -P INPUT DROP |
Drop par défaut en entrée |
sudo iptables -P FORWARD DROP |
Drop par défaut en forwarding |
sudo iptables -P OUTPUT ACCEPT |
Accept par défaut en sortie |
3. Autoriser du trafic#
| Commande |
Description |
sudo iptables -A INPUT -i lo -j ACCEPT |
Autoriser le loopback |
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Autoriser les connexions établies |
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
Autoriser SSH |
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
Autoriser HTTP |
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT |
Autoriser HTTPS |
sudo iptables -A INPUT -p icmp -j ACCEPT |
Autoriser le ping |
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT |
Autoriser un sous-réseau |
⚠️ La règle ESTABLISHED,RELATED doit toujours être placée avant toute règle de DROP basée sur ipset/GeoIP/ASN, sinon le trafic retour légitime peut être coupé (cf. section Docker ci-dessous).
4. Bloquer du trafic#
| Commande |
Description |
sudo iptables -A INPUT -s 203.0.113.10 -j DROP |
Bloquer une IP |
sudo iptables -A INPUT -s 203.0.113.0/24 -j DROP |
Bloquer un sous-réseau |
sudo iptables -A INPUT -p tcp --dport 23 -j DROP |
Bloquer Telnet |
sudo iptables -A INPUT -p tcp --dport 25 -j REJECT |
Rejeter SMTP |
sudo iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP |
Bloquer une adresse MAC |
5. Redirection de ports (DNAT)#
| Commande |
Description |
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80 |
Rediriger un port vers un hôte |
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 |
Rediriger un port local |
sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT |
Autoriser le trafic forwardé |
6. NAT (Masquerade)#
| Commande |
Description |
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
NAT dynamique sur une interface |
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1 |
NAT statique |
sudo sysctl -w net.ipv4.ip_forward=1 |
Activer l’IP forwarding |
7. Limitation de débit#
| Commande |
Description |
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 3 -j ACCEPT |
Limiter les tentatives SSH |
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP |
Limiter les connexions par IP |
sudo iptables -A INPUT -p icmp -m limit --limit 1/sec -j ACCEPT |
Limiter le ping |
8. Logging#
| Commande |
Description |
sudo iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " |
Logger les paquets droppés |
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH: " --log-level 4 |
Logger l’accès SSH |
sudo iptables -A INPUT -m limit --limit 5/min -j LOG |
Logger avec limitation de débit |
9. Suppression et insertion de règles#
| Commande |
Description |
sudo iptables -D INPUT 3 |
Supprimer la règle n°3 |
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT |
Supprimer par spécification |
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT |
Insérer une règle en tête |
sudo iptables -R INPUT 3 -p tcp --dport 443 -j ACCEPT |
Remplacer la règle n°3 |
sudo iptables -F |
Vider toutes les règles |
sudo iptables -F INPUT |
Vider uniquement la chaîne INPUT |
10. Sauvegarde et restauration#
| Commande |
Description |
sudo iptables-save > /etc/iptables/rules.v4 |
Sauvegarder les règles |
sudo iptables-restore < /etc/iptables/rules.v4 |
Restaurer les règles |
sudo apt install iptables-persistent |
Persistance auto sur Debian/Ubuntu |
sudo service iptables save |
Sauvegarde sur RHEL et dérivés |
11. Cas particulier : Docker / Podman / Kubernetes#
Ces environnements manipulent directement iptables au niveau du kernel, souvent en dehors des règles gérées manuellement — ce qui casse fréquemment les setups perso si on ne le sait pas.
Docker#
- Docker crée ses propres chaînes :
DOCKER, DOCKER-USER, DOCKER-ISOLATION-STAGE-1/2, insérées dans FORWARD.
DOCKER-USER est la seule chaîne prévue pour que l’admin ajoute ses propres règles (filtrage IP/ASN, GeoIP, etc.) sans que Docker ne les écrase au redémarrage du daemon.
- Piège classique : si une règle
ipset/GeoIP en DROP est placée dans DOCKER-USER avant un bypass ESTABLISHED,RELATED, le trafic retour des connexions déjà ouvertes vers les conteneurs est cassé.
# Ordre correct dans DOCKER-USER
sudo iptables -I DOCKER-USER 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -I DOCKER-USER 2 -m set --match-set blocklist src -j DROP
- Docker réinjecte ses chaînes à chaque restart du daemon → toute règle ajoutée manuellement dans
DOCKER-USER doit être réappliquée via un script (setup-firewall.sh, service systemd, ou hook --iptables=false + gestion manuelle complète).
docker network publie les ports via DNAT dans la chaîne DOCKER (table nat), pas via INPUT — donc filtrer uniquement INPUT ne bloque pas le trafic vers les conteneurs exposés.
Podman#
- En mode rootless, Podman utilise généralement netavark ou CNI et peut passer par
nftables selon la distro, avec un comportement différent de Docker (pas de chaîne DOCKER-USER équivalente par défaut).
- En mode rootful avec le backend iptables legacy, le comportement se rapproche de Docker (chaînes
NETAVARK-* ou CNI-* insérées dans FORWARD).
- Vérifier le backend actif :
podman info --format '{{.Host.NetworkBackend}}'.
Kubernetes#
kube-proxy en mode iptables génère un grand nombre de chaînes dynamiques : KUBE-SERVICES, KUBE-NODEPORTS, KUBE-FW-*, KUBE-SEP-*, insérées dans PREROUTING/OUTPUT/FORWARD.
- Ces règles sont régénérées en continu par kube-proxy (toutes les quelques secondes) : toute règle manuelle ajoutée directement dans les chaînes
KUBE-* sera écrasée.
- Pour du filtrage périmétrique sur un nœud Kubernetes, préférer :
- des NetworkPolicies au niveau Kubernetes (si le CNI les supporte : Calico, Cilium, etc.) plutôt qu’iptables brut ;
- ou une chaîne personnalisée en amont (
INPUT/FORWARD) explicitement non gérée par kube-proxy, avec un -j ACCEPT de retour placé avant tout DROP.
- Si
kube-proxy tourne en mode ipvs, l’impact sur les chaînes iptables classiques est plus limité (seulement pour le NAT de certains services).
Bonnes pratiques générales#
- Toujours placer le bypass
ESTABLISHED,RELATED avant toute règle de DROP basée sur set/ASN/GeoIP, dans chaque chaîne concernée (INPUT, FORWARD, DOCKER-USER).
- Ne jamais modifier les chaînes générées automatiquement (
DOCKER, KUBE-*) — utiliser les points d’extension prévus (DOCKER-USER) ou un outillage de plus haut niveau (NetworkPolicies).
- Rendre les règles custom idempotentes et rejouables au boot/restart du daemon concerné, car ces outils réinitialisent leurs chaînes régulièrement.
- Vérifier après chaque déploiement/restart avec
iptables -S DOCKER-USER (ou équivalent) que les règles perso sont toujours présentes.
Généré à partir du cheatsheet iptables (Dejan Panovski, mis à jour le 9 fév. 2026), complété par les considérations Docker/Podman/Kubernetes.
A titre d’indication la dernière partie traitant les cas de Podman et Kubernetes et les bonnes pratiques ont étés complétés à l’aide d’une IA.