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

  1. 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).
  2. 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).
  3. 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.
  4. 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.