Le filtrage avec iptables


précédentsommairesuivant

10. Création d'une règle

Ce chapitre présentera en détail comment créer vos propres règles. Une règle peut être décrite comme une directive au pare-feu et donc, son comportement au niveau du blocage ou de l'autorisation des différentes connexions et paquets dans une chaîne spécifique. Chaque ligne que vous écrirez est insérée dans une chaîne qui sera considérée comme une règle. Nous verrons également les modules de base disponibles, comment les utiliser, de même que les diverses cibles et la façon de créer de nouvelles cibles (i.e., nouvelles sous-chaînes).

Ce chapitre montrera les lignes de base, comment une règle est créée, comment vous devrez l'écrire de façon à ce qu'elle soit acceptée par le programme domaine utilisateur de iptables, les différentes tables, de même que les commandes à exécuter. Après ça nous verrons dans le chapitre suivant tous les modules disponibles pour iptables, et en détail chaque type de cible et de saut.

10-1. Bases de la commande iptables

Comme ceci a déjà été évoqué, chaque règle est une ligne lue par le noyau pour en déduire ce qu'il convient de faire d'un paquet. Si tous les critères - ou les correspondances - sont remplis, on exécute l'instruction donnée par la cible - ou le saut. Normalement, on écrit les règles dans une syntaxe qui ressemble à celle-ci :

 
Sélectionnez
iptables [-t table] commande [correspondance] [cible/saut]

Rien ne vous oblige à mettre l'instruction de cible en fin de la ligne. Toutefois, vous devriez préférer cette syntaxe qui améliore la lisibilité. En tout cas, la plupart des règles que vous découvrirez sont écrites de cette façon. Ainsi, si vous lisez le script de quelqu'un d'autre, vous reconnaîtrez très probablement la syntaxe et comprendrez plus facilement la règle.

Si vous voulez utiliser une autre table que la table standard, insérer la spécification de table à la place de la mention [table]. Cependant, il n'est pas indispensable de déclarer explicitement la table à utiliser, puisqu'iptables utilise par défaut la table filter sur laquelle sont implémentées toutes les commandes. Vous n'êtes pas non plus obligé de spécifier la table à cet endroit dans la règle. Elle peut tout aussi bien être placée ailleurs dans la ligne. Malgré tout, il est plus ou moins habituel de placer la spécification de table au début.

Il y a une chose qu'il faut garder à l'esprit : la commande devrait toujours être en première position, ou à la rigueur juste après la spécification de table. La « commande » indique au programme ce qu'il doit faire, par exemple insérer une règle, ajouter une règle en fin de chaîne, ou encore supprimer une règle. Tout ceci est approfondi ultérieurement.

La correspondance est la partie de la règle qui est envoyée au noyau pour identifier la caractéristique particulière du paquet, c'est-à-dire ce qui le distingue de tous les autres paquets. On peut donc spécifier l'adresse IP dont provient le paquet, de quelle interface réseau, l'adresse IP à atteindre, un port, un protocole ou quoi que ce soit d'autre. Il existe un éventail de correspondances que l'on peut utiliser et qui seront développées au cours de ce chapitre.

Enfin, on trouve la cible du paquet. Si toutes les correspondances sont satisfaites pour un paquet, on informe le noyau de l'action à accomplir. Par exemple, vous pouvez stipuler au noyau d'envoyer le paquet à une autre chaîne créée par vous-même, et qui appartient à cette table. Vous pouvez aussi notifier au noyau de supprimer le paquet et de ne faire aucun autre traitement, ou encore d'envoyer une réponse particulière à l'expéditeur. Comme pour les autres aspects de cette section, la cible est analysée en profondeur plus loin dans ce chapitre.

10-2. Les tables

L'option -t précise la table à utiliser. Par défaut, il s'agit de la table filter. On peut spécifier une des tables suivantes avec l'option -t. Remarquez que c'est une présentation extrêmement rapide du contenu du chapitre Traversée des tables et des chaînesTraversée des tables et des chaînes.

Tableau 9.1. Tables

