Iptables

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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 paquets
  • nat : masquerade / DNAT / SNAT
  • mangle : modification des en-têtes de paquet

Cibles (-j) les plus courantes :

  • ACCEPT : le paquet est autorisé à poursuivre
  • DROP : le paquet est jeté silencieusement, aucun message à l'émetteur
  • REJECT : 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