[Abstract] [Copyright Notice]

Firewalling sous Linux - Chapitre 6
Netfilter



6.1 Présentation générale

Le code de netfilter est apparu dans le noyau de développement Linux 2.3.10. Paul Russell, fort de son expérience de co-développeur d'ipchains (précédente version du code de firewalling du noyau 2.2), s'est vu confier la lourde tâche de développer celui du noyau 2.4. Ainsi, ce dernier a été embauché par un fournisseur de machines firewall basées sur Linux) pour développer netfilter à temps plein, le code étant placé sous licence GPL. L'inclusion dans le code du noyau de développement constitue pour le moment une phase de tests probante, avant la mise à disposition pour le grand public dans le noyau 2.4.

Netfilter reprend un certain nombre de concepts de son prédécesseur ipchains, tout en s'affranchissant des limitations structurelles de ce dernier. Ainsi, il confère au noyau Linux les dernières caractéristiques qui lui manquaient pour rivaliser pleinement avec les firewalls commerciaux les plus complets.


6.2 Points positifs


6.3 Points moins positifs


6.4 Architecture et fonctionnalités


6.4.1 Description des fonctionnalités offertes

Netfilter est la nouvelle génération de firewall Linux développée en vue de l'intégration dans le noyau 2.4. Comme ses prédécesseurs, il permet de spécifier les règles de filtrage et de translation d'adresses (NAT).

Netfilter est extrêmement modulaire. Il existe un module noyau ou une bibliothèque dynamique par protocole, prenant en charge l'ensemble des opérations relatives à un protocole donné (UDP, TCP, ICMP, adresses MAC, etc.). Les parties filtrage et translation d'adresses sont bien distinctes, et sont administrées au moyen de deux commandes utilisateur différentes. Le filtrage peut être effectué en espace utilisateur, ce qui permet une extensibilité quasi-infinie et permet d'implémenter ses propres modules de filtrage de haut-niveau (FTP, HTTP, ...).


6.4.2 Description des composantes du logiciel

Netfilter n'est que le nom générique du paquetage. Celui-ci contient une commande d'administration : iptables. Elle permet de spécifier les règles concernant les parties filtrage de paquets et translation d'adresses (NAT). Cette commande s'appuie sur un certain nombre de modules noyau et de bibliothèques dynamiques correspondant à l'ensemble des protocoles gérés.


6.4.3 Cadre d'utilisation conseillé

L'usage de la commande iptables est exclusivement réservé à l'administrateur. La machine sur laquelle elle est installée (le firewall) ne doit théoriquement héberger aucun service, ce qui limite les risques potentiels d'intrusion. Le firewall est en prise directe avec la connexion Internet, et tout le trafic entre l'Internet, le réseau interne et la zone "démilitarisée" (DMZ) doit passer par lui, afin de garantir un contrôle total sur les différents échanges.


6.4.4 Distribution


6.5 Description précise des fonctionnalités de netfilter

Netfilter est le nom du paquetage complet permettant de gérer l'intégralité du filtrage de paquets et du NAT (masquerading) de manière native sous Linux 2.3 et bientôt 2.4.

Netfilter s'inspire grandement de la syntaxe d'ipchains et les concepts sont à bien des égards les mêmes. Si ipchains reste au jour d'aujourd'hui l'outil de firewalling le plus éprouvé pour Linux 2.2, netfilter, en cours de développement et actuellement en phase de test, le surpasse pourtant sur tous les plans.


6.5.1 Pourquoi une nième refonte ?

Malgré les évolutions apportées, ipfwadm et ipchains comportaient encore un certain nombre de limitations :


6.5.2 Architecture générale de netfilter

L'architecture générale de netfilter est la suivante :

Netfilter insère des points d'entrée ("hooks", en anglais) dans le code noyau en des points stratégiques de la pile de protocole, permettant d'effectuer autant d'actions particulières que nécessaire aux endroits clés de la traversée des paquets.


6.5.3 Filtrage de paquets

Iptables, le système de filtrage et de NAT bâti au-dessus du canevas mis en place par netfilter, est le descendant direct d'ipchains, bien que sa conception ait au final largement été revue.

L'un des avantages de iptables est qu'il est petit et rapide. Il s'appuie directement sur les points d'entrée de netfilter. Ceci signifie qu'il n'existe plus qu'un seul endroit où filtrer un paquet donné, ce qui simplifie grandement les choses. Le fait que l'architecture de netfilter permette au point d'entrée de forwarding IP d'agir sur les paquets d'entrée ou de sortie rend également le filtrage beaucoup plus aisé.


6.5.4 Translation d'adresses (NAT) et masquerading

La structure de netfilter fournit quatre points d'entrée pour la translation d'adresse :


6.5.5 L'interface utilisateur

Iptables est la commande utilisée par l'administrateur. Elle s'exécute en mode utilisateur, bien qu'elle requiert des droits de super-utilisateur, en particulier à cause du fait qu'une ouverture de socket de type RAW (brut) est nécessaire pour dialoguer avec la partie noyau.

Iptables analyse les options de la ligne de commande, et charge en conséquence (au besoin) les extensions spécifiques aux protocoles relatifs à la règle de filtrage spécifiée.

