TP n°6 première partie : Introduction à Netfilter

Durée : 2h

Compte rendu individuel

Vous devez obligatoirement déposer un compte rendu illustré individuel pour chaque TP au format TPi.[pdf|odt|docx] sur Moodle.

Vous pouvez compléter vos TP après une séance en déposant un nouveau fichier TPiv2.[pdf|odt|docx].

Objectif

Connaître les bases de l'outil Netfilter des systèmes Linux.

Savoir réaliser des filtres simples.

Environnement de travail

Une machine virtuelle sous Ubuntu en mode bridge avec les droits d'administrateur.

Travail demandé

Présentation de Netfilter

Netfilter est un module exclusivement Linux, noyau 2.4 et supérieur, permettant l'interception et la manipulation des paquets IP entrant et sortant d'une machine. Il peut ainsi assurer la réalisation :

Principe de fonctionnement

Chaque paquet passant par votre carte réseau est transmis à la partie netfilter du noyau. Netfilter étudie alors ce paquet, en-têtes et contenu, et en se basant sur des règles définies par l'administrateur, il va choisir de laisser passer le paquet intact, de modifier ce paquet, de le transmettre à une autre machine ou encore d'interdire son passage.

La commande iptables permet d'éditer, modifier, supprimer ou ajouter des règles au module netfilter. Autrement dit, nous allons configurer Netfilter grâce à la commande iptables.

Notions de tables et chaînes (À écrire dans votre compte rendu et à connaître)

Une règle Netfilter se situe dans une chaîne de règles, les règles étant exécutées d'une manière séquentielle dans chaque chaîne.

Chaque chaîne de règles se situe dans une table.

Plusieurs tables sont définies dans netfilter, nous ne mentionnerons dans ce TP qu'uniquement la table filter, et la table nat, la table filter correspondant aux notions de filtrage réseaux (accepter/refuser un paquet), et la table nat permettant de faire de la traduction d'adresses.

Vous avez ainsi vu pour chaque chaîne :

Pour le moment aucune règle ne s'affiche, par la suite cette commande vous listera l'ensemble des règles actives dans chaque chaîne d'une table.

Chaque chaîne intervient selon le schéma suivant.

Schéma fonctionnement chaînes netfilter.

D'après ce schéma, quand un paquet arrive sur votre machine il passe d'abord par la chaîne de règles PREROUTING, puis le noyau regarde la destination de ce paquet (opération appelée routage dans netfilter). Si ce paquet est destiné à votre machine, ce dernier passe dans la chaîne INPUT, puis il est traité par des processus locaux sur votre machine. Si ce paquet n'est pas à destination de votre machine et si le forwarding dans votre machine est autorisé, le paquet entre dans la chaîne FORWARD puis la chaîne POSTROUTING. Enfin un paquet émis par votre machine passera directement dans la chaîne OUTPUT, puis par la chaîne POSTROUTING.

Création d'une première règle

Une règle netfilter se situe dans une chaîne (PREROUTING, FORWARD, INPUT, OUTPUT, ou POSTROUTING), elle-même accessible depuis une table (la table filter manipule les chaînes FORWARD, INPUT et OUTPUT, la table nat manipule les chaînes PREROUTING, POSTROUTING et OUTPUT).

Une règle netfilter indique une action à réaliser pour chaque paquet vérifiant un certain nombre de critères. Comme une action consiste à envoyer le paquet quelque part, cette dernière est appelée cible (target en anglais) dans netfilter et est déterminée avec l'option "-j cible", où cette cible peut être égale à:

Par défaut, netfilter accepte donc tous les paquets. Nous allons maintenant interdire les connexions sur le port 22 (ssh). Pour ce faire, il faut interdire les paquets dans la chaîne INPUT sur le port 22. La création de cette règle sera :

iptables -A INPUT -p tcp --dport 22 -j DROP

L'option -A INPUT indique l'ajout d'une règle en bas (cf l'anglais append) de la liste des règles de la chaîne INPUT. L'insertion en première position d'une règle est indiquée par l'option -I (cf l'anglais insert). L'insertion à une position i dans une chaîne CHAINE est indiquée par l'option -I CHAINE i .

L'option -p tcp indique que le paquet doit utiliser le protocole tcp (cf le fichier /etc/protocols pour la liste complète).

L'option --dport 22 indique que le paquet est à destination du port 22 de votre machine. On aurait pu aussi mettre --dport ssh. Le port source peut être spécifier par l'option --sport.

L'option -j DROP indique la cible action où envoyer le paquet vérifiant les critères précédents. Cette dernière signifie comme nous l'avons vu précédemment "la poubelle en silence".

Ici DROP a été utilisé (le paquet est supprimé en silence). Le résultat observé est l'impossibilité d'établir la connexion ssh, mais on observe également que le client ssh met un certain à vous signaler le problème : il attend désespérément une réponse du serveur...

Pour supprimer une règle, vous avez l'option -D

iptables -D INPUT -p tcp --dport 22 -j DROP

Régler la politique par défaut

Comme vous l'avez remarqué précédemment, chaque chaîne possède une règle par défaut ("policy") qui définit si l'on accepte ou refuse les paquets par défaut. Par défaut, les "policy" sont à ACCEPT. Cette politique peut être changer à DROP avec l'option -P.

Les deux politiques que vous devez connaître sont "ACCEPT" et "DROP". Pour ACCEPT : les connexions sont acceptées; pour DROP : les connexions ne sont pas autorisées.

Création d'une deuxième règle

Nous voulons maintenant autoriser uniquement une certaine machine M à se connecter sur votre machine en ssh. Pour cela, nous allons insérer une règle pour cette machine M avant la règle créée précédemment qui droppe les paquets ssh entrant.

Il est important de bien placer cette règle avant la première, car les règles sont exécutées séquentiellement dans l'ordre où elles ont été placées dans la liste. Si la première règle rejette le paquet, celui-ci n'atteindra jamais la deuxième...

Utilisation d'une chaîne personnelle

Pour rendre plus claire l'organisation de vos règles, vous pouvez créer des nouvelles chaînes pour y mettre vos règles. Par exemple, 6 mois plus tard l'installation de vos règles, vous devriez vous y retrouver. En outre, il vaut mieux éviter de trop remplir les chaînes existantes comme notamment la chaîne INPUT

Remarque : l'option -j RETURN permet de sortir d'une chaîne pour retourner à la chaîne de niveau supérieur pour continuer à suivre les règles de cette dernière.

Journalisation

L'option -j LOG --log-prefix 'ce_que_vous_voulez' déclenche un message qui sera enregistré par le système généralement dans le fichier /var/log/kern.log.

Conclusion sur ce TP

Ce TP vous a donné une idée de ce qu'il était possible de réaliser avec le module Linux Netfilter via sa commande de configuration iptables. Vous pouvez approfondir vos connaissances avec man iptables. Ceci sera aussi approfondi dans le module de sécurité de deuxième année.

Vous pouvez aussi noter qu'il existe des outils graphiques pour paramétrer netfilter comme par exemple Firewall Builder.

La commande nftables est également une évolution de la commande iptables.