IREX - Mettre en place un pare-feu avec iptables sous Linux
La simple protection de votre serveur par un pare-feu basique ne suffit plus. La vraie sécurité exige de maîtriser chaque paquet. Iptables est la sentinelle indispensable de votre noyau Linux
1. Introduction : La nécessité du contrôle réseau
2. Présentation de iptables : Fonctionnalités et rôle
3. Déploiement : Guide d'installation et de configuration
4. Exemples de filtrage de trafic
5. Avantages et limites de iptables
6. Conclusion
7. Voir aussi
- filter (par défaut) : Utilisée pour le filtrage de base (autoriser, bloquer). C'est la table la plus courante.
- nat : Utilisée pour la traduction d'adresses réseau (NAT), essentielle pour la redirection de ports (DNAT) et le partage de connexion (Masquerading/SNAT).
- mangle : Utilisée pour la modification des paquets (changement de TTL, marqueurs de paquets), souvent pour la QoS (Qualité de Service).
- PREROUTING : Le tout premier point de contrôle pour le trafic entrant.
- INPUT : Pour les paquets qui entrent dans le système et sont destinés à une application locale (ex: connexion SSH à ce serveur).
- OUTPUT : Pour les paquets générés par le système lui-même (ex: une requête DNS émise par le serveur).
- FORWARD : Pour les paquets qui traversent le système d'une interface à une autre (lorsque la machine agit comme un routeur).
- POSTROUTING : Le tout dernier point de contrôle pour le trafic avant qu'il ne quitte la machine.
- NEW : Le premier paquet d'une nouvelle tentative de connexion qui n'a pas encore été établie.
- ESTABLISHED : Paquet appartenant à une connexion déjà initiée et établie (ex: le trafic continu d'une session SSH ouverte).
- RELATED : Paquet lié à une connexion existante, mais qui en est techniquement une nouvelle (ex: le canal de données ouvert après la connexion de contrôle d'un FTP passif).
- INVALID : Paquet illégitime, fragmenté de manière incorrecte ou non traçable. Ces paquets doivent presque toujours être rejetés (`DROP`) pour éviter les attaques par désynchronisation.
- ACCEPT : Autorise le paquet à poursuivre son chemin.
- DROP : Rejette le paquet sans envoyer de réponse à l'émetteur (silencieux). C'est l'option la plus sécuritaire.
- REJECT : Bloque le paquet et renvoie un message d'erreur (par exemple, "Port unreachable").
- LOG : Enregistre l'événement avant de passer à la règle suivante.
- Toujours Autoriser les Connexions Établies : La règle `ESTABLISHED,RELATED` est la première règle d'ACCEPT pour éviter de casser toutes les communications après avoir mis `INPUT` à `DROP`.
- Ne jamais mettre OUTPUT en DROP sans règles précises : Bloquer la chaîne `OUTPUT` par défaut nécessite d'autoriser explicitement chaque service sortant (DNS, HTTP, etc.), ce qui est souvent inutile et trop complexe pour un hôte simple.
- Toujours Tester via Session SSH Secondaire : Si vous configurez un pare-feu à distance via SSH, ouvrez une seconde session avant de valider les règles pour éviter d'être bloqué hors du serveur en cas d'erreur.
- Toujours Sauvegarder Avant Reboot : Les règles ne sont pas permanentes. Utilisez `iptables-persistent` ou un script de sauvegarde avant tout redémarrage.
- Perte de connexion SSH après une mauvaise règle : Si vous êtes bloqué, et si vous avez un accès physique ou à la console, exécutez `sudo iptables -F` (vider toutes les règles) pour récupérer l'accès et recommencer.
-
NAT ou Routage qui ne fonctionne pas : L'une des raisons principales est la désactivation du IP forwarding dans le noyau. Activez-le comme suit :
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward - Problème après mise en DROP de OUTPUT : Si vous mettez la politique `OUTPUT` à `DROP`, vous devez impérativement autoriser les requêtes DNS (port 53 UDP et TCP) ainsi que le trafic `RELATED,ESTABLISHED` en sortie pour que votre machine puisse naviguer et résoudre des noms.
1. Introduction : La nécessité du contrôle réseau
Dans un environnement numérique en constante menace, la simple connexion d'un système à Internet expose la machine à des tentatives incessantes de balayage de ports (port scanning), d'intrusions et d'attaques par déni de service (DoS). Pour garantir la sécurité, l'intégrité et la disponibilité d'un système Linux, il est fondamental d'établir une barrière de défense stricte : le pare-feu. Cet outil ne se contente pas de bloquer ; il contrôle et filtre chaque paquet de données entrant, sortant et transitant par votre machine. Sous Linux, l'outil de référence le plus puissant pour cette tâche est iptables, l'interface qui permet de manipuler les règles du module Netfilter du noyau.
2. Présentation de iptables : Fonctionnalités et rôle
Iptables est l'utilitaire en ligne de commande qui sert d'interface de gestion pour le framework Netfilter intégré au noyau Linux. Son rôle est de permettre un contrôle granulaire (règle par règle) des paquets réseau basés sur des critères comme l'adresse IP source/destination, le port, le protocole, et l'état de la connexion.
a) Netfilter : Le cheminement d'un paquet
Netfilter intercepte les paquets à des points précis du cheminement à travers le noyau Linux. La chaîne qu'un paquet empruntera dépend de sa destination : est-il destiné à la machine elle-même (trafic local) ou doit-il la traverser (trafic routé) ?
Ce flux est essentiel pour comprendre à quelle chaîne appliquer vos règles. Une règle de redirection de port (DNAT) se place en PREROUTING. La traduction d'adresse source (SNAT/Masquerade) se place en POSTROUTING.
b) Les Tables : Le champ d'action
Les règles d'iptables sont organisées en tables, chacune ayant une fonction spécifique :
c) Les Chaînes : Les points de contrôle
Chaque table contient des chaînes qui représentent des points spécifiques du chemin d'un paquet à travers le noyau :
d) L'inspection d'état (Stateful Firewall)
L'une des forces majeures d'iptables est son mécanisme d'inspection d'état des connexions via le module conntrack. Il permet au pare-feu de suivre le statut de chaque flux réseau, rendant la sécurité à la fois plus efficace et plus performante. La classification des paquets est vitale :
e) Les Cibles (Targets) : L'action finale
Chaque règle, si elle est satisfaite, exécute une action appelée cible :
3. Déploiement : Guide d'installation et de configuration
a) Installation et affichage des règles
Sur Kali Linux, iptables est généralement préinstallé. La commande suivante permet de l'afficher et d'en visualiser l'état actuel :
sudo iptables -L -n -v
La sortie initiale montre souvent une politique par défaut sur ACCEPT pour toutes les chaînes. C'est l'état le plus dangereux.
b) La Configuration Zéro Confiance (Zero Trust)
La meilleure pratique en matière de sécurité consiste à adopter une politique par défaut restrictive (DROP), puis à autoriser explicitement ce qui est nécessaire.
1. Vider les règles existantes :
sudo iptables -F
2. Définir la politique par défaut à DROP :
Nous bloquons tout le trafic entrant et tout le trafic qui tente de transiter par la machine.
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
3. Autoriser les connexions établies (CRUCIAL) :
Cette règle est vitale. Elle permet aux paquets entrants faisant partie d'une connexion établie (y compris les réponses à nos requêtes) de passer.
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
4. Autoriser l'interface de bouclage (Loopback) :
Le trafic sur l'interface de bouclage (lo) est nécessaire pour que les applications locales puissent communiquer entre elles.
sudo iptables -A INPUT -i lo -j ACCEPT
c) Récapitulatif des commandes essentielles
| Objectif | Commande | Description |
|---|---|---|
| Afficher les règles | sudo iptables -L -n -v | Liste toutes les règles (numérique, verbeux). |
| Ajouter une règle | sudo iptables -A <CHAÎNE> ... | Ajoute la règle à la fin de la chaîne. |
| Insérer une règle | sudo iptables -I <CHAÎNE> 1 ... | Insère la règle à une position spécifique (ici, la première). |
| Supprimer une règle | sudo iptables -D <CHAÎNE> <numéro/règle> | Supprime une règle par son numéro de ligne ou sa spécification exacte. |
| Vider les chaînes | sudo iptables -F | Supprime toutes les règles dans toutes les chaînes. |
| Sauvegarder les règles | sudo iptables-save | Affiche les règles dans un format qui peut être restauré. |
4. Exemples de filtrage de trafic
Maintenant que le pare-feu est fermé par défaut, nous allons ajouter des règles pour ouvrir uniquement les ports des services que nous souhaitons exposer et mettre en place des protections.
a) Autoriser les services de base (SSH, Web)
Pour vous connecter à distance (port 22) et exposer un serveur Web (ports 80 et 443) :
# Autoriser le SSH (Port 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Autoriser l'accès Web (Ports 80 et 443)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
b) Bloquer une adresse IP spécifique (Blacklisting)
Pour bloquer un attaquant ou une source d'attaques connue, utilisez l'option -s (source). La règle doit être placée avant les règles d'ACCEPT, d'où l'utilisation de -I pour l'insérer.
# Bloque tous les paquets provenant de l'adresse 192.168.1.100
sudo iptables -I INPUT -s 192.168.1.100 -j DROP
c) Filtrage avancé et Protection anti-DDoS
Iptables permet d'utiliser des modules avancés (-m) pour mettre en place des défenses efficaces :
1. Protection contre les attaques par force brute SSH :
# 1. Enregistre l'adresse IP pour chaque nouvelle connexion SSH
sudo iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --set
# 2. Bloque si l'adresse IP tente de se connecter plus de 4 fois en 60 secondes
sudo iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --update --seconds 60 --hitcount 4 -j DROP
2. Limiter les requêtes ICMP (Ping) :
Limiter le ping empêche les attaques par inondation ICMP (ICMP Flood).
# N'accepte qu'une requête echo-request par seconde
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
3. Protection contre les scans malveillants (FIN, Xmas, NULL) :
Ces règles bloquent les paquets illégaux utilisés par certains scanners comme Nmap.
# Bloque les paquets avec des états invalides
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Bloque les paquets sans aucun flag (NULL scan)
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Bloque les paquets avec tous les flags positionnés (XMAS scan)
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# Bloque les paquets avec FIN, URG, PSH (FIN/PSH/URG scan)
sudo iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
d) NAT et Routage (Masquerading)
La table `nat` est cruciale lorsque votre machine Linux agit comme un routeur pour un réseau interne, permettant à plusieurs machines de partager une seule adresse IP publique.
1. Masquerading (NAT Sortant) :
Le Masquerading (ou SNAT dynamique) est indispensable. Il remplace l'adresse IP privée de la machine interne par l'adresse IP publique de la machine Linux (via l'interface `eth0`) avant que le paquet ne quitte le réseau. Cette règle doit être placée en POSTROUTING.
# Masquerade les paquets sortant par eth0 (internet)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
2. Redirection de Ports (DNAT) :
Ceci redirige le trafic entrant (ex: sur le port 80 de la machine Linux) vers un serveur spécifique sur le réseau interne (ex: 192.168.0.50).
# Redirige le trafic entrant sur le port 80 (interface eth0)
# vers le port 8080 de l'hôte interne 192.168.0.50
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.50:8080
e) Journaliser le trafic bloqué
Pour des raisons de forensique et de surveillance, il est judicieux d'enregistrer les tentatives de connexion avant de les bloquer.
# Journalise les paquets bloqués (max 5/minute)
sudo iptables -A INPUT -m state --state NEW -m limit --limit 5/min -j LOG --log-prefix "IPTABLES BLOCKED: " --log-level 7
# Puis, le paquet qui n'a pas été accepté par une règle précédente sera DRPPÉ par la politique par défaut.
5. Avantages et limites de iptables
a) Avantages
| Avantage | Description |
|---|---|
| Contrôle Granulaire | Permet un contrôle précis sur les couches 3 (IP) et 4 (TCP/UDP) du modèle OSI, y compris l'inspection d'état. |
| Performance | Intégré directement dans le noyau Linux (Netfilter), il est extrêmement rapide et peu consommateur en ressources. |
| Polyvalence | Gère le filtrage, le NAT (partage de connexion), et les modifications de paquets (QoS). |
| Standard Linux | Outil de référence, universellement supporté par toutes les distributions. |
b) Limites
| Limite | Description |
|---|---|
| Complexité de la syntaxe | La ligne de commande est puissante mais difficile à appréhender pour les débutants, et la logique des chaînes demande une bonne compréhension du réseau. |
| Non-persistance | Les règles sont perdues au redémarrage du système par défaut. Nécessite des paquets additionnels (iptables-persistent) ou des scripts de démarrage. |
| Gestion des règles | Difficile à maintenir et à auditer pour des milliers de règles, nécessitant souvent des outils de gestion de niveau supérieur. |
| Basé sur IP/Port | Ne filtre pas facilement les attaques au niveau applicatif (Couche 7). Des outils comme un Web Application Firewall (WAF) sont requis pour cela. |
c) Bonnes pratiques de sécurité
Pour garantir un pare-feu à la fois robuste et facile à gérer, suivez ces règles d'or :
d) Dépannage et erreurs courantes
Les erreurs de configuration sont fréquentes. Voici les problèmes typiques et leurs solutions :
e) Rendre les règles permanentes
Après avoir défini vos règles, vous devez les sauvegarder pour qu'elles survivent à un redémarrage. Sur les systèmes basés sur Debian/Kali, cela se fait via le paquet iptables-persistent :
sudo apt install iptables-persistent
# Les règles sont automatiquement sauvegardées
# lors de l'installation et peuvent être rechargées via :
# sudo systemctl restart netfilter-persistent
6. Conclusion
Iptables est l'outil indispensable pour quiconque administre un serveur Linux. Sa puissance réside dans sa capacité à appliquer une politique de sécurité de type Zéro Confiance (Zero Trust) : tout est bloqué par défaut, et seuls les besoins essentiels sont autorisés explicitement. En maîtrisant ses concepts fondamentaux (Tables, Chaînes, États de connexion) et ses modules avancés, vous réduisez considérablement la surface d'attaque de votre machine, assurant ainsi sa résilience face aux menaces extérieures.
7. Voir aussi
No comments yet. Start a new discussion.