Skip to main content

Sécuriser son serveur Linux avec Iptables

Niveau : Intermediaire⏱️ Temps estimé : 25 min
📋 Prérequis nécessaires :
  • Un serveur ou une machine Linux (Debian, Ubuntu, RHEL...)
  • Un accès administrateur (root ou privilèges sudo)
  • Notions de base sur les réseaux (adresses IP, ports, protocoles TCP/UDP)

🎯 Objectif du tutoriel​

Iptables est le pare-feu en ligne de commande historique sous Linux, servant à filtrer le trafic réseau directement via le noyau.

Dans ce guide, vous allez :

  1. Comprendre l'architecture d'Iptables (tables, chaînes et priorités).
  2. Lister, analyser et auditer vos règles actives.
  3. Créer des règles de filtrage (FILTER) et de redirection de port (NAT).
  4. Supprimer des règles ciblées et rendre votre configuration persistante après redémarrage.
Note moderne (nftables & iptables)

Sur la majorité des distributions récentes, iptables s'appuie désormais sur le backend iptables-nft (émulation via nftables). La syntaxe standard iptables reste néanmoins universelle et largement utilisée dans les environnements serveurs, les conteneurs et les scripts d'infrastructure.


🏗️ Comprendre l'architecture d'Iptables​

Iptables fonctionne selon une hiérarchie stricte composée de Tables, contenant des Chaînes, qui contiennent à leur tour des Règles.

1. Les Tables principales​

TableRôleChaînes associées
filter (défaut)Filtrage standard des paquets (autoriser ou bloquer).INPUT, FORWARD, OUTPUT
natModification des adresses IP / ports sources ou destinations (NAT / Port Forwarding).PREROUTING, POSTROUTING, OUTPUT
mangleModification avancée des en-têtes de paquets (TOS, TTL, etc.).Toutes les chaînes
rawConfiguration des exceptions au suivi de connexion (Connection Tracking).PREROUTING, OUTPUT

2. Les Chaînes principales​

  • INPUT : Trafic destiné localement à la machine/serveur hôte.
  • OUTPUT : Trafic généré par la machine/serveur local à destination de l'extérieur.
  • FORWARD : Trafic transitant par la machine (mode routeur / passerelle).
  • PREROUTING : Traitement des paquets dès leur réception (avant décision de routage).
  • POSTROUTING : Traitement des paquets juste avant leur émission sur le réseau.

3. Les Actions (TARGET / -j)​

