Netfilter

Un article de Wikipédia, l'encyclopédie libre.

Image:netfilter-logo.png
Développeur L'equipe Netfilter[1]
Environnement GNU/Linux
Type Pare-feu
Licence GNU GPL[2]
Site web www.netfilter.org

Netfilter est le module qui fournit à Linux les fonctions de pare-feu, de traduction d'adresse et d'historisation du trafic réseau. Netfilter fonctionne en mode noyau. Il intercepte et manipule les paquets IP avant et après le routage.

iptables est la commande qui permet à un administrateur réseaux de configurer Netfilter en espace utilisateur.

Sommaire

[modifier] Historique et dénomination

Netfilter a été intégré au noyau Linux à partir de la version 2.4. Il est issu de la réécriture d'ipchains qui fonctionnait dans la série des noyaux 2.2. Pour faciliter la transition, les paramètres d'iptables ressemblent à ceux de son prédécesseur.

Le nom iptables est souvent utilisé pour parler de toute l'infrastructure Netfilter mais il n'est que l'outil permettant de le configurer à partir d'un interpréteur de commandes.

[modifier] Fonctionnement général

Cheminement des paquets IP à travers netfilter
Cheminement des paquets IP à travers netfilter[3]

Netfilter installe des accroches (hooks) dans la gestion des paquets réseau du noyau Linux. Les accroches sont spécifiques à chaque protocole réseau. Lorsqu'elles sont chargées, les tables de Netfilter inscrivent des chaînes sur ces accroches. Chacune de ces chaînes peut contenir des règles qui déterminent le traitement à effectuer sur les paquets qui traversent l'accroche. L'administrateur peut manipuler directement les règles des chaînes avec l'outil iptables.

Par exemple en IPv4, l'accroche NF_IP_LOCAL_IN est installée après le routage d'un paquet qui arrive d'une interface réseau et avant qu'il soit envoyé aux processus. La table filter installe une chaîne nommée INPUT sur cette accroche. L'administrateur peut alors ajouter dans cette chaîne des règles qui autorisent ou non les paquets entrants.

Chaque règle spécifie des critères de sélection (adresse source, protocole, etc.) et ce qui doit advenir des paquets correspondants (rejet, autorisation, archivage, etc.). Les critères disponibles et les actions possibles ne sont pas toujours les mêmes suivant la chaîne dans laquelle on ajoute la règle. Suivant l'action choisie, le paquet parcourt ou non les règles suivantes de la chaîne. Si aucune règle ne correspond au paquet, c'est la politique par défaut de la chaîne qui décide du sort du paquet.

[modifier] Tables

Netfilter est fourni avec trois tables principales, mais des modules d'extension peuvent en créer de nouvelles. Chaque table contient des chaînes prédéfinies à travers lesquelles les paquets vont passer. L'administrateur peut ajouter et retirer des chaînes personnelles dans n'importe quelle table. Au départ, toutes les chaînes sont vides et leur politique par défaut est d'accepter les paquets.

[modifier] filter

La table filter est responsable du filtrage des paquets. Son utilisation principale est de jeter (DROP) ou de laisser passer (ACCEPT) les paquets. La table fournit :

  • une chaîne INPUT pour filtrer les paquets à destination du système,
  • une chaîne OUTPUT pour filtrer les paquets émis par les processus du système,
  • et une chaîne FORWARD pour filtrer les paquets que le système doit transmettre.

[modifier] nat

La table nat est responsable de la traduction d'adresses et de ports. Seul le premier paquet de chaque connexion passe à travers cette table. Les règles déterminent comment seront modifiés tous les paquets relatifs à cette connexion.

La chaîne PREROUTING traite les paquets arrivant de l'extérieur avant qu'ils ne soient routés. Elle permet de modifier la destination de la connexion (DNAT).

La chaîne POSTROUTING traite les paquets après la décision de routage, juste avant que le paquet soit expédié. Elle permet la modification de la source de la connexion (SNAT). On peut ainsi camoufler la véritable origine d'une connexion.

La chaîne OUTPUT fonctionne comme la chaîne PREROUTING mais pour les connexions issues d'un processus du système.

[modifier] mangle

