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].
Connaître les bases de l'outil Netfilter des systèmes Linux.
Savoir réaliser des filtres simples.
Une machine virtuelle sous Ubuntu en mode bridge avec les droits d'administrateur.
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 :
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.
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.
iptables -L
Cette commande permet l'affichage des 3 chaînes de règles INPUT, OUTPUT et FORWARD présentes dans la table filter, (par défaut iptables utilise la table filter si on ne lui spécifie par une autre table via l'option '-t nom_de_table').
iptables -t nat -L
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.
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.
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
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.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
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...
iptables -I INPUT -p tcp --dport 22 -s adresse_ip_machine_M -j ACCEPT
L'option -s permet de choisir la source des paquets, il est aussi possible de spécifier des réseaux entiers au format comme 172.31.16.0/20 par exemple.
Il est aussi possible de spécifier la destination d'un paquet avec l'option -d.
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
iptables -N ma_chaine_ssh
iptables -F INPUT
Plus simplement on pourrait faire iptables -F pour effacer toutes les chaînes de la table filter.
iptables -I INPUT -p tcp --dport 22 -j ma_chaine_ssh
iptables -I ma_chaine_ssh -s adresse_ip_machine_M -j ACCEPT
iptables -P ma_chaine_ssh DROP
iptables -A ma_chaine_ssh -j DROP
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.
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.
iptables -A ma_chaine_ssh -j LOG --log-prefix 'Connexion ssh refusée'
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.