| Red Hat Linux 7.2: Guide de référence Red Hat Linux officiel | ||
|---|---|---|
| Précédent | Chapitre 18. Techniques de mise en oeuvre de pare-feu avec iptables | Suivant |
Les règles permettant le filtrage de paquetages par le noyau sont appliquées en exécutant la commande iptables suivie de certaines de ses options qui définissent le type de paquetages à filtrer, l'origine ou la destination et le sort de ces paquetages s'ils satisfont à ces règles. Les options utilisées avec une commande iptables spécifique doivent être groupées de façon logique selon l'usage et les conditions mêmes de la règle générale dans le but de la rendre valide.
Un des points forts de iptables réside dans la possibilité d'utiliser des tables multiples pour décider du sort d'un paquetage donné selon le type de paquetage en cours de surveillance. Grâce à la nature flexible de iptables, des tables spécifiques peuvent être créées et enregistrées dans le répertoire /etc/modules/<version-du-noyau>/kernel/net/ipv4/netfilter afin d'obtenir des résultats précis. On peut alors considérer iptables comme étant capable d'exécuter plusieurs groupes de règles ipchains appartenant à des chaînes spécifiques, chaque groupe ayant un rôle particulier.
La table par défaut, appelée filter, contient les chaînes résidantes INPUT, OUTPUT et FORWARD. Cela est assez semblable aux chaînes standard en usage avec ipchains. Cependant, iptables possède aussi par défaut deux tables supplémentaires d'opérations spécifiques de filtrage. La table nat peut être utilisée pour modifier les adresses d'origine et de destination enregistrées dans les paquetages et la table mangle vous permet d'altérer la forme des paquetages selon des méthodes particulières.
Chaque table contient des chaînes par défaut dont le but est d'exécuter des tâches selon l'objectif même de la table, mais il est également possible de définir de nouvelles chaînes dans chaque table.
Beaucoup de commandes iptables ont la structure suivante :
iptables [-t <nom-table>] <commande> <nom-chaîne> <paramètre-1> <option-1>
<paramètre-n> <option-n> |
Dans cet exemple, l'option <nom-table> permet à l'utilisateur de sélectionner une autre table que la table par défaut filter à utiliser avec cette commande. L'option <commande> est le centre de la commande, imposant une action spécifique à accomplir, telle que l'ajout ou l'élimination d'une règle d'une chaîne particulière, qui est précisée par l'option <nom-chaîne>. On trouve juste après l'option <nom-chaîne> une paire de paramètres et d'options qui servent à définir la façon dont la règle sera respectée et l'action à entreprendre lorsqu'un paquetage correspond à la définition de la règle.
En examinant la structure d'une commande iptables, il est important de se rappeler que contrairement aux autres commandes, la longueur et la complexité d'une commande iptables est variable en fonction de son usage. Une simple commande servant à éliminer une règle d'une chaîne peut être très courte, alors qu'une commande servant à filtrer les paquetages d'un sous-réseau faisant appel à un certain nombre de paramètres et d'options sera plutôt longue. Il est nécessaire de se rappeler qu'avec les commandes iptables les paramètres et options utilisés peuvent susciter le besoin de créer des paramètres et options supplémentaires pour mieux définir les besoins des premiers. Pour écrire une règle efficace, cette chaîne d'actions doit être complètement respectée.
Entrez la commande iptables -h pour obtenir une liste exhaustive de structures de commandes iptables.
Les commandes indiquent à iptables d'exécuter une action spécifique et une seule commande n'est autorisée par chaîne de commande iptables. A l'exception de la commande d'aide, toutes les autres commandes doivent être écrites en majuscules.
Les commandes iptables disponibles sont les suivantes :
-A — Ajoute une règle iptables à la fin d'une chaîne donnée. On l'utilise dans les cas où l'ordre à l'intérieur de la chaîne n'est pas primordial.
-C — Contrôle une règle donnée avant de l'ajouter à une chaîne spécifiée par l'utilisateur. Cette commande peut vous aider pour l'écriture de règles iptables compliquées en vous indiquant les paramètres et options supplémentaires.
-D — Elimine une règle à l'intérieur d'une chaîne donnée de façon numérique (ex. : 5, correspondant à la cinquième règle d'une chaîne). Il est également possible d'écrire la règle complète et iptables effacera la règle dans la chaîne correspondante.
-E — Sert à changer le nom d'une chaîne spécifiée par un utilisateur. La structure de la table n'est modifiée en aucun cas. En fait, ceci vous évite de devoir éliminer la chaîne, la recréer sous un nouveau nom et reconfigurer toutes vos règles pour cette chaîne.
-F — Supprime la chaîne sélectionnée, qui a pour effet d'éliminer toutes les règles de la chaîne. Si aucune chaîne n'est indiquée, cette commande supprime chaque règle de chaque chaîne.
-h — Fournit une liste pratique de structures de commande, ainsi qu'un bref résumé de leurs paramètres et options.
-I — Insère une règle à l'intérieur d'une chaîne, à un point précis. Assigne un numéro à la règle devant être insérée et iptables se charge de l'opération. Si aucun numéro n'est spécifié, iptables place votre commande au sommet de la liste de règles.
![]() | Avertissement |
|---|---|
Soyez attentif quant au choix de l'option (-A ou -I) que vous utilisez lors de l'ajout d'une règle. L'ordre dans lequel se présentent les règles peut se révéler très important pour définir si un paquetage se rapporte à une règle ou à une autre. Assurez-vous qu'aucune autre règle n'est concernée par l'ajout ou le retrait d'une règle dans une chaîne. |
-L — Etablit la liste complète des règles dans la chaîne indiquée après la commande. Pour afficher toutes les règles de toutes les chaînes dans la table par défaut filter, ne précisez pas de chaîne ni de table. Autrement, la syntaxe à utiliser pour établir la liste des règles dans une chaîne donnée d'une table précise doit être la suivante :
iptables -L <nom-chaîne> -t <nom-table> |
Des options puissantes pour la commande -L fournissant le nombre de règles et permettant une description très détaillée de ces dernières sont décrites dans la la section intitulée Options de listage.
-N — Crée une nouvelle chaîne avec un nom spécifié par l'utilisateur.
-P — Définit la politique par défaut d'une chaîne donnée, de sorte que lorsque des paquetages traversent une chaîne entière sans satisfaire à une règle, ils seront envoyés à une cible donnée, telle que ACCEPT ou DROP.
-R — Remplace une règle dans une chaîne donnée. Il est impératif d'utiliser un numéro de règle après le nom de chaîne pour que s'effectue le changement. La première règle dans une chaîne se réfère au numéro de règle 1.
-X — Supprime une chaîne spécifiée par un utilisateur. L'élimination d'une chaîne intrinsèque d'une table n'est pas permise.
-Z — Remet à zéro les compteurs d'octets et de paquetages dans toutes les chaînes d'une table particulière.
Une fois que certaines commandes iptables ont été spécifiées, y compris celles utiles à l'ajout, l'élimination, l'insertion ou le remplacement de règles à l'intérieur d'une chaîne donnée, il est nécessaire d'ajouter d'autres paramètres pour la construction d'une règle de filtrage de paquetages.
-c Effectue une remise à zéro des compteurs pour une règle donnée. Ce paramètre accepte les options PKTS (paquetages) et BYTES (octets) pour indiquer quel compteur remettre à zéro.
-d Définit le nom d'hôte du destinataire, l'adresse IP ou le réseau du paquetage qui vérifiera la règle. Lors de la vérification de concordance réseau, il existe deux méthodes pour définir les masques de réseau, telles que 192.168.0.0/255.255.255.0 ou 192.168.0.0/24.
-f Applique cette règle aux paquetages fragmentés uniquement.
En insérant l'option ! après ce paramètre, seuls les paquetages non fragmentés seront contrôlés.
-i Règle l'interface réseau d'entrée, telle que eth0 ou ppp0, à utiliser avec une règle particulière. Avec iptables, ce paramètre optionnel ne peut être utilisé qu'avec des chaînes INPUT et FORWARD, lorsqu'elles sont utilisées avec les tables filter et la chaîne PREROUTING avec les tables nat et mangle.
Ce paramètre présente plusieurs options utiles qui peuvent être utilisées avant de préciser le nom d'une interface :
! — Ordonne à ce paramètre de ne pas comparer, signifiant que n'importe quelle interface spécifiée est exclue de cette règle.
+ — Caractère spécial utilisé pour comparer toutes les interfaces qui correspondent à une chaîne particulière. Exemple : le paramètre -i eth+ appliquera cette règle à n'importe quelle interface Ethernet de votre système, mais ne prendra pas en compte les autres interfaces, telles que ppp0.
Si le paramètre -i est utilisé sans qu'aucune interface ne soit spécifiée, alors toutes les interfaces se voient concernées par la règle.
-j Indique à iptables de passer directement à une cible donnée lorsqu'un paquetage correspond à une règle particulière. Les cibles autorisées après l'option -j incluent les options standard ACCEPT, DROP, QUEUE et RETURN, ainsi que des options étendues qui sont disponibles dans des modules chargés automatiquement avec le paquetage RPM de commandes iptables Red Hat Linux, telles que LOG, MARK et REJECT, entre autres. Consultez la page de manuel relatives à iptables pour plus d'informations sur ces cibles, ainsi que sur les règles concernant leur usage. Beaucoup de cibles ne peuvent en effet être utilisées qu'avec certaines tables.
En plus de spécifier des actions de cible, il est également possible de diriger un paquetage correspondant à une règle vers une chaîne définie par un utilisateur située en dehors de la chaîne courante. Ceci vous permet d'appliquer d'autres règles à ce paquetage et de le filtrer davantage avec des critères supplémentaires.
Si aucune cible n'est spécifiée, le paquetage continue sans aucune autre action entreprise. Cependant, le compteur de cette règle avance tout de même d'un point car le paquetage correspond à la règle spécifiée.
-o Règle l'interface de sortie pour une règle donnée et ne peut être utilisé qu'avec des chaînes OUTPUT et FORWARD dans la table filter et la chaîne POSTROUTING dans les tables nat et mangle. Les options de ce paramètre sont les mêmes que pour les paramètres relatifs aux interfaces réseau d'entrée (-i).
-p Règle le protocole IP pour la règle, qui peut être icmp, tcp, udp ou all, pour comparer tous les protocoles possibles. De plus, les protocoles les moins courants indiqués dans /etc/protocols peuvent également être employés. Si l'option est omise lors de la création de la règle, l'option all est considérée comme étant la valeur par défaut.
-s Définit la source d'un paquetage particulier en utilisant la même syntaxe que pour le paramètre de destination (-d).
Les différents protocoles de réseau offrent des options de contrôle de concordance spécifiques qui peuvent être configurées de manière à comparer un paquetage donné utilisant ce protocole. Evidemment, il est nécessaire d'identifier le protocole en question dans la commande iptables, tel qu'en utilisant l'option -p tcp <nom-du-protocole>, afin de rendre disponibles les options pour ce protocole.
Voici les options de concordance disponibles pour le protocole TCP (-p tcp) :
--dport Indique le port de destination pour le paquetage. Vous pouvez utiliser un nom de service de réseau (comme www ou smtp), un numéro de port ou une gamme de numéros de port pour configurer cette option. Pour parcourir les noms et pseudonymes de services réseau et les numéros de port utilisés, visualisez le fichier /etc/services. Vous pouvez aussi utiliser --destination-port pour indiquer cette option de concordance.
Pour indiquer une gamme précise de numéros de port, il suffit de séparer les numéros avec un deux points (:), comme ceci : -p tcp --dport 3000:3200. La plus grande gamme possible est 0:65535.
Vous pouvez aussi utiliser un point d'exclamation (!) comme indicateur après l'option --dport pour indiquer à iptables la comparaison de tous les paquetages qui n'utilisent pas ce service de réseau ou port.
--sport Indique le port d'origine du paquetage, en utilisant les mêmes options que --dport. Vous pouvez utiliser aussi --source-port pour indiquer cette option de concordance.
--syn Oblige un début de communication pour tous les paquetages TCP désignés, appelés communément paquetages SYN, pour vérifier la concordance avec cette règle. Tous les paquetages transportant des données seront ignorés. En plaçant un point d'exclamation (!) comme indicateur après l'option --syn, tous les paquetages non-SYN seront comparés.
--tcp-flags Permet la comparaison de paquetages TCP ayant une taille en octets ou des indicateurs spécifiques avec une règle. L'option de concordance --tcp-flags accepte deux paramètres après celle-ci, qui sont les indicateurs de tailles en octets diverses mis dans une liste séparée par des virgules. Le premier paramètre est le masque, qui définit l'indicateur à examiner pour le paquetage. Le second se rapporte aux indicateurs qui doivent être définis dans le paquetage pour la réalisation d'une concordance. Les indicateurs disponibles sont les suivants : ACK, FIN, PSH, RST, SYN et URG. De plus, ALL et NONE peuvent aussi être utilisés pour comparer tous les indicateurs ou aucun d'entre eux respectivement.
Par exemple, une règle iptables contenant -p tcp --tcp-flags ACK,FIN,SYN SYN ne comparera que les paquetages TCP reportant l'indicateur SYN défini et les indicateurs ACK et FIN non définis.
Comme pour beaucoup d'autres options, utiliser un point d'exclamation (!) après --tcp-flags inverse l'effet de l'option de concordance, ce qui signifie que le second paramètre ne doit pas être défini pour garantir la comparaison.
--tcp-option Essaie la comparaison d'options spécifiques à TCP qui peuvent être définies avec un paquetage donné. Cette option de comparaison peut aussi être inversée par un point d'exclamation (!).
Les options de concordance suivantes s'appliquent au protocole UDP (-p udp) :
--dport Indique le port de destination du paquetage UDP, en utilisant le nom du service, le numéro de port ou une gamme de numéros de port. L'option de concordance --destination-port peut être employée à la place de --dport. Consultez l'option de concordance --dport dans la la section intitulée Protocole TCP pour les modalités d'usage de cette option.
--sport Indique le port d'origine du paquetage UDP en utilisant le nom de service, le numéro de port ou une gamme de numéros de port. L'option de concordance --source-port peut être utilisée à la place de --sport. Consultez l'option de concordance --dport dans la la section intitulée Protocole TCP pour les modalités d'usage de cette option.
Les paquetages faisant appel au protocole ICMP (Internet Control Message Protocol) peuvent être contrôlés par le biais de l'option suivante quand -p icmp est indiqué :
--icmp-type Définit le nom ou le numéro de type d'ICMP à comparer avec cette règle. Une liste de noms ICMP valides est disponible en tapant la commande iptables -p icmp -h.
Des options de concordance supplémentaires, non spécifiques à un protocole en particulier, sont disponibles par l'entremise des modules chargés lorsqu'une commande iptables les utilise. Pour l'emploi d'un module d'option de concordance, il vous faut charger le module en l'appelant par son nom, c'est-à-dire en incluant -m <nom-du-module> dans la commande iptables lors de la création d'une règle.
Un nombre assez important de modules, ayant chacun leurs options de concordance spécifiques, sont disponibles par défaut. Il vous est même possible de créer vos propres modules pour fournir des options de concordance supplémentaires, tel que pour répondre à des exigences réseau spécifiques par exemple. Il existe de nombreux modules, mais seuls les plus fréquents sont abordés ici.
Le module limit vous permet de placer une limite au nombre de paquetages qui sont comparés à une règle donnée. Ceci se révèle tout particulièrement pratique lors de la concordance avec des règles de journalisation, afin d'éviter que les résultats n'envahissent vos journaux de messages répétitifs ou ne consomment trop de ressources système.
--limit — Limite le nombre de concordances dans un espace-temps donné, grâce à un modificateur de nombre et de temps paramétré sous la forme suivante : <nombre>/<temps>. Par exemple, en écrivant --limit 5/hour, une règle effectue son contrôle de concordance seulement cinq fois par heure.
Lorsque rien n'est spécifié, une valeur de 3/hour est la règle par défaut.
--limit-burst — Limite le nombre de paquetages comparés à une règle à la fois. Cette option est à utiliser conjointement à l'option --limit et accepte un numéro pour en définir le seuil.
Si aucun numéro n'est indiqué, seulement cinq paquetages sont en mesure d'être contrôlés.
Le module state, qui fait appel à l'option de concordance --state, peut comparer un paquetage avec les états de connexion particuliers suivants :
ESTABLISHED Le paquetage contrôlé est associé à d'autres paquetages dans une connexion établie.
INVALID Le paquetage contrôlé ne peut être associé à une connexion connue.
NEW Le paquetage contrôlé crée une nouvelle connexion ou fait partie d'une connexion à double sens qui n'a pas encore été vue.
RELATED Le paquetage contrôlé commence une nouvelle connexion liée d'une façon ou d'une autre à une connexion existante.
Ces états de connexion peuvent être employés de concert avec d'autres en les séparant par des virgules, tel que : -m state --state INVALID,NEW.
Pour contrôler la concordance d'une adresse matérielle MAC d'un périphérique Ethernet, utilisez le module mac, qui accepte --mac-source plus une adresse MAC comme option. Pour exclure une adresse MAC d'une règle, placez un point d'exclamation (!) après l'option de concordance --mac-source.
D'autres options de concordance sont disponibles dans les modules. Reportez-vous à la page de manuel de iptables.
Une fois que la concordance d'un paquetage a été contrôlée par une règle, celle-ci peut diriger le paquetage vers un certain nombre de cibles qui décideront de son traitement et, si possible, entreprendront des actions supplémentaires, telles que la journalisation de l'action. De plus, chaque chaîne possède une cible par défaut qui est utilisée si aucune des règles de la chaîne ne correspond à un paquetage ou si aucune des règles qui correspondent à un paquetage ne spécifie de cible particulière.
Il n'existe que très peu de cibles standard pour décider comment gérer les paquetages :
<chaîne-spécifiée-par-l'utilisateur> Nom d'une chaîne définie et créée antérieurement au sein de cette table de règles qui sera comparée avec ce paquetage, outre à toute autre règle dans toute autre chaîne qui doit être comparée avec ce paquetage. Ce type de cible est pratique pour une plus grande analyse du paquetage avant d'en décider le sort et de procéder à sa journalisation.
ACCEPT — Permet au paquetage de continuer sa progression vers sa destination (ou une autre chaîne si sa configuration l'y oblige).
DROP — Abandonne le paquetage. Le système ayant expédié ce paquetage n'est pas informé de l'échec de l'opération et ce paquetage est tout simplement enlevé de la règle contrôlant la chaîne et rejeté.
QUEUE — Le paquetage est mis en attente de passer dans l'espace utilisateur, où il sera traité d'une autre façon (par un utilisateur ou une application par exemple).
RETURN — Arrête le contrôle du paquetage avec les règles en vigueur dans la chaîne en usage. Si le paquetage avec la cible RETURN correspond à une certaine règle appelée depuis une autre chaîne, le paquetage est renvoyé à la première chaîne pour la continuation de son contrôle au point où celui-ci s'était arrêté. Dans le cas où la règle RETURN est utilisée dans une chaîne résidente et que le paquetage ne peut revenir vers la chaîne précédente, la cible appliquée par défaut décide alors de l'action à entreprendre.
Outre ces cibles standards, plusieurs autres cibles peuvent être utilisées avec des extensions appelées modules cibles, qui fonctionnent d'une manière semblable aux modules d'options de concordance (reportez-vous à la la section intitulée Modules avec options de concordance supplémentaires).
Il existe de nombreux modules cibles étendus ; la plupart d'entre eux s'appliquent à des tables ou des situations spécifiques. Voici quelques-uns des modules cibles les plus répandus inclus par défaut dans Red Hat Linux :
LOG Journalise tous les paquetages correspondant à cette règle. Etant donné que les paquetages sont journalisés par le noyau, le fichier /etc/syslog.conf détermine l'emplacement où écrire ces entrées. Par défaut, ils sont placés dans le fichier /var/log/messages.
Différentes options peuvent être utilisées après la cible LOG pour indiquer le mode de fonctionnement de la journalisation :
--log-level Définit le niveau de priorité d'un événement de journalisation. Une liste de niveaux de priorité est disponible dans la page de manuel de syslog.conf et leurs noms peuvent être utilisés comme option après --log-level.
--log-ip-options Toute option indiquée dans l'en-tête d'un paquetage IP est journalisée.
--log-prefix Ajoute une chaîne de texte avant la ligne du journal lors de l'écriture, avec un nombre maximum de 29 caractères après l'option --log-prefix. Cette option est pratique pour l'écriture de filtres de journalisation système à utiliser conjointement avec la journalisation de paquetages.
--log-tcp-options Toute option indiquée dans l'en-tête d'un paquetage TCP est journalisée.
--log-tcp-sequence Ecrit le numéro de séquence TCP relatif au paquetage dans le journal.
REJECT Retourne un paquetage d'erreur au système ayant expédié le paquetage, puis abandonne ce dernier. Cette cible s'avère utile si vous souhaitez informer le système expéditeur du résultat du contrôle du paquetage.
La cible REJECT accepte une option --reject-with <type> pour fournir davantage de détails avec le paquetage d'erreur. Le message d'erreur port-unreachable est le <type> d'erreur par défaut affiché si aucune autre option n'est sélectionnée. Une liste complète des options <type> pouvant être utilisées est disponible dans la page de manuel de iptables.
D'autres extensions, dont bon nombre étant très utiles avec le masquerading faisant appel à la table nat, peuvent être trouvées dans la page de manuel de iptables.
La commande de listage par défaut, iptables -L, offre une vue générale des chaînes de règles actuellement contenues dans la table par défaut. Des options supplémentaires existent et disposent l'information de manière spécifique :
-v Affiche un résultat prolixe, indiquant le nombre de paquetages et octets lus par chaque chaîne, le nombre de paquetages et d'octets contrôlés par chaque règle et quelles interfaces sont liées aux règles.
-x Présente les nombres selon leur valeur exacte. Dans un système très chargé, le nombre de paquetages et d'octets vus par une chaîne donnée peut être abrégé en utilisant K (milliers), M (millions) et G (milliards) à la fin du nombre. Cette option oblige l'affichage du vrai nombre.
-n Affiche les adresses IP et les numéros de port de façon numérique, plutôt qu'en utilisant le nom d'hôte et le format du service de réseau.
--line-numbers Enumère les règles dans chaque chaîne aux côtés de leur ordre numérique dans la chaîne. Cette option est pratique lorsque l'on tente d'éliminer une règle donnée dans une chaîne ou de localiser l'emplacement d'une règle à insérer dans une chaîne.
| Précédent | Sommaire | Suivant |
| Différences entre iptables et ipchains | Niveau supérieur | Stockage de l'information iptables |