NetFilter avec IPtables n'a pas du tout la même architecture, le fonctionnement est différent, même si la syntaxe d'IPtables peut paraître proche de celle d'IPchains.
En particulier, les chaînes INPUT et OUTPUT ne contrôlent pas tout ce qui entre et sort de la passerelle, routage compris, mais uniquement ce qui entre en direction de la passerelle elle même et sort de la passerelle elle même. Entendez par là que tout le trafic entre le réseau privé masqué par le NAT et l'Internet ne sera aucunement influencé par ces deux chaînes. Nous verrons en détail plus loin pourquoi et comment.
Finalement, le meilleur conseil à donner aux utilisateurs d'IPchains, c'est d'oublier purement et simplement tout ce qu'ils savent sur le sujet…
Avec les versions 2.2.x, nous avions l'excellent outil gfcc
qui permettait de faire à peu près tout ce qu'il était possible de faire avec IPchains. Malheureusement, avec IPtables, je n'ai pas encore trouvé d'outil équivalent à l'heure où j'écris ces lignes. Essayez de voir avec knetfilter, mais ce n'est pas du tout la même chose.
Comme d'habitude sur ce site, l'exposé s'appuie sur une passerelle Linux mettant en relation un réseau privé avec le Net, au moyen d'une liaison haut débit et permanente de type câble ou ADSL. Si vous ne savez pas faire, voyez le chapitre « Partage de connexion ».
La machine Linux dispose de deux interfaces Ethernet. Ici:
Il faut bien comprendre qu'à priori, il peut entrer et sortir des données de chaque interface.
Quel que soit le cas de figure vu plus haut, dans ce qui suit, nous ne ferons pas de ségrégation sur l'interface par laquelle les paquets entrent ni l'interface par laquelle les paquets sortent. Cette ségrégation interviendra éventuellement dans les règles que nous écrirons avec IPtables.
En tout état de cause, dans l'explication qui suit, quelles que soient l'origine et la destination des paquets, ils vont entrer dans la pile de protocoles IP par le même point et en sortir par le même autre point. Netfilter se présente comme une série de 5 “hooks” (points d'accrochage), sur lesquels des modules de traitement des paquets vont se greffer. Ces points sont:
La branche gauche représente le trajet des paquets qui entrent et qui sortent vers et depuis un processus local (SMB, FTP, HTTP etc.) La branche de droite représente le trajet des paquets qui traversent notre passerelle dans sa fonction de routeur.
Que l'on peut représenter autrement ainsi :Attention toutefois, ces diagrammes sont faux, dans la mesure où ils sont largement simplifiés. Leur but est uniquement de montrer où Netfilter vient interagir avec la pile IP, en aucun cas il ne représente l'architecture complète de la pile IP.
A travers ces cinq points d'insertion, Netfilter va être capable :
Netfilter dispose d'une commande à tout faire : IPtables. Cette commande va permettre, entre autres, d'écrire des chaînes de règles dans des tables. Il y a dans Netfilter trois tables qui correspondent aux trois principales fonctions vues plus haut:
Cette table va contenir toutes les règles qui permettront de filtrer les paquets. Cette table contient trois chaînes :
Cette table permet d'effectuer toutes les translations d'adresses nécessaires.
Cette table permet le marquage des paquets entrants (PREROUTING) et générés localement (OUTPUT). Le marquage de paquets va permettre un traitement spécifique des paquets marqués dans les tables de routage avec IPROUTE 2. Ceci nous mènerait trop loin. Si vous êtes intéressé par cette question, voyez à ce sujet le document: Linux 2.4 Advanced Routing HOWTO.
Depuis la version 2.4.18 du noyau, d'autres tables ont été rajoutées sur tous les hooks
. Nous avons ainsi à notre disposition les tables supplémentaires INPUT, POSTROUTING et FORWARD
Les chaînes sont des ensembles de règles que nous allons écrire dans chaque table. Ces chaînes vont permettre d'identifier des paquets qui correspondent à certains critères.
Les cibles enfin sont des sortes d'aiguillage qui dirigeront les paquets satisfaisant aux critères . Les cibles préconstruites sont :
Suivant les contextes, d'autres cibles deviennent accessibles, comme REJECT (similaire à DROP, mais avec envoi d'un message d'erreur ICMP à la source du paquet rejeté), RETURN, REDIRECT, SNAT, DNAT, MASQUERADE…
En français, nous pourrons faire des choses de ce genre :
Nous verrons cela plus en détail dans les divers exemples.
IPtables est en quelques sortes l'interface utilisateur de Netfilter. Dans sa partie visible, tout ceci ressemble au bonnes vieilles IPchains (noyaux 2.2), mais ici, ce n'est qu'une interface de commande de Netfilter. La syntaxe est plus complète et plus rigoureuse.