Tutoriel Iptables : comment configurer les tables Filter du noyau Linux

Le filtrage des paquets est un composant décisif pour la sécurité des systèmes des ordinateurs faisant partie d’un réseau. Le contrôle et la maintenance du trafic des données entrantes et sortantes, qui fait souvent partie d’un pare-feu, est conçu pour veiller à ce que seuls les paquets exempts de spams et de malwares soient envoyés ou reçus. Un filtre de paquets, composé des modules du logiciel Netfilter, est intégré par défaut dans le noyau Linux. Toutefois, il est nécessaire de disposer d’un programme supplémentaire pour le configurer. Pour les noyaux Linux 2.4 et 2.6, vous aurez besoin du programme gratuit iptables, également développé par l’équipe du projet Netfilter.

En tant qu’administrateur, vous utilisez iptables pour créer, modifier ou supprimer des règles, mais les paramètres sont perdus en cas de redémarrage du système. Grâce aux fonctions iptables-save et iptables-restore, vous pouvez enregistrer les règles que vous avez créées. Ceci peut même être entièrement automatisé pendant le reboot grâce au script init. Iptables est limité au protocole IPv4, car il existe des variantes pour les autres protocoles, comme ip6tables pour IPv6 ou ebtables pour les paquets Ethernet, qui font également partie du module du noyau.

Dans le tutoriel Iptables qui suit, nous vous présentons les fonctionnalités basiques et les options du logiciel de filtrage de paquets. Nous expliquerons ensuite comment configurer les tables grâce à plusieurs exemples.

Comment fonctionne iptables

En général, Iptable pour Linux est déjà pré-installé. Si ce n’est pas le cas, ou si vous voulez vous assurer d’utiliser la dernière version du programme, vous pouvez l’installer ou le mettre à jour grâce au gestionnaire de paquets de votre distribution. Il suffit de taper la commande suivante dans le terminal:

sudo apt-get install iptables

Il existe différentes interfaces graphiques pour iptables, comme notamment Webmin, grâce auxquelles le contrôle du programme avec la ligne de commande est relativement simple et rapide à apprendre.

Iptables requiert des privilèges de système étendus et ne peut donc être utilisé qu’avec un compte root ou des droits d’administrateur. Les tables chargées avec le programme et générées par le noyau contiennent des chaînes de règles, fournissant des informations sur la façon dont les paquets de donnés envoyés et reçus doivent être traités. Ces paquets sont propagés de règle en règle au sein de la chaîne, dans laquelle chaque règle peut induire une action (jump target) ou un changement vers une autre chaîne (goto chain).

Les actions qui peuvent arriver lorsqu’une règle s’applique à un paquet sont :

  • ACCEPT : le paquet est accepté.
  • DROP : le paquet est rejeté.
  • QUEUE : le paquet est déplacé dans les processus utilisateurs. Ceci nécessite un intermédiaire (queue handler), qui transfère le paquet à une application.
  • RETURN : le paquet est renvoyé à la chaîne précédente s’il s’agit d’une chaine personnalisée par l’utilisateur. Dans les chaînes standard, le règlement (policy) est exécuté (sans configuration par défaut : ACCEPT).

Les chaînes standard mentionnées dans l’action RETURN sont spécifiées dans les tables filter  iptables. Il s’agit des trois chaînes INPUT, FORWARD et OUTPUT. Input est en charge de livrer les paquets au système, tandis que FORWARD traite les paquets arrivants en attente d’être transmis. La chaîne OUTPUT, au contraire, contrôle le trafic de données généré par votre ordinateur. Outre les tables filter, il existe une table NAT pour la transcription des adresses réseau, et une table MANGLE pour la manipulation des paquets. La page Man d’Unix, accessible à tout moment grâce à la commande, fournit un aperçu détaillé des fonctionnalités du logiciel de filtrage.

man iptables

Autrement, il existe de nombreux conseils pour Iptables sur netfilter.org, disponibles en plusieurs langues.

Comment créer et gérer vos propres règles de filtres

