Les règles permettant le filtrage de paquets par le noyau sont mise en oeuvre en exécutant la commande iptables. Lorsque vous utilisez la commande iptables, vous devez spécifier les options suivantes:
Type de paquet — stipule le type de paquets que la commande filtre.
Origine/Destination du paquet — spécifie les paquets que la commande filtre sur la base de l'origine ou de la destination du paquets.
Cible — stipule l'action à appliquer sur les paquets remplissant les critères évoqués ci-dessus.
Les options utilisées avec une règle iptables donnée doivent être logiquement groupées, sur la base du but et des conditions de la règle générale, afin que la règle soit valide.
Un des points forts de iptables réside dans la possibilité d'utiliser des tables multiples pour décider du sort d'un paquet donné. Grâce à la nature flexible de iptables, des tables spécifiques peuvent être créées et enregistrées dans le répertoire /lib/modules/<version-du-noyau>/kernel/net/ipv4/netfilter/ où <version-du-noyau> correspond au numéro de version du noyau.
La table par défaut, appelée filter, contient les chaînes standard intégrées INPUT, OUTPUT et FORWARD. Ceci est assez semblable aux chaînes standard en usage avec ipchains. Toutefois, iptables possède aussi par défaut deux tables supplémentaires qui effectuent des opérations de filtrage de paquets spécifiques. La table nat peut être utilisée pour modifier les adresses d'origine et de destination enregistrées dans les paquets alors que la table table mangle permet de modifier des paquets selon des méthodes particulières.
Chaque table contient certes 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-de-table>] <commande> <nom-de-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> stipule une action spécifique à accomplir, telle que l'ajout ou l'élimination d'une règle spécifiée par <nom-de-chaîne>. après l'option <nom-de-chaîne> se trouve une paire de paramètres et d'options servant à définir l'action à entreprendre lorsqu'un paquet correspond au critères 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 varie en fonction de son objectif. Une simple commande servant à éliminer une règle d'une chaîne peut être très courte, alors qu'une commande servant à filtrer les paquets d'un sous-réseau faisant appel à un certain nombre de paramètres et d'options sera plutôt longue. Lors de la création de commandes iptables, il est important de se rappeler que certains paramètres et options peuvent nécessiter la création de paramètres et options supplémentaires pour mieux définir la requête de l'option précédente. Pour écrire une règle valide, cette chaîne d'actions doit continuer jusqu'à ce que chaque paramètre et option nécessitant une autre série d'options soit satisfait.
Entrez la commande iptables -h pour obtenir une liste exhaustive de structures de commandes iptables.
Les commandes donnent à iptables l'instruction d'exécuter une action spécifique. Seule une commande est autorisée par chaîne de commande iptables. À 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 pour ajouter simplement une règle lorsque l'ordre des règles à l'intérieur de la chaîne n'est pas primordial.
-C — contrôle une règle donnée avant de l'ajouter à la chaîne spécifiée par l'utilisateur. Cette commande peut vous aider à écrire des règles iptables compliquées en vous indiquant les paramètres et options supplémentaires à établir.
-D — élimine une règle à l'intérieur d'une chaîne donnée de façon numérique (comme par exemple en utilisant 5,pour la cinquième règle d'une chaîne). Il est également possible de taper 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. Cette option n'affecte en aucun cas la structure de la table.
-F — supprime la chaîne sélectionnée, entraînant par là-même, l'élimination de toutes les règles de la chaîne. Si aucune chaîne n'est spécifiée, cette commande supprime chaque règle de chaque chaîne.
-h — fournit une liste des structures de commande, ainsi qu'un bref résumé des paramètres et options des commandes.
-I — insère une règle à l'intérieur d'une chaîne, à un point précis, spécifié par une valeur paire définie par l'utilisateur. Si aucun numéro n'est spécifié, iptables placera la commande au tout début de la chaîne.
![]() | Attention |
---|---|
Prêtez particulièrement attention à l'option (-A or -I) utilisée lors de l'ajout d'une règle. L'ordre dans lequel les règles apparaissent dans une chaîne est très important quand il s'agit de définir quelles règles appliquer à quels paquets. |
-L — établit la liste complète des règles dans la chaîne indiquée après la commande. Pour obtenir une liste de toutes les règles de toutes les chaînes contenues dans la table par défaut, filter, ne précisez ni chaîne, ni table. Sinon, la syntaxe à utiliser pour établir la liste des règles contenues dans une chaîne donnée, d'une table précise, doit être la suivante:
iptables -L <nom-de-chaîne> -t <nom-de-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 Section 16.3.7 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 paquets 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. La première règle dans une chaîne correspond à la règle numéro un.
-X — supprime une chaîne spécifiée par un utilisateur. L'élimination d'une chaîne intégrée de toute table n'est pas permise.
-Z — remet à zéro les compteurs d'octets et de paquets pour toutes les chaînes pour une table spécifique.
Une fois que certaines commandes iptables ont été spécifiées (y compris celles utilisées pour 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 paquets.
-c effectue une remise à zéro des compteurs pour une règle donnée. Ce paramètre accepte les options PKTS (paquets) et BYTES (octets) pour indiquer le compteur à remettre à zéro.
-d — définit le nom d'hôte du destinataire, l'adresse IP ou le réseau du paquetage qui correspondra à la règle. Lors de la vérification de concordance réseau, les formats adresses IP/masque réseau suivants sont pris en charge:
N.N.N.N/M.M.M.M — où N.N.N.N correspond à la plage de l'adresse IP et M.M.M.M au masque réseau.
N.N.N.N/M — où N.N.N.N correspond à la plage de l'adresse IP et M au masque réseau.
-f applique cette règle uniquement aux paquets fragmentés.
En insérant l'option ! après ce paramètre, seuls les paquets non-fragmentés seront contrôlés.
-i — règle l'interface réseau d'entrée, telle que eth0 ou ppp0. Avec iptables, ce paramètre optionnel ne peut être utilisé qu'avec des chaînes INPUT et FORWARD, lorsqu'elles sont utilisées avec la table filter et la chaîne PREROUTING avec les tables nat et mangle.
Ce paramètre prend également en charge les options spéciales suivantes:
! — donne l'instruction à ce paramètre de ne pas comparer, signifiant que n'importe quelle interface spécifiée est exclue de cette règle.
+ — un caractère générique (ou 'wildcard') utilisé pour comparer toutes les interfaces qui correspondent à une chaîne particulière. Par exemple, le paramètre -i eth+ appliquerait cette règle à n'importe quelle interface Ethernet, mais ne prendrait pas en compte les autres interfaces, comme ppp0.
Si le paramètre -i est utilisé sans qu'aucune interface ne soit spécifiée, alors toutes les interfaces sont affectées par la règle.
-j — donne à iptables l'instruction 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 par défaut avec le paquetage RPM de commandes Red Hat Linux nommé iptables, comme, entre autres, LOG, MARK et REJECT. Consultez la page de manuel relatives à iptables pour obtenir plus d'informations sur les cibles.
il est également possible de diriger un paquet correspondant à une règle vers une chaîne définie par l'utilisateur, située en dehors de la chaîne courante, afin que d'autres règles puissent être appliquées à ce paquet.
Si aucune cible n'est spécifiée, le paquet continue sans qu'aucune autre action ne soit entreprise. Ceci étant, le compteur de cette règle avance tout de même d'un point car le paquet 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ée 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 correspondre à tous les protocoles possibles. De plus, tout protocole inclus 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 l'origine d'un paquet particulier en utilisant la même syntaxe que pour le paramètre de destination (-d).
Différents protocoles réseau offrent des options de contrôle de concordance spécifiques qui peuvent être configurées de manière à comparer un paquet donné utilisant ce protocole. Évidemment, il est nécessaire d'identifier préalablement le protocole en question dans la commande iptables à l'aide de l'option -p tcp <nom-du-protocole> (où <nom-du-protocole> correspond au protocole cible), afin que ces options soient disponibles.
Les options de concordance disponibles pour le protocole TCP (-p tcp) sont les suivantes:
--dport — indique le port de destination pour le paquet. Vous pouvez utiliser un nom de service de réseau (comme www ou smtp), un numéro de port ou une plage de numéros de port pour configurer cette option. Pour parcourir les noms et alias de services réseau et les numéros de port utilisés, affichez le fichier /etc/services L'option de concordance --destination-port est identique à l'option --dport.
Pour indiquer une plage précise de numéros de port, il suffit de séparer les numéros par le symbole des deux points (:), comme dans l'exemple suivant: -p tcp --dport 3000:3200. La plus grande plage possible est 0:65535.
Utilisez un point d'exclamation (!) après l'option --dport pour donner iptables l'instruction comparer tous les paquets qui n'utilisent pas ce service de réseau ou port.
--sport — indique le port d'origine du paquet, en utilisant les mêmes options que --dport. L'option de concordance --source-port est identique à l'option --sport.
--syn s'applique à tous les paquets TCP, appelés communément paquets SYN, conçus pour initier la communication. Aucun paquet transportant des données de charge utile n'est touché. En plaçant un point d'exclamation (!) comme indicateur après l'option --syn, tous les paquets non-SYN seront comparés.
--tcp-flags — permet la comparaison avec une règle de paquets TCP ayant une taille en octets ou des indicateurs spécifiques. L'option de concordance --tcp-flags accepte deux paramètres. Le premier paramètre est le masque, qui définit l'indicateur à examiner pour le paquet. Le second se rapporte aux indicateurs qui doivent être définis afin que la concordance puisse avoir lieu.
Les indicateurs disponibles sont les suivants:
ACK
FIN
PSH
RST
SYN
URG
ALL
NONE
Par exemple, une règle iptables contenant -p tcp --tcp-flags ACK,FIN,SYN SYN ne comparera que les paquets TCP ayant l'indicateur SYN défini et les indicateurs ACK et FIN non-définis.
L'utilisation d'un point d'exclamation (!) après --tcp-flags inverse l'effet de l'option de concordance.
--tcp-option essaie de comparer des options spécifiques à TCP qui peuvent être définies dans un paquet donné. Cette option de concordance peut aussi être inversée en utilisant un point d'exclamation (!).
Les options de concordance suivantes s'appliquent au protocole UDP (-p udp) :
--dport — indique le port de destination du paquet UDP, en utilisant le nom du service, le numéro de port ou une plage de numéros de port. L'option de concordance --destination-port est identique à l'option --dport. Reportez-vous l'option de concordance --dport dans Section 16.3.5.1 Protocole TCP pour obtenir des informations sur les modalités d'utilisation de cette option. option.
--sport — indique le port d'origine du paquet UDP en utilisant le nom de service, le numéro de port ou une plage de numéros de port. L'option de concordance --source-port est identique à l'option --sport. Reportez-vous l'option de concordance --sport dans Section 16.3.5.1 Protocole TCP pour obtenir des informations sur les modalités d'utilisation de cette option.
Les options de concordance suivantes sont disponibles pour le protocole Internet Control Message Protocol (ICMP) (-p icmp):
--icmp-type définit le nom ou le numéro du 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 sont également disponibles par l'entremise des modules chargés par la commande iptables. Pour utiliser un module d'option de concordance, chargez le module en l'appelant par son nom à l'aide de l'option -m, comme par exemple: -m <nom-du-module> (où <nom-du-module> correspond au nom du module).
Un nombre important de modules est disponible par défaut. Il est même possible de créer vos propres modules pour fournir des options de concordance supplémentaires pour une fonctionnalité accrue.
Il existe de nombreux modules, mais seuls les plus fréquents sont abordés ici.
limit module — permet de limiter le nombre de paquets 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'entraînent l'invasion de vos journaux par des messages répétitifs ou ne consomment trop de ressources système.
Le module limit permet les options suivantes:
--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.
Si aucun modificateur de nombre ou temps n'est précisé, une valeur par défaut de 3/hour sera retenue.
--limit-burst — limite le nombre de paquets pouvant être comparés à une règle, à un moment donné. Cette option est à utiliser conjointement avec l'option --limit et accepte un numéro pour en définir le seuil.
Si aucun numéro n'est indiqué, seulement cinq paquets sont en mesure d'être contrôlés à la règle.
module state — permet la concordance d'état.
Ce module state permet les options suivantes:
--state — compare un paquet avec les états de connexion suivants:
ESTABLISHED — le paquet contrôlé est associé à d'autres paquets dans une connexion établie.
INVALID — le paquet contrôlé ne peut être associé à une connexion connue.
NEW — le paquet contrôlé crée une nouvelle connexion ou fait partie d'une connexion à double sens qui n'a pas encore été vue.
RELATED — le paquet 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 à condition qu'ils soient séparés par des virgules, comme par exemple: -m state --state INVALID,NEW.
mac module — permet la concordance d'une adresse MAC matérielle.
Le module mac permet l'option suivante:
--mac-source — compare une adresse MAC de la carte d'interface réseau qui a envoyé le paquet. Pour exclure une adresse MAC d'une règle, placez un point d'exclamation (!) après l'option de concordance --mac-source.
Pour obtenir des informations sur d'autres options de concordance disponibles avec les modules, reportez-vous à la page de manuel de iptables.
Une fois que la concordance d'un paquet a été contrôlée par une règle spécifique, cette dernière peut diriger le paquet vers un certain nombre de cibles qui décideront de son traitement et, si possible, entreprendront des actions supplémentaires. 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 paquet ou si aucune des règles qui correspondent à un paquet ne spécifie de cible particulière.
Ci-dessous figurent les cibles standards:
<chaîne-spécifiée-par-l'utilisateur> — remplacez <chaîne-spécifiée-par-l'utilisateur> par le nom d'une chaîne définie par l'utilisateur au sein de cette table. Cette cible transmet le paquet à la chaîne cible.
ACCEPT — permet au paquet de continuer sa progression vers sa destination (ou une autre chaîne si sa configuration l'y oblige).
DROP — abandonne le paquet répondre au demandeur. Le système ayant expédié ce paquet n'est pas informé de l'échec de l'opération.
QUEUE — le paquet est mis en attente et sera traité par une application de l'espace-utilisateur (user-space).
RETURN — arrête le contrôle du paquet en fonction des règles en vigueur dans la chaîne actuelle. Si le paquet avec la cible RETURN correspond à une certaine règle appelée depuis une autre chaîne, le paquet est renvoyé à la première chaîne pour la continuation de son contrôle au point où il s'était arrêté. Dans le cas où la règle RETURN est utilisée dans une chaîne intégrée et que le paquet ne peut pas 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 Section 16.3.5.4 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. Ci-dessous figurent certains des modules cibles les plus répandus, inclus par défaut dans Red Hat Linux :
LOG — journalise tous les paquets correspondant à cette règle. Étant donné que les paquets sont journalisés par le noyau, le fichier /etc/syslog.conf détermine l'emplacement où ces entrées sont enregistrées. Par défaut, elles sont placées dans le fichier /var/log/messages.
Différentes options peuvent être utilisées après la cible LOG pour spécifier le processus de journalisation:
--log-level — détermine 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.
--log-ip-options spécifie que toute option indiquée dans l'en-tête d'un paquet IP est journalisée.
--log-prefix — ajoute une chaîne comportant au maximum 29 caractère avant la ligne du journal, lorsqu'elle est écrite. Cette option est utile lors de l'écriture de filtres syslog à utiliser conjointement avec la journalisation de paquets.
--log-tcp-options — indique que toute option précisée dans l'en-tête d'un paquet TCP est journalisée.
--log-tcp-sequence écrit le numéro de séquence TCP relatif au paquet dans le journal.
REJECT — renvoie un paquet d'erreur au système ayant expédié le paquet et abandonne le paquet.
La cible REJECT accepte une option --reject-with <type> (où <type> correspond au type de rejet) qui permet de d'inclure des informations plus détaillées avec le paquet d'erreur. Le message d'erreur port-unreachable (impossible d'atteindre le port) représente le <type> d'erreur par défaut envoyée si aucune autre option n'est utilisée. Pour obtenir une liste complète des options <type> disponibles, consultez la page de manuel relative à iptables.
D'autres extensions de cibles, dont bon nombre étant très utiles pour le masquage d'IP (ou masquerading) faisant appel à la table nat ou avec la modification de paquets à l'aide de la table mangle, se trouvent dans la page de manuel iptables.
La commande de listage par défaut, iptables -L, forunit un aperçu très élémentaire des chaînes actuelles contenues dans la table de filtres par défaut. Des options supplémentaires donnent plus d'informations:
-v affiche une sortie prolixe, indiquant le nombre de paquets et octets lus par chaque chaîne, le nombre de paquets et d'octets contrôlés par chaque règle et l'identité des interfaces liées aux règles.
-x présente les nombres selon leur valeur exacte. Dans un système très chargé, le nombre de paquets 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 nombre réel.
-n affiche les adresses IP et les numéros de port de façon numérique, plutôt que d'utiliser le nom d'hôte et le format du service de réseau.
--line-numbers énumère les règles dans chaque chaîne à côté de leur ordre numérique dans la chaîne. Cette option est utile 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.
-t — spécifie un nom de table.