Table Explication
nat La table nat sert principalement à faire de la traduction d'adresse réseau. Les paquets soumis au NAT voient leur adresse modifiée, en accord avec les règles concernées. Les paquets d'un flux ne traversent cette table qu'une seule fois. En effet, le sort du premier paquet d'un flux conditionne celui des autres. Si le premier paquet est accepté, les autres paquets du flux sont soumis automatiquement au NAT (ou au camouflage, etc.), donc subissent les mêmes actions que le premier paquet. Par conséquent, ils ne passeront pas par cette table, mais seront néanmoins traités de la même façon que le premier paquet du flux. C'est pour cette raison qu'on déconseille le filtrage dans cette table. La chaîne PREROUTING permet de modifier les paquets dès qu'ils entrent dans le pare-feu. La chaîne OUTPUT permet de modifier les paquets générés localement (c.-à-d.. dans le pare-feu) avant qu'ils n'accèdent à la décision de routage. En dernier lieu, la chaîne POSTROUTING offre la possibilité de modifier les paquets juste avant qu'ils ne quittent le pare-feu.
mangle Cette table sert à transformer les paquets. Entre autres, on peut modifier le contenu de différents paquets et celui de leur en-tête. Par exemple, on peut changer les champs TTL, TOS ou MARK. Notez que le champ MARK n'est pas à proprement parler un changement sur le paquet, mais une valeur de marquage définie dans l'espace du noyau. D'autres règles ou programmes peuvent s'appuyer sur ce marquage à l'intérieur du pare-feu pour filtrer ou opérer un routage évolué, tc en est un exemple. Cette table est constituée de cinq chaînes prédéfinies, qui sont nommées PREROUTING, POSTROUTING, OUTPUT, INPUT et FORWARD. La chaîne PREROUTING permet de modifier les paquets juste quand ils entrent dans le pare-feu, mais avant qu'ils n'atteignent la décision de routage. La chaîne POSTROUTING permet de modifier les paquets juste après toutes les décisions de routage. La chaîne OUTPUT s'utilise pour transformer les paquets générés localement avant qu'ils ne sollicitent la décision de routage. La chaîne INPUT permet de modifier les paquets une fois qu'ils ont été routés vers la machine locale, mais avant que l'application de l'espace utilisateur n'ait réceptionné les données. La chaîne FORWARD permet de modifier les paquets après la première décision de routage, mais avant la dernière. Notez que la table mangle ne peut en aucun cas servir à une forme de traduction d'adresse réseau ou de camouflage, la table n'a pas été conçue pour ce genre d'opérations.
filter La table filter devrait être exclusivement consacrée à filtrer les paquets. Par exemple, elle permet de détruire (DROP), journaliser (LOG), accepter (ACCEPT) ou rejeter (REJECT) des paquets sans aucun problème, de la même manière que dans les autres tables. Cette table est constituée de trois chaînes prédéfinies. La première se nomme FORWARD et s'applique à tous les paquets qui ne sont ni générés localement ni destinés à l'hôte local (c.-à-d.. le pare-feu). La chaîne INPUT s'applique à tous les paquets destinés à l'hôte local (le pare-feu), et finalement, OUTPUT s'applique à tous les paquets générés localement.
raw La table raw et ses chaînes sont utilisées avant toute autre table dans Netfilter. Elle fut introduite pour utiliser la cible NOTRACK. Cette table est plutôt récente et seulement disponible, si compilée, avec les derniers noyaux 2.6. La table raw contient deux chaînes. Les chaînes PREROUTING et OUTPUT, qui modifient les paquets avant qu'ils atteignent les autres sous-systèmes de Netfilter. La chaîne PREROUTING peut être utilisée pour tous les paquets entrants sur la machine, ou qui sont transférés (forward), tandis que la chaîne OUTPUT peut être utilisée pour modifier les paquets générés localement avant qu'ils atteignent les autres sous-systèmes de Netfilter.

Les explications précédentes devraient avoir fourni des notions fondamentales concernant les trois tables disponibles. Celles-ci s'emploient dans des situations complètement différentes, et vous devez maîtriser l'utilisation des différentes chaînes qui composent ces tables. Si vous ne comprenez pas leur utilisation, vous pourriez créer une faille dans votre pare-feu, dans laquelle quelqu'un peut s'engouffrer et vous nuire s'il la découvre. Les tables et chaînes indispensables ont déjà été présentées en détail dans le chapitre Traversée des tables et des chaînesTraversée des tables et des chaînes. Si vous ne l'avez pas parfaitement assimilé, je vous conseille de vous y replonger.

10-3. Commandes

Cette section expose les différentes commandes et ce qu'elles permettent de réaliser. La commande signifie à iptables ce qu'il faut faire du reste de la règle qui est envoyée à l'interpréteur. Typiquement, il s'agit soit d'ajouter, soit d'effacer quelque chose dans une table quelconque. Les commandes suivantes sont disponibles pour iptables :

Tableau 9.2. Commandes

