🚧 iptables
Rappels pratiques pour gérer le pare-feu netfilter sous Linux (stack iptables « legacy »). Inclut règles de base, NAT, logging et conseils pour éviter les lockouts.
Attention à ne pas vous couper l’accès SSH. Testez toujours les règles dans une session séparée et ayez un plan de rollback (timer, console VPS) avant d’appliquer des politiques DROP.
Concepts rapides
- Tables:
filter(par défaut),nat,mangle,raw. - Chaînes:
INPUT(vers la machine),OUTPUT(depuis la machine),FORWARD(à travers la machine),PREROUTING/POSTROUTING(NAT). - Ordre d’évaluation important; les règles sont parcourues de haut en bas.
Inspecter l’état
# Règles lisibles avec compteurs
sudo iptables -L -n -v
# Règles par table
sudo iptables -t nat -L -n -v
# Exporter toutes les règles (persistant)
sudo iptables-save > /root/iptables.backupPolitique par défaut et règles de base
Stratégie courante: DROP par défaut, autoriser le trafic nécessaire, accepter les connexions établies, autoriser SSH/HTTP/HTTPS, loopback, ping (optionnel).
# Réinitialiser (prudent en prod: faites-le en session console)
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -X
# Politiques par défaut (DROP sur INPUT et FORWARD, ACCEPT sur OUTPUT)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 1) Autoriser loopback
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
# 2) Autoriser connexions existantes
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 3) Autoriser SSH (port 22)
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# 4) Autoriser HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
# 5) ICMP (ping) optionnel
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 6) Tout le reste -> DROP (déjà via policy)Durcissement et rate limiting
# Limiter un port contre le flood (ex: 10 nouvelles connexions SSH/minute, burst 20)
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
-m limit --limit 10/min --limit-burst 20 -j ACCEPT
# Trop verbeux ? Utiliser hashlimit pour SYN
sudo iptables -A INPUT -p tcp --syn --dport 80 \
-m hashlimit --hashlimit 50/sec --hashlimit-burst 100 \
--hashlimit-mode srcip --hashlimit-name http_rate -j ACCEPTLogging (journaliser puis DROP)
# Journaliser les paquets rejetés (avec rate limit pour éviter le spam)
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-drop: " --log-level 4
sudo iptables -A INPUT -j DROPBloquer / autoriser par IP/réseau
# Bloquer une IP
sudo iptables -A INPUT -s 1.2.3.4 -j DROP
# Bloquer un réseau (CIDR)
sudo iptables -A INPUT -s 203.0.113.0/24 -j DROP
# Autoriser une IP à accéder à SSH seulement
sudo iptables -A INPUT -p tcp --dport 22 -s 198.51.100.10 -j ACCEPTNAT et routage
Partage Internet (MASQUERADE)
# Activer le routage IP (temporaire)
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# NAT masquerade pour trafic sortant via eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Autoriser le forward (LAN -> Internet)
sudo iptables -A FORWARD -i lan0 -o eth0 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o lan0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTPersistance des règles
# Sauvegarder
sudo iptables-save | sudo tee /etc/iptables/rules.v4
# Restaurer au boot (Debian/Ubuntu: paquet iptables-persistent)
sudo apt-get install -y iptables-persistent
# Les règles seront chargées depuis /etc/iptables/rules.v4IPv6 (ip6tables)
# Exemple minimal IPv6 (mêmes principes)
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo ip6tables -P OUTPUT ACCEPT
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPTnftables vs iptables
Les distributions récentes utilisent nftables par défaut (iptables peut être un shim vers iptables-nft). Pour de nouveaux déploiements, privilégiez nftables. Cette page reste utile pour systèmes legacy et dépannage.
Réinitialiser proprement
# Vider toutes les règles et chaînes custom
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -X
# Réinitialiser les politiques
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPTQuick Reference
| Action | Commande |
|---|---|
| Voir règles | iptables -L -n -v |
| Politique DROP | iptables -P INPUT DROP |
| Autoriser SSH | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
| Autoriser HTTP/HTTPS | iptables -A INPUT -p tcp --dport 80/443 -j ACCEPT |
| Connexions établies | iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
| MASQUERADE | iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
| DNAT 8080->10.0.0.10:80 | -t nat -A PREROUTING --dport 8080 -j DNAT --to 10.0.0.10:80 |
| Sauvegarde | iptables-save > rules.v4 |