Skip to Content
CLI🚧 iptables

🚧 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.backup

Politique 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 ACCEPT

Logging (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 DROP

Bloquer / 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 ACCEPT

NAT et routage

# 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 ACCEPT

Persistance 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.v4

IPv6 (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 ACCEPT

nftables 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 ACCEPT

Quick Reference

ActionCommande
Voir règlesiptables -L -n -v
Politique DROPiptables -P INPUT DROP
Autoriser SSHiptables -A INPUT -p tcp --dport 22 -j ACCEPT
Autoriser HTTP/HTTPSiptables -A INPUT -p tcp --dport 80/443 -j ACCEPT
Connexions établiesiptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
MASQUERADEiptables -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
Sauvegardeiptables-save > rules.v4