← Sommaire SkyLinux

iptables — Le pare-feu Linux

Le pare-feu est la première ligne de défense de ton système. Sous Linux, iptables est l'outil historique pour filtrer le trafic réseau. Même si des outils plus récents comme nftables ou ufw existent, comprendre iptables reste essentiel pour maîtriser le fonctionnement des pare-feu sous Linux.

Concept : Les chaînes (chains)

iptables organise les règles en chaînes. Chaque paquet réseau traverse ces chaînes et est examiné par les règles.

Les trois chaînes principales

Les autres chaînes

Concept : Les cibles (targets)

Quand un paquet correspond à une règle, une cible est appliquée :

Afficher les règles actuelles

sudo iptables -L -v -n

Explication des options :

sudo iptables -L INPUT -v -n --line-numbers

Affiche les règles de la chaîne INPUT avec les numéros de ligne.

Règles de base

Autoriser le trafic localhost

sudo iptables -A INPUT -i lo -j ACCEPT

-A INPUT ajoute une règle à la chaîne INPUT, -i lo targets l'interface loopback, -j ACCEPT accepte les paquets.

Autoriser les connexions établies

sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-m state charge le module state, --state ESTABLISHED,RELATED cible les connexions déjà établies ou liées.

Autoriser SSH (port 22)

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

-p tcp targets le protocole TCP, --dport 22 cible le port destination 22.

Autoriser HTTP et HTTPS (ports 80 et 443)

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Bloquer une adresse IP spécifique

sudo iptables -A INPUT -s 192.168.1.100 -j DROP

-s spécifie l'adresse source.

Bloquer un port spécifique

sudo iptables -A INPUT -p tcp --dport 8080 -j REJECT

Limiter le nombre de connexions (protection DDoS simple)

sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j DROP

Cette règle limite à 100 connexions simultanées sur le port 80.

Gérer les règles

Supprimer une règle par son numéro

sudo iptables -D INPUT 3

Supprime la règle numéro 3 de la chaîne INPUT.

Supprimer toutes les règles d'une chaîne

sudo iptables -F INPUT

-F vide la chaîne INPUT.

Supprimer toutes les règles (tout réinitialiser)

sudo iptables -F

Remplacer une règle

sudo iptables -R INPUT 5 -p tcp --dport 22 -j ACCEPT

Remplace la règle 5 dans INPUT.

Insérer une règle au début

sudo iptables -I INPUT 1 -s 10.0.0.0/8 -j DROP

-I INPUT 1 insère la règle en position 1 (au début).

Politiques par défaut

Par défaut, toutes les chaînes acceptent tout. Pour changer :

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

Attention : si tu changes la politique INPUT en DROP sans avoir autorisé le trafic localhost et les connexions établies, tu risques de te retrouver bloqué hors de ta machine !

Sauvegarder et restaurer les règles

Sauvegarder avec iptables-save

sudo iptables-save > /etc/iptables/rules.v4

Sur Debian/Ubuntu, utilise plutôt :

sudo sh -c "iptables-save > /etc/iptables/rules.v4"

Restaurer avec iptables-restore

sudo iptables-restore < /etc/iptables/rules.v4

Sur CentOS/RHEL

sudo service iptables save

Cela sauvegarde automatiquement dans /etc/sysconfig/iptables.

Règles常用 pour un serveur web

#!/bin/bash
# Flush existing rules
sudo iptables -F
# Default policies
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# Allow loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# Allow established connections
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Voir les règles avec numérotation

sudo iptables -L INPUT --line-numbers -n

Loguer les paquets bloqués

sudo iptables -A INPUT -j LOG --log-prefix "IPTables-DROP: " --log-level 4

Les logs apparaîtront dans /var/log/syslog ou /var/log/messages selon ta distribution.

Options úteis pour le dépannage

# Compteurs de règles
sudo iptables -L -Z
# Z = zero (remet les compteurs à zéro)
# Voir les règles dans la chaîne OUTPUT
sudo iptables -L OUTPUT -v -n

Tableau récapitulatif des options iptables

OptionDescription
-AAjouter une règle à la fin de la chaîne
-IInsérer une règle au début (ou à une position)
-DSupprimer une règle
-RRemplacer une règle
-FVider toutes les règles d'une chaîne
-LAfficher les règles
-PDéfinir la politique par défaut
-ZRemettre les compteurs à zéro
-NCréer une nouvelle chaîne
-XSupprimer une chaîne vide
-vMode verbeux
-nNe pas résoudre les noms

Résumé des targets常用

TargetComportementQuand l'utiliser
ACCEPTAutorise le paquetPour le trafic voulu
DROPIgnore silencieusementPour bloquer sans révéler que le port est actif
REJECTRejette avec un message (ICMP)Pour informer explicitement
LOGEnregistre dans les logsPour le débogage

Bonnes pratiques

  1. Commence par tout interdire (-P INPUT DROP)
  2. Autorise le loopback en premier (-i lo -j ACCEPT)
  3. Autorise les connexions établies pour ne pas casser les sessions
  4. Place les règles les plus spécifiques avant les générales
  5. Sauvegarde toujours tes règles avant de tester de nouvelles configurations
  6. Teste en local si possible, ou garde un accès SSH ouvert

Exercices pratiques

  1. Affiche les règles iptables actuelles avec sudo iptables -L -v -n.
  2. Ajoute une règle pour autoriser le port 80 (HTTP).
  3. Bloque le trafic entrant depuis une IP spécifique de ton choix.
  4. Supprime une règle que tu viens de créer.
  5. Sauvegarde tes règles et restaure-les pour vérifier que ça fonctionne.
  6. Crée un script qui configure un pare-feu de base pour un serveur web (ports 22, 80, 443).