Netfilter et IPtables
09/02/2005
 Christian CALECA 
Liste des cours

Architecture

Accueil ] [ Architecture ] [ Conntrack ] [ Filter ] [ NAT ] [ Et le reste ] [ iptables ]


Avant propos

Avertissement important à ceux qui maîtrisent IPchains

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

Avertissement aux utilisateurs exclusifs des interfaces graphiques

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.

Position du problème

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 qui y est consacré.

Topologie de la machine Linux

topologie La machine Linux dispose de deux interfaces Ethernet. Ici:
  • Eth0 sur le réseau local (privé)
  • Eth1 sur l'Internet via le modem câble du fournisseur d'accès. Cette interface, le plus souvent, sert de support à PPPoE.

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.

Netfilter dans la pile IP

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:

  • NF_IP_PRE_ROUTING
  • NF_IP_LOCAL_IN
  • NF_IP_FORWARD
  • NF_IP_POSTROUTING
  • NF_IP_LOCAL_OUT

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.

algorithme

Que l'on peut représenter autrement ainsi :

schéma

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.

Ce que sait faire Netfilter

A travers ces cinq points d'insertion, Netfilter va être capable :

Comment Netfilter sait le faire

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:

Les tables et leurs chaînes

Il existe trois tables qui vont servir à contenir des règles de "filtrage":

tables

La table "Filter"

Cette table va contenir toutes les règles qui permettront de filtrer les paquets. Cette table contient trois chaînes:

La table NAT

Cette table permet d'effectuer toutes les translations d'adresses nécessaires.

La table MANGLE

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

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

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.

La commande "IPtables"

IPtables est en quelques sortes l'interface utilisateur de Netfilter. Dans sa partie "visible", ça ressemble à IPchains, mais ici, ce n'est qu'une interface de commande de Netfilter. La syntaxe est plus complète et plus rigoureuse.


Accueil ] [ Suivante ]