Sécuriser son serveur Linux avec Iptables
- 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 :
- Comprendre l'architecture d'Iptables (tables, chaînes et priorités).
- Lister, analyser et auditer vos règles actives.
- Créer des règles de filtrage (
FILTER) et de redirection de port (NAT). - Supprimer des règles ciblées et rendre votre configuration persistante après redémarrage.
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
| Table | Rôle | Chaînes associées |
|---|---|---|
filter (défaut) | Filtrage standard des paquets (autoriser ou bloquer). | INPUT, FORWARD, OUTPUT |
nat | Modification des adresses IP / ports sources ou destinations (NAT / Port Forwarding). | PREROUTING, POSTROUTING, OUTPUT |
mangle | Modification avancée des en-têtes de paquets (TOS, TTL, etc.). | Toutes les chaînes |
raw | Configuration 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 tablenat).
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 :
iptables -V
Si le binaire n'est pas présent, installez-le via votre gestionnaire de paquets :
- Debian / Ubuntu
- RHEL / Rocky / AlmaLinux
- Arch Linux
sudo apt update && sudo apt install -y iptables
sudo dnf install -y iptables iptables-services
sudo pacman -S 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)
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 paquetspktset de volumesbytestraité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 :
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) :
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 :
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 :
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 :
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) :
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.122.151.191:80
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 :
# 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)
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.
# 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)
# 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.
# 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 :
# 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
| Objectif | Commande |
|---|---|
| Lister les règles avec détails & numéros | sudo iptables -nvL --line-numbers |
| Lister les règles de la table NAT | sudo iptables -t nat -nvL --line-numbers |
| Ajouter une règle en fin de chaîne | sudo iptables -A <CHAINE> [options] -j <ACTION> |
| Insérer une règle en début de chaîne | sudo iptables -I <CHAINE> 1 [options] -j <ACTION> |
| Supprimer une règle par son index | sudo iptables -D <CHAINE> <NUMERO> |
| Vider toutes les règles actives | sudo iptables -F |
| Sauvegarder pour persistance | sudo netfilter-persistent save |