Ces extensions se présentent sous la forme de bibliothèques dynamiques implémentant une interface bien précise.

Les règles de filtrage, et toute la communication avec le noyau est assurée par la bibliothèque lib_ipt, dont les fonctions sont appelées par iptables. Cette bibliothèque dialogue avec le noyau par l'intermédiaire d'appels setsockopt et getsockopt sur la socket de type RAW. Voir la figure ci-après.


6.5.6 Architecture interne de netfilter (code du noyau)

Voici un exemple de l'architecture de netfilter pour IPv4. La figure ci-après présente la traversée de paquets.

Voici les différents points d'entrée ("hooks") mentionnés sur ce schéma :

Sur la figure, les paquets entrent par la gauche, provenant de l'interface réseau en entrée.

Une fois les différents tests de conformité passés (c'est-à-dire pas de troncature, somme de contrôle IP exacte, etc...) et la défragmentation effectuée (si l'option CONFIG_IP_ALWAYS_DEFRAG a été activée lors de la compilation du noyau), les paquets sont passés au point d'entrée NF_IP_PRE_ROUTING.

Puis ils traversent le code assurant le routage, qui décide s'ils sont destinés à une autre interface, ou à un processus local. Il se peut que le code de routage supprime les paquets non routables.

Si le paquet est destiné à un processus local, le point d'entrée NF_IP_LOCAL_IN est sollicité avant que le paquet ne lui soit adressé.

Si le paquet est destiné à une autre interface, le point d'entrée NF_IP_FORWARD est appelé.

Enfin, le paquet atteint le point d'entréeNF_IP_POST_ROUTING, avant d'être réinjecté sur le réseau (interface de sortie).

Le point d'entréeNF_IP_LOCAL_OUT est appelé pour des paquets crées par les processus locaux.


6.5.7 Modules noyau

Chaque protocole fait l'objet d'un module inséré (ou non) dans le noyau. Chacun de ces modules peut s'enregistrer auprès des différents points d'entrée que fournit la structure basique de netfilter. A savoir qu'un module spécifique à un protocole peut demander l'exécution d'une des ses parties à tel ou tel point stratégique, depuis le coeur du code réseau du noyau.

Le module peut commander à netfilter de faire l'une de ces choses :

Cette base permet de manipuler les paquets de façon relativement complexe.


6.5.8 Connection tracking

Cette expression désigne ce qu'il est convenu d'appeler Stateful Inspection dans le vocabulaire Firewall-I.

Ipchains et le NAT (translation d'adresses) sont issus de deux projets séparés, et interagissent de façon assez compliquée, et le tout n'était nullement extensible. Il était apparu comme évident qu'une refonte était nécessaire.

Pour cette raison, l'auteur de netfilter a entrepris l'écriture d'un module noyau à usage général permettant de manipuler les paquets et de conserver l'état d'une connexion en cours. Ainsi, les modules de filtrage et de NAT se servent tous deux de ce module connu sous le nom de "connection tracking".


6.5.9 NAT

Ce module de "connection tracking" transforme un paquet sortant en une valeur de hachage représentant une partie de l'en-tête signifiante du paquet. Par exemple, pour un paquet TCP, il s'agit des adresses IP et des ports source et destination.

Pour un paquet TCP ou UDP sortant, l'adresse et le port source peuvent être modifiés, mais pas l'adresse et le port destination. On a évidemment l'inverse pour les paquets entrants.

Cette réécriture d'adresses et de ports est maintenant programmable à souhait avec netfilter, ce qui n'était pas le cas auparavant.


6.5.10 Filtrage en espace utilisateur

Avec netfilter, il devient possible de déléguer le choix du destin des paquets à une application tournant en mode utilisateur. Cette application peut également au besoin modifier le paquet.

Concrètement, il devient possible de bloquer les connexions HTTP (Web) suivant l'URL demandée, par exemple. On pourrait encore imaginer de filtrer des mails et d'y remplacer certains mots par d'autres.

Les possibilités deviennent infinies.

Seul inconvénient, le filtrage en espace utilisateur, bien qu'extensible à l'infini de façon simple, est moins performant que celui qu'accomplirait un module équivalent en espace noyau. Et la rapidité de traitement dépend bien sûr de la complexité du programme de filtrage.


6.6 Exemples de règles

Nous l'avons déjà dit, la syntaxe netfilter est très similaire à celle d'ipchains. Les grandes nouveautés sont dans le module de "connexion tracking" conservant l'état des connexions en cours (module nommé state), et dans la gestion complète du NAT.

Bloquer toutes les nouvelles connexions venant de l'interface PPP :

iptables -A forward -m state --state NEW -i ppp0 -j DROP
Masquerader toutes les connexions sortant par l'interface PPP :
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Rediriger les paquets à destination du port TCP 8080 de la machine 1.2.3.4 vers le port 80 (TCP) de la machine 192.168.1.1 :
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 8080 \
              -j DNAT --to 192.168.1.1:80


[Abstract] [Copyright Notice]

Firewalling sous Linux
Hervé Eychenne herve.eychenne@alcove.fr