Iptables
| Fiche express | |
|---|---|
| Domaine | Pare-feu Linux (Netfilter) |
| Commande | iptables
|
| Persistance (RHEL/CentOS) | /etc/sysconfig/iptables
|
| Persistance (Debian/Ubuntu) | /etc/iptables/rules.v4
|
| Voir aussi | Firewalld · Script iptables · schéma détaillé |
iptables est l'interface historique de configuration de Netfilter, le sous-système de filtrage de paquets du noyau Linux. Il permet de monter un pare-feu (accept/drop/reject), de faire du NAT (masquerade, DNAT) et de suivre l'état des connexions (conntrack).
Fonctionnement (packet flow)
Le service s'organise en 5 chaînes : PREROUTING, INPUT, FORWARD, POSTROUTING, OUTPUT. Chaque paquet destiné à la machine locale passe par INPUT ; un paquet à router vers une autre machine passe par FORWARD ; un paquet émis localement passe par OUTPUT.
Syntaxe de base
iptables [-t table] -[ADC] chaine regle -specification [options]
Trois tables principales (-t) :
filter(défaut) : filtrage accept/drop/reject des paquetsnat: masquerade / DNAT / SNATmangle: modification des en-têtes de paquet
Cibles (-j) les plus courantes :
ACCEPT: le paquet est autorisé à poursuivreDROP: le paquet est jeté silencieusement, aucun message à l'émetteurREJECT: le paquet est jeté, un message d'erreur est renvoyé à l'émetteur
-A: ajoute une règle en fin de chaîne (append)-I chaine N: insère en position N (insert)-D: supprime une règle (par numéro ou par contenu)-F: vide toutes les règles (flush)-P: définit la politique par défaut de la chaîne-j cible: action à appliquer (ACCEPT,DROP,
REJECT — REJECT notifie explicitement le refus à la source, DROP l'ignore)
Exemples :
# Refuser les connexions SSH entrantes
iptables -A INPUT -p tcp --dport 22 -j DROP
# Autoriser un hôte précis en priorité (règle en position 1)
iptables -I INPUT 1 -p tcp --dport 22 -s IP_HOTE -j ACCEPT
# Grouper plusieurs règles dans une chaîne dédiée
iptables -N ssh
iptables -A INPUT -p tcp --dport 22 -j ssh
iptables -A ssh -s IP_HOTE -j ACCEPT
iptables -A ssh -j DROP
# Journaliser puis continuer l'évaluation
iptables -A INPUT -j LOG --log-prefix "refus ssh: "
# Rejeter tout un sous-réseau (message d'erreur renvoyé)
iptables -A INPUT -s 192.168.75.0/24 -j REJECT
# Jeter silencieusement l'ICMP d'un hôte précis
iptables -A INPUT -s 192.168.25.200 -p icmp -j DROP
Suivi de connexion (conntrack)
Par défaut iptables traite les paquets indépendamment les uns des autres. Avec le module
state, il devient possible de raisonner en connexions plutôt qu'en paquets :
- NEW : premier paquet (SYN) d'une connexion
- ESTABLISHED : connexion acceptée, échange en cours
- RELATED : connexion liée à une connexion ESTABLISHED existante (ex. FTP data)
- INVALID : paquet non conforme à l'état attendu
Cas d'usage classique — FTP actif utilise le port 21 pour le contrôle mais négocie un port dynamique (>1023) pour les données ; sans conntrack il faudrait ouvrir toute la plage :
modprobe ip_conntrack_ftp
iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
NAT et masquerade
# Masquerading (adresse de sortie dynamique, typique box/routeur)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
# DNAT : rediriger un port public vers un service interne
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to 10.0.0.1:22
Faire du routage (passerelle)
sysctl -w net.ipv4.ip_forward=1 # à ajouter aussi dans /etc/sysctl.conf
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t filter -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT
Exemple : script de pare-feu complet
Politique par défaut restrictive (tout fermé en entrée/transit, ouvert en sortie), avec une chaîne dédiée pour journaliser les rejets :
######### Purge des règles existantes #########
iptables -F
iptables -X
######### Politique par défaut #########
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
######### Chaîne de filtrage dédiée #########
iptables -N RH-Firewall-1-INPUT
iptables -A INPUT -j RH-Firewall-1-INPUT
iptables -A FORWARD -j RH-Firewall-1-INPUT
######### Chaîne de log des rejets #########
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-level debug --log-prefix "[IPTABLES DROP] "
######### Règles #########
iptables -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A RH-Firewall-1-INPUT -i lo -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
iptables -A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -j LOG_DROP
Réseau à plusieurs zones (Internet / DMZ / LAN) — le principe reste le même, avec forwarding sélectif entre interfaces et translation de ports en entrée :
INTERNET_NIC=eth0
DMZ_NIC=eth1
LAN_NIC=eth2
sysctl -w net.ipv4.ip_forward=1
iptables -t filter -F
iptables -t nat -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
# Accès admin sur le firewall lui-même
iptables -A INPUT -i ${INTERNET_NIC} -p tcp --dport 22 -j ACCEPT
# Connexions déjà établies
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# LAN -> Internet
iptables -A FORWARD -i ${LAN_NIC} -o ${INTERNET_NIC} -s 10.1.0.0/24 -j ACCEPT
# Internet -> DMZ (web + ssh + mail)
iptables -A FORWARD -i ${INTERNET_NIC} -o ${DMZ_NIC} -p tcp --dport 80 -d 10.0.0.1 -j ACCEPT
iptables -A FORWARD -i ${INTERNET_NIC} -o ${DMZ_NIC} -p tcp --dport 22 -d 10.0.0.1 -j ACCEPT
iptables -A FORWARD -i ${INTERNET_NIC} -o ${DMZ_NIC} -p tcp --dport 25 -d 10.0.0.1 -j ACCEPT
iptables -t nat -A PREROUTING -i ${INTERNET_NIC} -p tcp --dport 2222 -j DNAT --to 10.0.0.1:22
# Masquage des IP privées en sortie
iptables -t nat -A POSTROUTING -o ${INTERNET_NIC} -s 10.0.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ${INTERNET_NIC} -s 10.1.0.0/24 -j MASQUERADE
Persistance
# Debian / Ubuntu
iptables-save > /etc/iptables/rules.v4
apt-get install iptables-persistent
# RHEL / CentOS
iptables-save > /etc/sysconfig/iptables
chkconfig iptables on
service iptables save
Anti-DDoS basique
iptables -A INPUT -p tcp --dport 80 -m limit --limit 50/minute --limit-burst 100 -j ACCEPT
Inspection
iptables -L # règles actives (résumé)
iptables -L -v # règles actives, avec compteurs
iptables -L -v -n # sans résolution DNS (plus rapide)
iptables -L -v --line-numbers # avec numéros de règle (utile pour -D)
iptables -t nat --list # règles NAT spécifiquement
cat /etc/sysconfig/iptables # règles persistées (RHEL/CentOS)
Voir aussi
- Script iptables — script minimal commenté
- Scripts iptables schéma iptables — schéma détaillé du flux de traitement
- Firewalld — remplaçant orienté zones sur RHEL7+ (au-dessus de netfilter, pas un concurrent)