Le tableau ci-dessous réunit les différentes commandes permettant de créer et de gérer les chaînes. Pour réguler le trafic des données, vous pouvez soit créer votre propre chaîne, soit vous servir des trois chaînes standard INPUT, OUTPUT et FORWARD. Voici les options de configuration les plus importantes:

Commande iptables Exemple Explication
-N "nom de la chaîne" sudo iptables -N test Crée une nouvelle chaîne appelée "test".
-X "nom de la chaîne" sudo iptables -X test Supprime la chaîne vide "test" ; ne fonctionne pas avec les chaînes standard INPUT, OUTPUT et FORWARD.
-L "nom de la chaîne " sudo iptables -L test Liste les règles de la chaîne "test".
-F "nom de la chaîne " sudo iptables -F test Supprime les règles de la chaîne "test".
-P "nom de la chaîne " "Action" sudo iptables -P INPUT ACCEPT Définit le règlement de la chaîne. Dans l’exemple, le paquet est automatiquement accepté si les règles de filtre de la chaîne INPUT ne sont pas accessibles.
-A "nom de la chaîne " "Règle" sudo iptables -A test -s 127.0.0.1 -j DROP Attache une nouvelle règle à la chaîne sélectionnée. Dans l’exemple, on ajoute à la chaîne "test" une règle pour rejeter les paquets de données provenant de l’adresse IP 127.0.0.1.
-D "nom de la chaîne " "Règle" sudo iptables -D test -s 127.0.0.1 -j DROP Supprime une règle spécifique à la chaîne sélectionnée.
-I "nom de la chaîne " "Position" "Regel" sudo iptables -I test 1 -s 127.0.0.1 -j DROP Ajoute une nouvelle règle à une position définie dans la chaîne sélectionnée (position 1 dans l’exemple).
-D "nom de la chaîne " "Position" sudo iptables -D test 1 Supprime une règle occupant une position prédéfinie dans la chaîne sélectionnée (position 1 dans l’exemple).

Comment iptables contribue à la protection du système

Voici une présentation des possibilités d’iptables par exemple pour l’installation d’un pare-feu rudimentaire. Puisque les trois chaînes standard INPUT, OUTPUT et FORWARD ont des règles prédéfinies en fonction de la distribution, la première étape est de les supprimer:

sudo iptables -F

Ensuite, il faut ajouter le règlement DROP à chacune des trois chaînes, afin de s’assurer que les paquets de données soient de toute façon rejetés, dans la mesure où aucune des règles de filtres installées ne conduit à un résultat positif :

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

Ensuite, supprimez le localhost (lo) de votre système, pour le trafic entrant (-i) ou sortant (-o) (ACCEPT), en augmentant à la fois les chaînes INPUT et OUTPUT de la règle appropriée (-A) :

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

Précisez ensuite l’autorisation des connections sortantes HTTP et HTTPS (port 80 et port 443) pour les ports TCP classiques 1024 à 65535 :

sudo iptables -A OUTPUT -o eth0 -p tcp --dport 80 --sport 1024:65535 -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 --sport 1024:65535 -j ACCEPT

Dans un dernier temps, autorisez tous les paquets de données entrants ou sortants appartenant à une connexion existante (--state ESTABLISHED) ou s’y référant (--state RELATED) :

sudo iptables -A INPUT -i eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT

Dans la mesure où les règles créées avec iptables ne sont pas durables et ne valent que jusqu’à ce que votre ordinateur ne s’éteigne, il est recommandé d’utiliser iptables-save pour sauvegarder vos paramètres sous forme de document .rules dans les fichiers d’iptables. La commande adaptée, par exemple pour un système Ubuntu, est la suivante :

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

En entrant la commande

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

chargez manuellement le fichier à chaque fois que vous redémarrez votre système. Une alternative consiste à créer un script correspondant pour que l’application de filtrage de paquets fonctionne automatiquement.

Pour plus d’informations sur le logiciel de filtrage, nous vous conseillons le tutoriel iptables disponible gratuitement dans la bibliothèque Wikibooks.