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

    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) Les Tables : Le champ d'action

    Les règles d'iptables sont organisées en tables, chacune ayant une fonction spécifique :

    • 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 le partage de connexion (Masquerading).
    • mangle : Utilisée pour la modification des paquets (changement de TTL, marqueurs de paquets).

    b) 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 :

    • INPUT : Pour les paquets qui entrent dans le système et sont destinés à une application locale (ex: connexion SSH à ce serveur).
    • : 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).

    c) Les Cibles (Targets) : L'action finale

    Chaque règle, si elle est satisfaite, exécute une action appelée cible :

    • 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.

    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.

    Capture d'écran de la sortie de iptables -L -n -v montrant Policy ACCEPT
    Figure 3.1: État initial de la table de filtrage iptables par défaut (Policy ACCEPT).

    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, 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 qui font partie de connexions déjà initiées (par exemple, la réponse à votre requête web) de revenir sans être bloqués par la politique DROP.

    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
    

    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.

    a) Autoriser le service SSH (Port 22)

    Pour vous connecter à distance à votre machine, le port 22 doit être explicitement autorisé en entrée :

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

    b) Autoriser l'accès à un serveur Web (Ports 80 et 443)

    Si votre machine est un serveur Web, ouvrez les ports HTTP (80) et HTTPS (443) :

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

    c) 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.

    # Bloque tous les paquets provenant de l'adresse 192.168.1.100
    sudo iptables -I INPUT -s 192.168.1.100 -j DROP
    

    d) 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.
    

    Capture d'écran de la sortie de iptables -L -n -v avec les politiques DROP et les règles de filtrage
    Figure 4.1: Affichage des règles iptables finales incluant les politiques par défaut à DROP et l'ouverture du port SSH.

    5. Avantages et limites de iptables

    a) Avantages

    AvantageDescription
    Contrôle GranulairePermet un contrôle précis sur les couches 3 (IP) et 4 (TCP/UDP) du modèle OSI.
    PerformanceIntégré directement dans le noyau Linux (Netfilter), il est extrêmement rapide et peu consommateur en ressources.
    PolyvalenceGère le filtrage, le NAT (partage de connexion), et les modifications de paquets (QoS).
    Standard LinuxOutil de référence, universellement supporté par toutes les distributions.

    b) Limites

    LimiteDescription
    Complexité de la syntaxeLa ligne de commande est puissante mais difficile à appréhender pour les débutants.
    Non-persistanceLes règles sont perdues au redémarrage du système par défaut. Nécessite des paquets additionnels (iptables-persistent).
    Gestion des règlesDifficile à maintenir et à auditer pour des milliers de règles.
    Basé sur IP/PortNe filtre pas facilement les attaques au niveau applicatif (Couche 7).

    c) 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, Cibles), 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