Commande -A, --append
Exemple iptables -A INPUT …
Explication Cette commande ajoute une règle à la fin d'une chaîne. La règle sera donc placée en dernière position dans la table de règles, et par conséquent vérifiée en dernier, sauf si vous ajoutez par la suite des règles supplémentaires.
Commande -D, --delete
Exemple iptables -D INPUT --dport 80 -j DROP, iptables -D INPUT 1
Explication Cette commande supprime une règle dans une chaîne. Il existe deux moyens de le faire ; soit en précisant la règle complète (comme dans le premier exemple), soit en indiquant le numéro de la règle que vous visez. Si vous optez pour la première méthode, votre règle doit correspondre exactement avec celle présente dans la chaîne. Avec la seconde méthode, vous devez pointer le numéro de la règle à effacer. Les règles sont numérotées à partir de 1 en commençant au début de chaque chaîne.
Commande -R, --replace
Exemple iptables -R INPUT 1 -s 192.168.0.1 -j DROP
Explication Cette commande remplace la règle présente à la ligne indiquée. Elle fonctionne comme la commande --delete, mais au lieu de supprimer complètement la règle, elle la remplace par une nouvelle. Cette commande est particulièrement commode dans une phase d'expérimentation d'iptables.
Commande -I, --insert
Exemple iptables -I INPUT 1 --dport 80 -j ACCEPT
Explication Cette commande insère une règle quelque part dans une chaîne. La règle est insérée à l'emplacement donné par le numéro spécifié. En l'occurrence, l'exemple précédent insère dans la chaîne INPUT la règle numéro 1, qui devient ainsi la toute première règle de la chaîne.
Commande -L, --list
Exemple iptables -L INPUT
Explication Cette commande dresse la liste des entrées de la chaîne donnée. Dans l'exemple précédent, on liste toutes les règles de la chaîne INPUT. Il est aussi possible de ne spécifier aucune chaîne. Dans ce cas, la commande listera toutes les chaînes de la table spécifiée (pour spécifier la table, voir la section Les tablesLes tables). La sortie exacte dépend des autres options envoyées à l'interpréteur, par exemple les options -n et -v, etc.
Commande -F, --flush
Exemple iptables -F INPUT
Explication Cette commande vide la chaîne donnée de toutes ses règles. Elle équivaut à effacer les règles une à une, mais se révèle un peu plus rapide. Appelée sans option, cette commande revient à supprimer toutes les règles de toutes les chaînes dans la table spécifiée.
Commande -Z, --zero
Exemple iptables -Z INPUT
Explication Cette commande permet de mettre à zéro tous les compteurs dans une chaîne spécifique ou dans toutes les chaînes. Si vous utilisez l'option -v avec la commande -L, vous afficherez le compteur de paquets au début de chaque champ. Pour mettre à zéro le compteur de paquets, utilisez l'option -Z. Elle fonctionne de la même façon que -L, sauf que -Z ne liste pas les règles. Si -L et -Z sont utilisées ensemble (ce qui est autorisé), les chaînes sont dans un premier temps listées, puis les compteurs de paquets sont mis à zéro.
Commande -N, --new-chain
Exemple iptables -N allowed
Explication Cette commande stipule au noyau de créer une nouvelle chaîne avec le nom indiqué dans la table spécifiée. Dans l'exemple ci-dessus, on crée une chaîne nommée allowed. Notez qu'aucune chaîne ou cible de ce nom ne doit préalablement exister.
Commande -X, --delete-chain
Exemple iptables -X allowed
Explication Cette commande efface de la table la chaîne spécifiée. Pour que cette commande fonctionne, il ne doit subsister aucune règle faisant référence à la chaîne à effacer. Autrement dit, vous devez remplacer ou supprimer toutes les règles qui pourraient se référer à la chaîne concernée avant de pouvoir l'effacer. Appelée sans option, cette commande efface toutes les chaînes de la table spécifiée, excepté les chaînes prédéfinies.
Commande -P, --policy
Exemple iptables -P INPUT DROP
Explication Cette commande indique au noyau de configurer une cible par défaut - ou une stratégie - sur une chaîne. Ceci conditionne le comportement par défaut de la chaîne. Les paquets qui n'établissent de correspondance avec aucune règle sont contraints de suivre la stratégie de la chaîne. Les seules cibles autorisées sont DROP et ACCEPT (il pourrait y en avoir d'autres, écrivez-moi si c'était le cas).
Commande -E, --rename-chain
Exemple iptables -E allowed disallowed
Explication La commande -E stipule à iptables de modifier le nom d'une chaîne du premier nom vers le second. Dans l'exemple fourni, on change le nom de la chaîne allowed en disallowed. Remarquez que ceci n'affecte en rien le fonctionnement actuel de la table. C'est juste une modification cosmétique du contenu de la table.