La table mangle est responsable de la transformation des options des paquets comme par exemple la qualité de service. Elle permet notamment d'apposer une marque (interne au noyau) qui peut être utilisée pour la couche routage ou les fonctions avancées de qualité de service comme Diffserv. Tous les paquets passent à travers cette table dans une ou plusieurs chaînes. Ils passent :

  • dans la chaîne PREROUTING juste avant le routage s'ils proviennent d'une interface réseau ;
  • dans la chaîne INPUT s'ils sont destinés à une adresse du système ;
  • dans la chaîne OUTPUT s'ils ont été émis par un processus du système ;
  • dans la chaîne FORWARD s'ils proviennent d'une interface réseau et qu'ils sont destinés à une autre interface réseau ;
  • et dans la chaîne POSTROUTING après le routage, juste avant d'être expédiés.

[modifier] Qualités

  • Étant le pare-feu officiel de Linux, Netfilter est très répandu et bien documenté. Il est facile d'obtenir de l'aide sur les forums.
  • Des interfaces graphiques existent pour simplifier sa configuration.
  • La traduction d'adresses (NAT) est très flexible. On peut faire chaque type de NAT avec des restrictions de source, de destination et de service.
  • L'architecture modulaire permet une grande évolution et l'adaptation à des besoins spécifiques[4]

[modifier] Défauts

  • Chaque appel à la commande iptables nécessite la lecture et la modification intégrale d'une table. Pour créer un jeu de règle de taille importante, il faut souvent des milliers d'appels à iptables et le temps de chargement des règles est alors très élevé. De plus, durant la phase de construction du jeu de règles, le système de filtrage est dans un état indéterminé et il est donc prudent de ne pas accepter de nouvelles connexions pour des raisons de sécurité. Cependant, une fois la mise au point terminée, il est possible d'utiliser les commandes iptables-save et iptables-restore afin d'accélérer le chargement des règles. Pour s'abstraire de ce problème, on peut aussi directement générer des fichiers utilisables par iptables-restore.
  • Comme beaucoup d'autres pare-feu, Netfilter permet l'inspection de service (appelé conntrack). Cela permet la traduction d'adresses sur des protocoles particuliers comme FTP, H323, SNMP ou TFTP mais c'est une pratique risquée. L'inspection de service étant complexe, tout bug pourrait permettre la prise de contrôle de la machine. Mais cette inspection est facultative, en chargeant ou non les modules conntrack associés.
  • Netfilter ne fait pas de règles de NAT statiques pour des plages d'adresses. Pour faire une NAT statique de plage, il faut écrire une règle iptables par adresse. Par contre il peut faire de la traduction dynamique de plages d'adresses[5] ou utiliser l'extension NETMAP qui permet la traduction statique des adresses d'un réseau[4].
  • Netfilter ne gère pas certaines technologies comme les proxys, les IDS ou les serveurs d'authentification. Pour faire cela sous Linux il faut utiliser d'autres logiciels qui se configurent à part.

[modifier] Exemples d'utilisation

Comme beaucoup de logiciels du projet GNU, la commande iptables accepte une forme longue et une forme courte pour ses paramètres. Par exemple pour vider la chaine INPUT de la table filter (la table par défaut), l'administrateur peut utiliser :

iptables --flush INPUT

ou

iptables -F INPUT

Pour vider la chaine d'une autre table, la syntaxe est la suivante :

iptables --table nat --flush POSTROUTING

La politique par défaut est d'accepter tous les paquets, ce qui est généralement un mauvais choix pour la sécurité. Pour changer cette règle sur la chaine FORWARD de la table filter, la syntaxe est :

iptables --policy FORWARD DROP

ou encore

iptables -P FORWARD DROP

Pour laisser passer les paquets sur le port telnet qui viennent d'un réseau local (forme longue) :

iptables --append INPUT --protocol tcp --destination-port telnet --source 192.168.13.0/24 --jump ACCEPT

Pour ignorer les autres paquets entrants sur le port telnet (forme courte) :

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

Pour rejeter les paquets entrants sur le port 3128, souvent utilisé par les proxies :

iptables -A INPUT -p tcp --dport 3128 -j REJECT --reject-with tcp-reset

Pour effectuer une traduction d'adresse automatique pour tous les paquets partant par l'interface ppp0 qui représente souvent la connexion internet :

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

[modifier] Voir aussi

[modifier] Interfaces graphiques

Ces programmes permettent de configurer Netfilter graphiquement :

[modifier] Les autres pare-feu libres

[modifier] Article connexe

[modifier] Liens externes

[modifier] Source

[modifier] Notes