Lorsqu'un paquet correspond aux critères d'une règle, une cible (target) lui est assignée :

  • ACCEPT : Le paquet est autorisé à passer.
  • DROP : Le paquet est rejeté silencieusement (l'émetteur ne reçoit aucune réponse).
  • REJECT : Le paquet est rejeté et un message d'erreur ICMP (port unreachable) est renvoyé à l'émetteur.
  • DNAT / SNAT : Modification de la destination ou de la source (utilisé avec la table nat).
Ordre d'évaluation des règles

Les règles sont évaluées séquentiellement, de haut en bas. Dès qu'un paquet correspond aux critères d'une règle, l'action associée est exécutée et le parcours s'arrête (sauf cibles spécifiques de log/audit). Si aucune règle ne correspond, la politique par défaut (Default Policy) de la chaîne s'applique.


🛠️ Étape 1 : Vérification et installation​

Vérifiez si Iptables est disponible sur votre système :

Terminal
iptables -V

Si le binaire n'est pas présent, installez-le via votre gestionnaire de paquets :

sudo apt update && sudo apt install -y iptables

🔍 Étape 2 : Inspecter les règles actives​

Pour auditer efficacement votre pare-feu, privilégiez toujours l'affichage verbeux numérique avec numérotation des lignes.

Table FILTER (par défaut)​

Terminal
sudo iptables -nvL --line-numbers

Options utilisées :

  • -n : Affichage numérique (évite les résolutions DNS lentes des adresses IP et ports).
  • -v : Mode verbeux (affiche le nombre de paquets pkts et de volumes bytes traités).
  • -L : Liste les règles.
  • --line-numbers : Ajoute l'index de chaque règle (indispensable pour la modification/suppression).

Table NAT​

Pour consulter la table NAT, utilisez le flag -t :

Terminal
sudo iptables -t nat -nvL --line-numbers

✍️ Étape 3 : Création et manipulation des règles​

Syntaxe générale​

Une commande Iptables suit généralement ce canevas :

sudo iptables [-t table] <commande> <CHAÎNE> [critères] -j <ACTION>
  • -A (Append) : Ajoute la règle à la fin de la chaîne.
  • -I (Insert) : Insère la règle au début (index 1) ou à une position spécifique.
  • -p (Protocol) : Protocole (tcp, udp, icmp, all).
  • -s / -d : Adresse IP ou sous-réseau source / destination.
  • --sport / --dport : Port source / destination.
  • -i / -o : Interface réseau d'entrée (input interface) / sortie (output interface).

Cas pratiques de filtrage​

1. Autoriser le trafic sur l'interface de boucle locale (loopback)​

Indispensable pour le fonctionnement interne de nombreux services (bases de données locales, IPC) :

Terminal
sudo iptables -A INPUT -i lo -j ACCEPT

2. Autoriser les connexions déjà établies et relatives (Stateful Firewall)​

Garantit que les réponses aux requêtes initiées par le serveur ne soient pas bloquées :

Terminal
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

3. Autoriser le trafic SSH (Port 22) depuis une IP spécifique​

Pour sécuriser l'accès d'administration :

Terminal
sudo iptables -A INPUT -p tcp -s 192.168.1.50 --dport 22 -j ACCEPT

4. Bloquer le trafic HTTP (Port 80)​

Insérer la règle en première position de la chaîne INPUT :

Terminal
sudo iptables -I INPUT 1 -p tcp --dport 80 -j DROP

5. Redirection de port / Port Forwarding (Table NAT)​

Rediriger le trafic entrant sur le port 8080 de l'hôte vers le port 80 d'un conteneur ou d'une VM (10.122.151.191) :

Terminal
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.122.151.191:80
Activation du routage IP

Pour que la redirection NAT fonctionne entre interfaces, l'IP forwarding doit être activé au niveau du noyau :

sudo sysctl -w net.ipv4.ip_forward=1

🗑️ Étape 4 : Suppression et réinitialisation des règles​

Supprimer une règle par son numéro de ligne​

Repérez d'abord le numéro de la règle via sudo iptables -nvL --line-numbers, puis supprimez-la :

Terminal
# Supprimer la règle n°3 dans la chaîne INPUT de la table FILTER
sudo iptables -D INPUT 3

# Supprimer la règle n°1 dans la chaîne PREROUTING de la table NAT
sudo iptables -t nat -D PREROUTING 1

Réinitialiser l'ensemble des règles (Flush)​

Prudence lors d'un Flush à distance

Si la politique par défaut (Policy) de la chaîne INPUT est définie sur DROP, exécuter iptables -F coupera instantanément votre session SSH. Rétablissez d'abord la politique par défaut sur ACCEPT avant de vider les tables.

Terminal
# 1. Rétablir les politiques par défaut à ACCEPT
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

# 2. Vider toutes les règles de la table FILTER
sudo iptables -F

# 3. Vider toutes les règles de la table NAT
sudo iptables -t nat -F

# 4. Supprimer les chaînes personnalisées vides
sudo iptables -X

💾 Étape 5 : Sauvegarde et persistance des règles​

Par défaut, les règles Iptables résident en mémoire volatile dans l'espace noyau : elles sont perdues au redémarrage du système.

Méthode manuelle (fichiers temporaires)​

Terminal
# Sauvegarder la configuration active
sudo iptables-save > /etc/iptables.rules

# Restaurer une configuration existante
sudo iptables-restore < /etc/iptables.rules

Méthode recommandée : Persistance automatisée​

Sur les distributions Debian/Ubuntu, le paquet iptables-persistent charge automatiquement les règles au boot via systemd.

Terminal
# Installation du paquet persistant
sudo apt install -y iptables-persistent

À chaque modification de vos règles, sauvegardez l'état dans les fichiers de référence /etc/iptables/rules.v4 et /etc/iptables/rules.v6 :

Terminal
# Sauvegarde des règles IPv4 et IPv6
sudo netfilter-persistent save

# Recharger les règles sauvegardées
sudo netfilter-persistent reload

📋 Résumé des commandes indispensables​

ObjectifCommande
Lister les règles avec détails & numérossudo iptables -nvL --line-numbers
Lister les règles de la table NATsudo iptables -t nat -nvL --line-numbers
Ajouter une règle en fin de chaînesudo iptables -A <CHAINE> [options] -j <ACTION>
Insérer une règle en début de chaînesudo iptables -I <CHAINE> 1 [options] -j <ACTION>
Supprimer une règle par son indexsudo iptables -D <CHAINE> <NUMERO>
Vider toutes les règles activessudo iptables -F
Sauvegarder pour persistancesudo netfilter-persistent save