Chaque ligne de commande doit être saisie entièrement, sauf si vous souhaitez seulement bénéficier de l'aide en ligne d'iptables ou obtenir la version de la commande. Utilisez l'option -v pour afficher la version, et -h pour visualiser l'aide. Ci-dessous sont présentées quelques options utilisables avec des commandes diverses. On décrit l'effet des options et les commandes qu'elles concernent. Notez que les options incluses ici n'affectent ni les règles ni les correspondances. Néanmoins, les correspondances et les cibles sont examinées dans une section ultérieure de ce chapitre.

Tableau 9.3. Options

Option -v, --verbose
Commandes compatibles --list, --append, --insert, --delete, --replace
Explication Cette option correspond au mode verbeux qui délivre un affichage détaillé. Elle est surtout utilisée avec la commande --list ; dans ce cas, elle affiche l'adresse de l'interface, les options des règles et les masques de TOS. Elle inclut également un compteur d'octets et de paquets pour chaque règle. Ces compteurs intègrent les suffixes multiplicateurs K (x1000), M (x1.000.000) et G (x1.000.000.000). Vous pouvez suspendre ce mode et obtenir les valeurs exactes avec l'option -x, décrite plus loin. Quand l'option --verbose est utilisée avec une des commandes --append, --insert, --delete ou --replace, le programme fournit des informations détaillées sur la façon dont la règle est interprétée, si elle est insérée correctement, etc.
Option -x, --exact
Commandes compatibles --list
Explication Cette option affine les valeurs numériques. En d'autres termes, la commande --list n'affiche plus les suffixes multiplicateurs K, M ou G. À la place, elle délivre les valeurs exactes des compteurs donnant le nombre de paquets et d'octets qui ont correspondu à chaque règle. Notez que cette option ne fonctionne qu'avec la commande --list, et qu'elle n'est applicable avec aucune autre commande.
Option -n, --numeric
Commandes compatibles --list
Explication Cette option indique à iptables de sortir les informations en format numérique. Les adresses IP et numéros de port sont affichés sous forme de valeurs numériques au lieu des noms d'hôtes, de réseaux ou d'applications. Cette option s'applique seulement à la commande --list. Elle se substitue au comportement par défaut qui tente de résoudre toutes les valeurs numériques en noms d'hôtes ou de services dès que c'est possible.
Option --line-numbers
Commandes compatibles --list
Explication L'option --line-numbers associée à la commande --list permet d'afficher aussi les numéros de ligne. Avec cette option, chaque règle est donc affichée avec son numéro, ce qui s'avère pratique pour identifier les règles et leur numéro avant d'insérer d'autres règles. Cette option ne fonctionne qu'avec la commande --list.
Option -c, --set-counters
Commandes compatibles --insert, --append, --replace
Explication Cette option est utile lors d'une création de règle ou de certaines modifications. Elle permet d'initialiser les compteurs de paquets et d'octets pour une règle. La syntaxe ressemble à --set-counters 20 4000, ce qui stipule au noyau de mettre le compteur de paquets à 20 et le compteur d'octets à 4000.
Option --modprobe
Commandes compatibles Toutes
Explication L'option --modprobe permet de préciser à iptables quel module utiliser lorsqu'il détecte les modules ou qu'il cherche à en ajouter au noyau. Elle est aussi pratique si la commande modprobe n'est pas accessible par défaut sur votre système. Dans certains cas, spécifier cette option est nécessaire pour que le programme sache quoi faire lorsqu'un module utile n'est pas chargé. Elle est utilisable avec toutes les commandes.

10-4. Chapitre suivant

Le chapitre suivant traitera des correspondances disponibles dans iptables et Netfilter. C'est un chapitre assez long et lourd. Je vous suggère humblement de ne pas apprendre tout dans le détail, sauf les parties que vous allez utiliser.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2001-2006 Oskar Andreasson
La permission est accordée de copier, distribuer et/ou modifier ce document selon les termes de la « GNU Free Documentation License », version 1.1; en précisant les sections « Introduction » et toutes les sous-sections, avec les en-têtes « Auteur: Oskar Andreasson ». Une copie de la licence est inclue dans la section intitulée « GNU Free Documentation License ».
Tous les scripts de ce tutoriel sont couverts par la GNU General Public License. Les scripts sont de source libre; vous pouvez les redistribuer et/ou les modifier selon les termes de la GNU General Public License publiée par la « Free Software Foundation », version 2.
Ces scripts sont distribués dans l'espoir qu'ils seront utiles, mais SANS AUCUNE GARANTIE; sans même la garantie implicite qu'ils soient VENDABLES ou une QUELCONQUE APTITUDE POUR UN PROPOS PARTICULIER. Voir la GNU General Public License pour plus de détails.
Vous devriez avoir une copie de la GNU General Public License dans ce tutoriel, dans la section intitulée « GNU General Public License »; si ce n'est pas le cas, écrivez à la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.