10.3. Correspondances explicites

Les correspondances explicites doivent être chargés spécifiquement par l'option -m ou --match. Par exemple, les correspondances d'état nécessitent la directive -m state avant d'entrer la véritable correspondance à prendre en compte. Certaines de ces correspondances sont spécifiques à un protocole. Certaines peuvent aussi être détachées de tout protocole spécifique - par exemple les états de connexion. Ils sont identifiés par NEW (pour le premier paquet d'une connexion non encore établie), ESTABLISHED (pour une connexion déjà enregistrée dans le noyau), RELATED (pour une nouvelle connexion créée par une connexion plus ancienne et déjà établie), etc. Parmi ces correspondances explicites, quelques-une peuvent avoir évolué pour des questions de test ou d'expérimentation, ou simplement pour mettre en évidence les capacités d'iptables. Par conséquent, ceci signifie que l'intégralité de ces correspondances n'est pas à première vue indispensable. Néanmoins, il y a de grandes chances que vous trouviez certaines des ces correspondances explicites particulièrement utiles. Et de nouvelles apparaissent en permanence, lors de chaque nouvelle version d'iptables. Que vous leur découvriez ou non une utilisation dépend de votre imagination et de vos besoins. Pour comprendre la différence entre une correspondance chargée implicitement et une chargée explicitement, il faut savoir que la première est chargée automatiquement quand par exemple vous établissez une correspondance avec une propriété des paquets TCP, alors que la seconde n'est jamais chargée automatiquement - c'est à vous d'activer une correspondance explicite.

10.3.1. Correspondance addrtype

Le module addrtype sélectionne les paquets basés sur le type adresse. Le type adresse est utilisé dans le noyau pour placer différents paquets dans différentes catégories. Avec cette correspondance vous pourrez sélectionner tous les paquets basés sur leur adresse selon le noyau. Il faut noter que le comportement exact des différents types adresse varie entre les protocoles de la couche 3. je donnerai une brève description générale ici, mais pour plus d'information lire le Linux Advanced Routing and Traffic Control HOW-TO et le Policy Routing using Linux. Les types disponibles sont les suivants :

Tableau 10.6. Types adresse

Type Description
ANYCAST

Type de connexion associative unique-à-multiple, où seulement un des multiples destinataires reçoit les données. Par exemple, implémenté dans DNS. Vous avez une adresse unique pour un serveur racine , mais qui possède plusieurs localisations, votre paquet sera redirigé vers le plus proche serveur. Non implémenté dans IPv4.

BLACKHOLE

Une adresse blackhole supprimera simplement le paquet et n'enverra pas de réponse. Elle fonctionne, de façon basique, comme un trou noir dans l'espace. Elle est configurée dans les tables de routage de Linux.

BROADCAST

Un paquet broadcast (diffusion) est un simple paquet envoyé à tout le monde sur un réseau spécifique dans une relation unique-à-multiple. C'est, par exemple, utilisé dans la résolution ARP, où un paquet est envoyé pour s'informer de la façon de joindre une adresse IP spécifique, ensuite l'hôte autorisé répond avec sa propre adresse MAC.

LOCAL

Adresse locale de la machine sur laquelle nous travaillons. 127.0.0.1 par exemple.

MULTICAST

Un paquet multicast (multidiffusion) est envoyé à divers hôtes utilisant la distance la plus courte et seulement un paquet est expédié à chaque point de cheminement où il sera copié plusieurs fois pour chaque hôte/routeur souscrivant à l'adresse multicast spécifique. Utilisé couramment dans le streaming media comme la vidéo ou le son.

NAT

Adresse qui a été NATée (traduite) par le noyau.

PROHIBIT

Comme le blackhole sauf qu'une réponse "interdit" sera générée. Dans le cas de IPv4, ceci indique qu'une réponse ICMP communication prohibited (type 3, code 13) sera générée.

THROW

Route spéciale dans le noyau Linux. Si un paquet traverse un table de routage il se comportera comme si aucune route n'était trouvée dans la table. Dans le routage normal, ceci indique que le paquet se comporte comme s'il n'avait pas de route. En stratégie de routage, une autre route peut être trouvée dans une autre table.

UNICAST

Une adresse réellement routable pour une adresse unique. Le type de route le plus commun.

UNREACHABLE

Signale une adresse injoignable (nous ne savons pas comment la joindre). Les paquets seront supprimés et un ICMP Host unreachable (type 3, code 1) sera généré.

UNSPEC

Adresse non spécifiée qui n'a pas de signification réelle.

XRESOLVE

Type d'adresse utilisée pour envoyer une recherche de route vers les applications utilisateur. Non implémenté dans Linux.


La correspondance addrtype est chargée en utilisant le mot-clé -m addrtype. Quand il est placé, des options de correspondance supplémentaires seront disponibles. Voir la table ci-dessous.

Tableau 10.7. Options de la correspondance Addrtype

Correspondance --src-type
Noyau 2.6
Exemple iptables -A INPUT -m addrtype --src-type UNICAST
Explication

L'option de correspondance --src-type est utilisée pour sélectionner le type d'adresse source du paquet. Elle peut soit prendre une adresse unique soit plusieurs adresses séparées par une virgule, par exemple --src-type BROADCAST,MULTICAST. L'option de correspondance peut aussi être intervertie en ajoutant un point d'exclamation devant, par exemple ! --src-type BROADCAST,MULTICAST.

Correspondance --dst-type
Noyau 2.6
Exemple iptables -A INPUT -m addrtype --dst-type UNICAST
Explication

Le --dst-type fonctionne exactement comme le --src-type et possède la même syntaxe. La seule différence est qu'il sélectionnera les paquets basés sur leur destination.


10.3.2. Correspondance AH/ESP

Ces correspondances sont utilisées pour les protocoles IPSEC AH et ESP. IPSEC sert à créer des tunnels sécurisés par dessus une connexion Internet non sécurisée. Les protocoles AH et ESP sont utilisés par IPSEC pour créer ces connexions sécurisées. Les correspondances AH et ESP sont deux correspondances séparées, mais elles sont toutes les deux décrites ici car elles se ressemblent beaucoup, et toutes les deux ont le même usage.

Je ne rentrerai pas dans les détails d'IPSEC ici, regardez les pages suivantes pour plus d'information :

Il existe également des tonnes de documentation sur l'Internet à ce sujet.

Pour utiliser les correspondances AH/ESP, vous devrez vous servir de -m ah pour charger les correspondances AH, et -m esp pour charger les correspondances ESP.

[Note] Note

Dans les noyaux 2.2 et 2.4, Linux utilise une chose appelée FreeS/WAN pour l'implémentation de IPSEC, mais à partir des noyaux 2.5.47 et supérieurs, ceux-ci ont une implémentation directe de IPSEC et donc ne nécessitent pas de patcher le noyau. C'est une réécriture complète de l'implémentation de IPSEC dans Linux.

Tableau 10.8. Options de la correspondance AH

Correspondance --ahspi
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p 51 -m ah --ahspi 500
Explication Ceci vérifie le numéro de l'Index du Paramètre de Sécurité (SPI) des paquets AH. Notez que vous devez spécifier le protocole, car AH s'exécute sur un protocole différent des standards TCP, UDP et ICMP. Le numéro SPI est utilisé en conjonction avec les adresses source et destination et les clés secrètes pour créer une association de sécurité (SA). SA identifie chacun des tunnels IPSEC pour tous les hôtes. SPI est utilisé uniquement pour distinguer chaque tunnel IPSEC connecté entre deux tunnels identiques. Utiliser la correspondance --ahspi, nous permet de sélectionner un paquet basé sur le SPI des paquets. Cette correspondance peut sélectionner une chaîne complète de valeur SPI en utilisant un signe :, comme 500:520, qui vérifiera toute la chaîne des SPI.

Tableau 10.9. Options de la correspondance ESP

Correspondance --espspi
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p 50 -m esp --espspi 500
Explication La contrepartie de l'Index des Paramètres de Sécurité (SPI) est utilisée de la même façon que la variante AH. La correspondance semble exactement la même, avec seulement la différence esp/ah. Bien sûr, cette correspondance peut sélectionner un ensemble complet de numéros SPI de la même façon que la variante AH de la correspondance SPI, comme --espi 200:250 qui sélectionne la totalité de la chaîne des SPI.

10.3.3. Correspondance Comment

La correspondance comment est utilisée pour ajouter des commentaires dans la table de règles de iptables et le noyau. Ceci peut grandement simplifier la compréhension de votre table de règles et le débogage. Par exemple, vous pouvez ajouter des commentaires qui documentent une fonction bash qui ajoute des règles spécifiques à netfilter. Il faut noter que ce n'est pas actuellement une correspondance. La "correspondance comment" est chargée en utilisant le mot-clé -m. Les options disponibles sont les suivantes :

Tableau 10.10. Options de la correspondance Comment

Correspondance --comment
Noyau 2.6
Exemple iptables -A INPUT -m comment --comment "A comment"
Explication

L'option --comment spécifie le commentaire à ajouter à la règle dans le noyau. Le commentaire peut être au maximum de 256 caractères.


10.3.4. Correspondance Connmark

La correspondance connmark est utilisée de la même façon que la correspondance mark dans la combinaison de cible MARK/mark. Connmark sert à sélectionner les marques qui ont été placées sur une connexion avec la cible CONNMARK. Elle ne prend qu'une option.

[Important] Important

Pour sélectionner une marque sur le paquet qui est le premier à créer la connexion marquée, vous devez utiliser la correspondance connmark après que la cible CONNMARK ait placé la marque sur le premier paquet.

Tableau 10.11. Options de la correspondance Connmark

Correspondance --mark
Noyau 2.6
Exemple iptables -A INPUT -m connmark --mark 12 -j ACCEPT
Explication

L'option mark sert à sélectionner une marque spécifique associée à une connexion. Le correspondance mark doit être exacte, Par exemple, si vous avez une marque placée sur une connexion à 33 (10001 en binaire), et voulez sélectionner le premier bit seulement, vous ferez quelque chose comme ça --mark 1/1. Le masque (00001) sera masqué vers 10001, ainsi 10001 et 00001 égale 1, et ensuite sélectionner le 1.


10.3.5. Correspondance Conntrack

La correspondance conntrack est une version étendue de la correspondance d'état, qui rend possible la sélection des paquets de façon un peu plus grossière. Ce qui vous permet d'avoir l'information directement disponible dans un système de traçage de connexion, sans applications frontales, comme dans la correspondance d'état. Pour plus de détails sur le système de traçage de connexion, regardez le chapitre La machine d'état.

Il existe nombre de différentes options dans la correspondance conntrack, pour différents champs dans le système de traçage de connexion. Ils sont indiqués dans la liste ci-dessous. Pour charger ces options, vous devez spécifier -m conntrack.

Tableau 10.12. options de la correspondance Conntrack

Correspondance --ctstate
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctstate RELATED
Explication

Cette correspondance est utilisée pour distinguer l'état d'un paquet, selon l'état conntrack. Elle est utilisée pour sélectionner plus finement les mêmes états que dans la correspondance state d'origine. Les entrées valides pour cette correspondance sont :

  • INVALID

  • ESTABLISED

  • NEW

  • RELATED

  • SNAT

  • DNAT

Les entrées peuvent être utilisées l'une avec l'autre en les séparant par une virgule. Par exemple, -m conntrack --ctstate ESTABLISHED,RELATED. Elles peuvent aussi être interverties en mettant un ! avant --ctstate. Exemple : -m conntrack ! --ctstate ESTABLISHED,RELATED, qui sélectionne tout sauf les états ESTABLISHED et RELATED.

Correspondance --ctproto
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctproto TCP
Explication

Ceci sélectionne le protocole, de la même façon que le fait --protocol. Il peut prendre les mêmes types de valeurs, et on peut l'intervertir en utilisant le signe !. Exemple, -m conntrack ! --ctproto TCP sélectionne tous les protocoles sauf TCP.

Correspondance --ctorigsrc
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctorigsrc 192.168.0.0/24
Explication

--ctorigsrc est une correspondance basée sur la spécification de la source IP d'origine de l'entrée conntrack en rapport avec le paquet. La correspondance peut être inversée en utilisant le ! entre le --ctorigsrc et la spécification IP, comme --ctorigsrc ! 192.168.0.1. Elle peut aussi prendre un masque de réseau de forme CIDR, comme --ctorigsrc 192.168.0.0/24.

Correspondance --ctorigdst
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctorigdst 192.168.0.0/24
Explication

Cette correspondance est utilisée de la même façon que --ctorigsrc, sauf qu'elle sélectionne le champ destination de l'entrée conntrack. Elle possède la même syntaxe.

Correspondance --ctreplsrc
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctreplsrc 192.168.0.0/24
Explication

La correspondance --ctreplysrc est utilisée pour la sélection fondée sur la réponse source du conntrack d'origine du paquet. C'est à peu près la même chose que le --ctorigsrc, mais nous sélectionnons la réponse source attendue des paquets envoyés. Cette cible peut, bien sûr, être inversée et adresser une chaîne complète d'adresses, de la même façon que la cible précédente dans ce préfixe.

Correspondance --ctrepldst
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctrepldst 192.168.0.0/24
Explication

La correspondance --ctreplydst est la même que --ctreplysrc, avec la différence qu'elle sélectionne la réponse de destination de l'entrée conntrack qui a sélectionné la paquet. Elle peut être inversée, et accepte les chaînes, comme la correspondance --ctreplysrc.

Correspondance --ctstatus
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctstatus RELATED
Explication

Ceci sélectionne les statuts de la connexion, comme décrit dans la chapitre La machine d'état. Ces statuts sont les suivants :

  • NONE - La connexion ne possède aucun statut.

  • EXPECTED - Cette connexion est en attente et a été ajoutée par les gestionnaires d'attente.

  • SEEN_REPLY - La connexion a vu une réponse mais n'en est cependant pas assurée.

  • ASSURED - La connexion est certaine et ne sera pas supprimée tant que le délai d'attente ne sera pas atteint ou qu'elle sera interrompue d'une autre façon.

Elle peut aussi être inversée par le signe !. Exemple, -m conntrack ! --ctstatus ASSURED qui sélectionne tout sauf le statut ASSURED.

Correspondance --ctexpire
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m conntrack --ctexpire 100:150
Explication

Cette correspondance sert à sélectionner les paquets basés sur la longueur du temps d'expiration de l'entrée conntrack, mesuré en secondes. Elle peut soit prendre une seule valeur, ou une chaîne comme dans l'exemple au-dessus. Elle peut aussi être inversée avec le signe !, comme -m conntrack ! --ctexpire 100. Ceci sélectionne chaque temps d'expiration, qui n'est pas exactement de 100 secondes.


10.3.6. Correspondance Dscp

Cette correspondance est utilisée pour distinguer les paquets basés sur leur champ DSCP (Differentiated Services Code Point). C'est documenté dans la RFC RFC 2638 - A Two-bit Differentiated Services Architecture for the Internet. La correspondance est chargée en spécifiant -m dscp. Elle peut prendre deux options mutuellement incompatibles, décrites ci-dessous.

Tableau 10.13. Options de la correspondance Dscp

Correspondance --dscp
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m dscp --dscp 32
Explication

Cette option prend une valeur DSCP soit en décimal soit en hexadécimal. Si la valeur de l'option est en décimal, elle sera écrite comme 32 ou 16, etc. Si elle est écrite en hexadécimal, elle pourrait être préfixée avec des 0x, comme ça : 0x20. Elle peut aussi être inversée par le signe !, comme : -m dscp ! --dscp 32.

Correspondance --dscp-class
Noyau 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m dscp --dscp-class BE
Explication

La correspondance --dscp-class sert à la sélection d'une classe Diffserv d'un paquet. Les valeurs peuvent être l'une des classes BE, EF, AFxx ou CSxx comme spécifié dans les diverses RFC. Elle peut être inversée de la même façon qu'avec l'option --dscp.


[Note] Note

Notez que les options de classe --dscp et dscp-class sont mutuellement exclusives et ne peuvent pas être utilisées conjointement l'une avec l'autre.

10.3.7. Correspondance Ecn

ECN est utilisé pour sélectionner les différents champs ECN dans les en-têtes TCP et IPv4. ECN est décrit en détail dans la RFC RFC 3168 - The Addition of Explicit Congestion Notification (ECN) to IP. La correspondance est chargée par -m ecn dans la ligne de commande. Elle prend trois options différentes, comme décrit ci-dessous.

Tableau 10.14. Options de la correspondance Ecn

Correspondance --ecn
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m ecn --ecn-tcp-cwr
Explication

Cette correspondance est utilisée pour sélectionner le bit CWR (Congestion Window Received), s'il a été placé. Le fanion CWR est placé pour notifier l'autre point limite de la connexion reçue (ECE), et qui a été réactivée. Par défaut elle vérifie si le bit CWR est placé, mais la correspondance peut aussi être inversée par le signe !.

Correspondance --ecn-tcp-ece
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m ecn --ecn-tcp-ece
Explication

Cette correspondance peut être utilisée pour sélectionner le bit ECE (ECN-Echo). Le ECE est placé une fois que les points limite aient reçu un paquet avec un bit CE placé par un routeur. Le point limite place alors le ECE en renvoyant la paquet ACK, pour le notifier à l'autre point limite. Cet autre point limite envoie alors un paquet CWR comme décrit dans l'explication de --ecn-tcp-cwr. C'est le comportement par défaut si le bit ECE est placé, mais peut être interverti par le signe !.

Correspondance --ecn-ip-ect
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m ecn --ecn-ip-ect 1
Explication

--ecn-ip-ect est utilisée pour sélectionner les codes caractères ECT (ECN Capable Transport). Les codes caractères ECT possèdent plusieurs types. Principalement, ils sont utilisés pour savoir si la connexion a les possibilités ECN en plaçant un des deux bits à 1. ECT est aussi utilisé par les routeurs pour indiquer qu'ils sont en processus d'engorgement, en plaçant les deux points limite ECT à 1. les valeurs ECT sont toutes disponibles dans la table Champ ECN dans IP ci-dessous.

La correspondance peut être inversée par un !, exemple ! --ecn-ip-ect 2 qui va sélectionner toutes les valeurs ECN sauf le point limite ECT(0). La chaîne de valeur correcte dans Iptables est de 0 à 3. Voir ci-dessous pour les valeurs :


Tableau 10.15. Champ ECN dans IP

Valeur Iptables ECT CE [Obsolète] Noms RFC 2481 pour les bits ECN.
0 0 0 Not-ECT, ie. pas de possibilité de connexion non-ECN
1 0 1 ECT(1), nouvelle convention de nommage des points limite ECT dans la RFC 3168
2 1 0 ECT(0), nouvelle convention de nommage des points limite ECT dans la RFC 3168
3 1 1 CE (Congestion Experienced), utilisé pour notifier les points limite pour l'engorgement.

10.3.8. Correspondance Hashlimit

Il s'agit d'une version modifiée de la Correspondance Limit. Au lieu de placer une simple marque, elle met en place une table de hachage pointant vers les marques pour chaque destination IP, source IP, port source et destination. Par exemple, vous pouvez la placer pour chaque adresse IP qui reçoit au maximum 1000 paquets par seconde, ou vous pouvez dire que chaque service sur une adresse IP spécifique doit recevoir un maximum de 200 paquets par seconde. La correspondance hashlimit est chargée par le mot-clé -m hashlimit.

Chaque règle qui utilise la correspondance hashlimit crée une table de hachage séparée ayant une taille maximale spécifique et un nombre maximal de compartiments. Cette table de hachage contient une empreinte numérique de chaque valeur unique ou multiple. Les valeurs peuvent être la destination IP, la source IP,le port source ou le port destination, ou tout en même temps. Chaque entrée pointe alors vers une empreinte numérique qui fonctionne comme la correspondance limit.

Tableau 10.16. Options de la correspondance Hashlimit

Correspondance --hashlimit
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.3 -m hashlimit --hashlimit 1000/sec --hashlimit-mode dstip,dstport --hashlimit-name hosts
Explication

--hashlimit spécifie la limite de chaque compartiment. Dans cet exemple, le hashlimit est placé à 1000. Nous avons placé le hashlimit-mode pour dstip, dstport et destination 192.168.0.3. Pour chaque port ou service le destinataire peut recevoir 1000 paquets par seconde. C'est le même paramètrage que l'option limit pour la correspondance limit. Limit peut prendre /sec, /minute, /hour, /day postfixé. Si aucun postfixage n'est spécifié, le postfixage par défaut est la seconde.

[Important] Important

Cette option est obligatoire pour toutes les correspondances hashlimit.

Correspondance --hashlimit-mode
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.0/16 -m hashlimit --hashlimit 1000/sec --hashlimit-mode dstip --hashlimit-name hosts
Explication

L'option hashlimit-mode spécifie quelle valeur nous devrons utiliser comme valeur de hachage. Dans cet exemple, nous utilisons seulement dstip (destination IP) comme valeur de hachage. Ainsi, chaque hôte dans le réseau 192.168.0.0/16 sera limité en réception d'un maximum de 1000 paquets par seconde dans ce cas. Les valeurs possibles pour le mode hashlimit sont dstip (IP destination), srcip (IP source), dstport (port de destination), et srcport (port source). Toutes ces valeurs peuvent également être séparées par une virgule pour inclure plus d'une valeur de hachage, comme par exemple --hashlimit-mode dstip,dstport.

[Important] Important

Cette option est obligatoire pour toutes les correspondances hashlimit.

Correspondance --hashlimit-name
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.3 -m hashlimit --hashlimit 1000 --hashlimit-mode dstip,dstport --hashlimit-name hosts
Explication

Cette option spécifie le nom du hachage dans lequel il sera disponible. Il peut être vu dans le répertoire /proc/net/ipt_hashlimit. L'exemple ci-dessus peut être visible dans le fichier /proc/net/ipt_hashlimit/hosts. Seul le nom de fichier doit être spécifié.

[Important] Important

Cette option est obligatoire pour toutes les correspondances hashlimit.

Correspondance --hashlimit-burst
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.3 -m hashlimit --hashlimit 1000 --hashlimit-mode dstip,dstport --hashlimit-name hosts --hashlimit-burst 2000
Explication

Cette correspondance est identique à --limit-burst en ce qu'elle indique la taille maximum du compartiment. Chaque compartiment aura une limite, qui est le montant maximal de paquets qui peuvent être sélectionnés pendant une unité de temps. Pour un exemple, voir la Correspondance Limit.

Correspondance --hashlimit-htable-size
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.3 -m hashlimit --hashlimit 1000 --hashlimit-mode dstip,dstport --hashlimit-name hosts --hashlimit-htable-size 500
Explication

Indique le maximum de compartiments disponibles. Dans cet exemple, ceci indique un maximum de 500 ports ouverts et actifs au même moment.

Correspondance --hashlimit-htable-max
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.3 -m hashlimit --hashlimit 1000 --hashlimit-mode dstip,dstport --hashlimit-name hosts --hashlimit-htable-max 500
Explication

La --hashlimit-htable-max indique le nombre maximum d'entrées dans la table de hachage. Ce qui veut dire toutes les connexions, incluant les connexions inactives qui ne requièrent pas de compartiment pour l'instant.

Correspondance --hashlimit-htable-gcinterval
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.3 -m hashlimit --hashlimit 1000 --hashlimit-mode dstip,dstport --hashlimit-name hosts --hashlimit-htable-gcinterval 1000
Explication

À quelle fréquence la fonction de récupération des informations parasites doit elle être lancée. Cette valeur devra être plus basse que la valeur expire. Elle est mesurée en millisecondes. Si elle est trop basse elle consommera des ressources système et processeur non nécessaires, mais si elle est trop haute elle peut laisser des compartiments inutilisés trop longtemps et rendre d'autres connexions impossibles. Dans cet exemple la fonction de récupération est lancée chaque seconde.

Correspondance --hashlimit-htable-expire
Noyau 2.6
Exemple iptables -A INPUT -p tcp --dst 192.168.0.3 -m hashlimit --hashlimit 1000 --hashlimit-mode dstip,dstport --hashlimit-name hosts --hashlimit-htable-expire 10000
Explication

Valeur qui indique la durée après laquelle une entrée dans la table de hachage expirera. Si un compartiment a été inutilisé plus longtemps que, il expirera et la fonction de récupération le supprimera de la table de hachage, ainsi que toutes les afférentes.


10.3.9. Correspondance Helper

C'est plutôt une correspondance pas très orthodoxe en comparaison des autres, dans ce sens qu'elle utilise une syntaxe spécifique. Elle est utilisée pour sélectionner les paquets, basés sur l'assistant conntrack en relation avec le paquet. Par exemple, regardons une session FTP. La session Contrôle est ouverte, et les ports/connexion sont négociés pour la session Data dans la session Control. Le module assistant ip_conntrack_ftp va trouver cette information, et créer une entrée dans la table conntrack. Maintenant, quand un paquet entre, nous pouvons voir quel protocole est en relation, et pouvons sélectionner le paquet dans nos propres tables de règles basées sur l'assistant qui a été utilisé.

Tableau 10.17. Options de la correspondance Helper

Correspondance --helper
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m helper --helper ftp-21
Explication

L'option --helper est utilisée pour spécifier une valeur de chaîne, indiquant à la correspondance quelle assistant conntrack sélectionner. Dans sa forme basique, elle peut ressembler à --helper irc. C'est l'endroit où la syntaxe démarre en variant par rapport à la syntaxe normale. Nous pouvons aussi choisir de sélectionner seulement les paquets basés sur tel port que l'original a pris. Exemple, la session Control FTP est normalement transférée sur le port 21, mais elle peut aussi bien l'être sur le port 954 ou un autre. Nous pouvons alors spécifier quel port sera utilisé, comme --helper ftp-954.


10.3.10. Correspondance de plage IP

La correspondance de plage IP est utilisée pour sélectionner les plages IP, comme les correspondances --source et --destination peuvent le faire. Cependant, cette correspondance ajoute une sorte de tri différent dans le sens qu'elle peut faire la sélection dans la forme IP à IP, ce que les correspondances --source et --destination sont incapables de faire. Ceci peut être nécessaire dans certains réglages de réseaux spécifiques, et elle est légèrement plus souple.

Tableau 10.18. Options de la correspondance de plage IP

Correspondance --src-range
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.13-192.168.2.19
Explication

Ceci sélectionne une plage d'adresses source IP. La plage inclut chaque adresse depuis la première jusqu'à la dernière, ainsi l'exemple ci-dessus inclut toutes les adresses depuis 192.168.1.13 jusqu'à 192.168.2.19. Elle peut aussi être inversée avec le !. L'exemple du dessus ressemblera alors à -m iprange ! --src-range 192.168.1.13-192.168.2.19, qui va sélectionner chaque adresse, sauf celles spécifiées.

Correspondance --dst-range
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m iprange --dst-range 192.168.1.13-192.168.2.19
Explication

--dst-range fonctionne exactement de la même façon que la correspondance --src-range, sauf qu'elle sélectionne la destination IP au lieu de la source IP.


10.3.11. Correspondance Length

La correspondance Length est utilisée pour sélectionner les paquets basés sur leur longueur. C'est très simple. Si vous voulez limiter la longueur des paquets pour quelque étrange raison, ou bloquer ce qui ressemble à un ping-of-death, utilisez cette correspondance.

Tableau 10.19. Options de la correspondance Length

Correspondance --length
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m length --length 1400:1500
Explication

L'exemple --length va sélectionner tous les paquets de longueur comprise entre 1400 et 1500 octets. Elle peut être inversée en utilisant le signe !, comme ça : -m length ! --length 1400:1500. Elle peut aussi être utilisée pour sélectionner certaines tailles seulement, en supprimant le signe :, comme ceci : -m length --length 1400. La plage est bien sûr inclusive, ce qui inclut tous les paquets dont la longueur est comprise dans les valeurs que vous avez spécifiées.


10.3.12. Correspondance Limit

L'extension de correspondance limit doit être chargée explicitement avec l'option -m limit. Cette correspondance peut être employée avantageusement pour limiter la journalisation de certaines règles, etc. Par exemple, vous pouvez établir une correspondance avec tous les paquets qui n'excèdent pas une quantité donnée, et au-delà de ce seuil, limiter la journalisation de l'évènement en question. Considérez ce seuil comme une limite temporelle : vous pouvez limiter le nombre de correspondances d'une certaine règle dans un certain laps de temps, par exemple pour atténuer l'impact des attaques de type déni de service (DoS). C'est d'ailleurs la principale application qu'on en fait, mais naturellement, il en existe d'autres. La correspondance limit peut également être inversée en ajoutant le symbole ! juste après le mot limit. Elle s'exprime alors sous la forme -m limit ! --limit 5/s, autrement dit tous les paquets sont sélectionnés quand la limite est dépassée.

Pour décrire plus précisément la correspondance limit, c'est essentiellement un filtre à jetons. Considérez un seau percé qui laisse fuir N paquets par unité de temps. N est défini en fonction du nombre de paquets que nous voulons sélectionner, ainsi si nous voulons 3 paquets, le seau laisse fuir 3 paquets par unité de temps. L'option --limit détermine le nombre de paquets qui peuvent remplir le seau par unité de temps, alors que l'option --limit-burst définit la contenance initiale du seau. Par conséquent, en définissant --limit 3/minute --limit-burst 5, puis en recevant 5 correspondances, le seau sera vidé. Après une attente de 20 secondes, le seau est rempli d'un nouveau jeton, et ainsi de suite jusqu'à ce que le paramètre --limit-burst soit atteint ou jusqu'à ce que les jetons soient tous utilisés.

Considérez l'exemple ci-dessous pour approfondir ce fonctionnement.

  1. On définit une règle avec les paramètres -m limit --limit 5/second --limit-burst 10/second. Le paramètre limit-burst du seau à jetons est fixé initialement à 10. Chaque paquet qui établit une correspondance avec la règle consomme un jeton.

  2. On reçoit alors des paquets qui correspondent à la règle, 1-2-3-4-5-6-7-8-9-10, tous arrivent dans un intervalle de 1/1000ème de seconde.

  3. Le seau de jetons se retrouve complètement vide. Et puisque le seau est vide, les paquets qui rencontrent la règle ne peuvent plus correspondre et poursuivent leur route vers la règle suivante, ou subissent le comportement par défaut de la chaîne.

  4. Pour chaque tranche de 1/5ème de seconde sans qu'un paquet ne corresponde, le compteur de jetons augmente de 1, jusqu'à un maximum de 10. Et 1 seconde après avoir reçu 10 paquets, on aura de nouveau 5 jetons de moins.

  5. Et naturellement, le seau sera vidé d'1 jeton par paquet reçu.

Tableau 10.20. Options de la correspondance Limit

Correspondance --limit
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m limit --limit 3/hour
Explication Ceci définit le taux de correspondance moyen maximum pour la correspondance limit. Il est spécifié par un nombre suivi éventuellement d'une unité de temps. Les unités suivantes sont actuellement reconnues : /second, /minute, /hour et /day. La valeur par défaut est fixée à 3 correspondances par heure, soit 3/hour. Ceci indique à la correspondance limit combien de fois la correspondance avec un paquet est autorisé par unité de temps (par exemple par minute).
Correspondance --limit-burst
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m limit --limit-burst 5
Explication Ceci définit la réserve maximale (ou la salve) de la correspondance limit. Il indique à iptables le nombre maximum de paquets pouvant correspondre pendant l'unité de temps donnée. Ce nombre est décrémenté de 1 après chaque unité de temps (spécifiée par l'option --limit) pendant laquelle l'évènement ne s'est pas produit, jusqu'à atteindre la plus faible valeur, 1. Si l'évènement se produit de façon répétée, le compteur est alors incrémenté jusqu'à atteindre la valeur de réserve maximale, et ainsi de suite. La valeur par défaut de --limit-burst est 5. Pour comprendre simplement comment ceci fonctionne, utilisez le script d'exemple Limit-match.txt composé d'une règle. Grâce à ce script, vous pouvez voir vous-mêmes comment fonctionne la règle limit, en envoyant des paquets d'écho (de type ping) à des intervalles différents et en différentes rafales. Toutes les réponses d'écho seront bloquées jusqu'à ce que le seuil de réserve maximale soit de nouveau atteint.

10.3.13. Correspondance Mac

La correspondance MAC (Ethernet Media Access Control - Interface réseau ethernet) permet de sélectionner des paquets à partir de leur adresse MAC source. Lors de l'écriture de ce document, cette correspondance s'avère quelque peu limitée, cependant elle pourrait être plus évoluée à l'avenir, donc plus utile. Cette correspondance peut être utilisée pour sélectionner les paquets sur la source de l'adresse MAC seulement comme précédemment indiqué.

[Note] Note

Remarquez que l'utilisation de ce module impose de le charger explicitement avec l'option -m mac. Il est nécessaire de le rappeler ici vu le nombre de personne croyant pouvoir l'invoquer seulement par -m mac-source, ce qui n'est pas possible.

Tableau 10.21. Options de la correspondance Mac

Correspondance --mac-source
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
Explication Cette correspondance permet de sélectionner des paquets à partir de leur adresse MAC source. L'adresse MAC doit être spécifiée de la forme XX:XX:XX:XX:XX:XX, autrement elle n'est pas valide. La correspondance peut être inversée avec le signe ! et ressemble alors à --mac-source ! 00:00:00:00:00:01. Autrement dit, ceci inverse le sens de la corrrespondance, en sélectionnant tous les paquets sauf ceux possédant l'adresse MAC spécifiée. Notez que comme les adresses MAC ne sont utilisées que dans les réseaux de type Ethernet, cette correspondance ne s'applique qu'aux interfaces Ethernet. La correspondance MAC est valide seulement dans les chaînes PREROUTING, FORWARD et INPUT, et nulle part ailleurs.

10.3.14. Correspondance Mark

L'extension de correspondance mark permet de sélectionner des paquets à partir de leur marquage. Le marquage désigne un champ particulier, pris en charge uniquement au sein du noyau, et lié aux paquets circulant à travers la machine. Le marquage peut être employé par différentes routines du noyau pour des tâches comme de la régulation de trafic ou du filtrage. Aujourd'hui, il n'existe qu'un seul moyen de définir un marquage sous Linux, c'est la cible MARK dans iptables. Auparavant, il s'agissait de la cible FWMARK dans ipchains, et c'est pourquoi nombre de gens se réfèrent encore à FWMARK dans les documentations avancées sur le routage. Le champ de marquage est actuellement défini comme un entier non signé, soit 4294967296 valeurs possibles sur un système 32 bits. En d'autres termes, vous ne risquez pas de sitôt de dépasser cette limite et vous êtes tranquille pour quelques temps.

Tableau 10.22. Options de la correspondance Mark

Correspondance --mark
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -t mangle -A INPUT -m mark --mark 1
Explication Cette correspondance permet de sélectionner des paquets qui ont été préalablement marqués. Les marquages peuvent être positionnés avec la cible MARK développée dans la section suivante. Tous les paquets transitant par Netfilter se voient affectés d'un champ de marquage spécial. Notez que ce champ de marquage n'est propagé en aucune manière, que ce soit à l'intérieur ou à l'extérieur du paquet. Il reste exclusivement à l'intérieur de la machine qui l'a créé. Si le champ de marquage est égal à la valeur de l'option --mark, il y a correspondance. Le champ de marquage est un entier non signé, par conséquent 4294967296 différents marquages peuvent exister. Vous pouvez également utiliser un masque avec le marquage. Dans ce cas, la spécification de marquage ressemble, par exemple, à --mark 1/1. Quand un masque est spécifié, on effectue un ET logique avec le marquage spécifié avant de réaliser la comparaison réelle.

10.3.15. Correspondance Multiport

L'extension de correspondance multiport permet de spécifier plusieurs ports et intervalles et ports destination. Sans cette possibilité, vous devriez utiliser différentes règles du même genre, juste pour établir une correspondance avec différents ports.

[Note] Note

Vous ne pouvez pas utiliser simultanément la correspondance de port standard et la correspondance multiport. Par exemple, il est inutile d'écrire : --sport 1024:63353 -m multiport --dport 21,23,80, car ça ne marchera pas. Si vous le faites quand même, iptables considèrera le premier élément de la règle et ignorera l'instruction multiport.

Tableau 10.23. Options de la correspondance Multiport

Correspondance --source-port
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
Explication Cette correspondance sélectionne plusieurs ports source. Au maximum, 15 ports peuvent être spécifiés. Les ports doivent être séparés par des virgules, comme dans l'exemple ci-dessus. Cette correspondance ne peut être employée qu'avec les correspondances -p tcp ou -p udp. C'est principalement une version améliorée de la correspondance classique --source-port.
Correspondance --destination-port
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
Explication Cette correspondance sélectionne plusieurs ports destination. Elle fonctionne exactement de la même façon que la correspondance de port source mentionnée précédemment, excepté qu'elle s'applique aux ports destination. Elle dispose aussi d'une limite de 15 ports, et ne peut être employée qu'avec -p tcp et -p udp.
Correspondance --port
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
Explication Cette extension de correspondance permet de sélectionner les paquets à partir à la fois de leur port destination et de leur port source. Elle fonctionne de la même façon que les correspondances --source-port et --destination-port présentées ci-dessus. Elle accepte 15 ports au maximum, et ne peut être employée qu'avec -p tcp et -p udp. Notez que la correspondance --port ne peut sélectionner que les paquets qui viennent et vont vers le même port, par exemple, du port 80 au port 80, du port 110 au port 110, etc.

10.3.16. Correspondance Owner

L'extension de correspondance owner permet de sélectionner des paquets à partir de l'identité du processus qui les a créés. Le propriétaire (owner) peut être spécifié comme étant l'identifiant de l'utilisateur qui a lancé la commande en question, de son groupe, du processus, de la session, ou bien de la commande elle-même. À l'origine, cette extension a été écrite pour donner un exemple des utilisations possibles d'iptables. La correspondance owner fonctionne seulement dans la chaîne OUTPUT pour des raisons évidentes : il est presque impossible d'extraire des éléments d'information sur l'identité de l'instance ayant envoyé un paquet à partir de l'autre extrémité, et où a lieu le saut intermédiaire avant la destination finale. Et même dans la chaîne OUTPUT, ce n'est pas vraiment fiable puisque certains paquets peuvent ne pas avoir de propriétaire. Les célèbres paquets de ce genre sont, entre-autres, les réponses ICMP. Donc les réponses ICMP ne correspondront jamais.

Tableau 10.24. Options de la correspondance Owner

Correspondance --cmd-owner
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m owner --cmd-owner httpd
Explication

C'est la correspondance de la commande owner, utilisée pour faire la sélection sur la base du nom de commande du processus qui a envoyé le paquet. Dans l'exemple, httpd est sélectionné. Cette correspondance peut aussi être intervertie par un point d'exclamation, par exemple -m owner ! --cmd-owner ssh

Correspondance --uid-owner
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m owner --uid-owner 500
Explication Avec cette correspondance, le paquet est sélectionné s'il a été créé par l'identifiant d'utilisateur (UID) donné. Ceci permet d'établir une correspondance avec les paquets sortants basée sur celui qui les a créés. Une utilisation possible serait d'empêcher tout utilisateur autre que root d'ouvrir de nouvelles connexions extérieures au pare-feu. Une autre possibilité pourrait être d'empêcher tout le monde sauf l'utilisateur http d'envoyer des paquets à partir du port HTTP.
Correspondance --gid-owner
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m owner --gid-owner 0
Explication Cette correspondance permet de sélectionner des paquets à partir de leur identifiant de groupe (GID). Ainsi on établit une correspondance avec tous les paquets associés au groupe auquel appartient l'utilisateur ayant créé le paquet. Par exemple, ceci permet d'empêcher tous les utilisateurs sauf ceux appartenant au groupe network de naviguer sur Internet, ou comme précédemment, d'autoriser seulement les membres du groupe http à créer des paquets sortants par le port HTTP.
Correspondance --pid-owner
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m owner --pid-owner 78
Explication Cette correspondance permet de sélectionner des paquets à partir de l'identifiant de processus (PID) qui est responsable d'eux. Cette correspondance est un peu plus difficile à utiliser, mais il est possible, par exemple, d'autoriser seulement le PID 94 à envoyer des paquets par le port HTTP (si le processus HTTP n'est pas un fil d'exécution, bien sûr). Une autre alternative serait d'écrire un petit script qui récupère le PID à partir de la sortie d'une commande ps pour un "démon" spécifique, et qui ajoute ensuite une règle pour le numéro récupéré. Pour donner un exemple, vous pouvez élaborer une règle comme celle présente dans l'exemple .
Correspondance --sid-owner
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m owner --sid-owner 100
Explication Cette correspondance permet de sélectionner des paquets à partir de l'identifiant de session (SID) utilisé par le programme en question. La valeur du SID d'un processus est celle du processus lui-même et de tous les processus découlant du processus d'origine. Ces derniers peuvent être un fil d'exécution ("thread"), ou un processus fils du processus d'origine. Donc par exemple, tous les processus HTTPD devraient posséder le même SID que leur processus parent (le processus HTTPD d'origine), si le HTTPD appartient à un fil d'exécution (comme la plupart des processus HTTPD, Apache et Roxen par exemple). Ceci est illustré par un petit script qui s'appelle Sid-owner.txt. Celui-ci pourrait éventuellement être lancé toutes les heures et enrichi de code supplémentaire pour vérifier que l'exécution du processus HTTPD est toujours en cours et le redémarrer sinon, avant de vider et redéfinir la chaîne OUTPUT si nécessaire.

[Note] Note

La sélection des pid et sid ne fonctionne pas avec les noyaux SMP car ils utilisent différents processus pour chaque processeur. Ce devrait être réglé dans le futur.

10.3.17. Correspondance type de paquet

Cette correspondance sert à sélectionner les paquets basés sur leur type. C'est à dire, ceux destinés à une personne précise, à tout le monde ou à un groupe de machines spécifique ou encore des utilisateurs. Ces trois groupes sont généralement appelés unicast, broadcast et multicast, comme nous l'avons vu dans le chapitre Rappel TCP/IP. La correspondance est chargée par la commande : -m pkttype.

Tableau 10.25. Options de la correspondance type de paquet

Correspondance --pkt-type
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m pkttype --pkt-type unicast
Explication

La correspondance --pkttype sert à indiquer quel type de paquet sélectionner. Elle peut prendre soit unicast, broadcast ou multicast comme argument, voir l'exemple. Elle peut aussi être inversée par ! comme ceci : -m pkttype --pkttype ! broadcast, qui va sélectionner tous les autres types de paquets.


10.3.18. Correspondance Realm

La correspondance realm est utilisée pour sélectionner les paquets basés sur le domaine de routage dont il font partie. Les domaines de routage sont utilisés dans Linux pour les scénarios de routage complexe comme BGP, etc. La correspondance realm est chargée en ajoutant le mot-clé -m realm à la ligne de commande.

Un domaine de routage est utilisé dans Linux pour classer les routes en groupes logiques. Dans la plupart des routeurs dédiés aujourd'hui, la Base d'Information de Routage (Routing Information Base - RIB) et le moteur de transfert sont très proches. Dans le noyau par exemple. Linux n'est pas réellement un système de routage dédié, il a été forcé de séparer ses RIB et FIB (Base d'Information de Transfert). Le RIB se situe au niveau domaine utilisateur et le FIB au niveau du noyau. À cause de cette séparation, il devient gourmand en ressource de faire des recherches rapides dans le RIB. Le domaine de routage est la solution Linux pour ça, il rend le système plus flexible et plus riche.

Les domaines Linux peuvent être utilisés avec BGP et autres protocoles de routage qui délivrent une grande quantité de routes. Le démon de routage peut alors trier les routes par leur préfixe, chemin ou source par exemple, et les placer dans différents domaines. Le domaine est numérique, mais peut aussi être nommé par le fichier /etc/iproute2/rt_realms.

Tableau 10.26. Options de la correspondance Realm

Correspondance --realm
Noyau 2.6
Exemple iptables -A OUTPUT -m realm --realm 4
Explication

Cette option sélectionne le nombre de domaines et optionnellement un masque. Si ce n'est pas un nombre, il résoudra le domaine par le fichier /etc/iproute2/rt_realms. Si un domaine nommé est utilisé, aucun masque ne devra être utilisé. Le domaine peut aussi être interverti en plaçant un point d'exclamation, par exemple --realm ! cosmos.


10.3.19. Correspondance Recent

La correspondance recent est une système plutôt important et complexe, qui nous permet de sélectionner des paquets basés sur les événements récents. Exemple, si nous voulons voir une sortie de connexion IRC, nous pouvons placer l'adresse IP dans une liste d'hôtes, et avoir une autre règle qui permet des requêtes d'identification en retour d'un serveur IRC dans les 15 secondes de veille du paquet d'origine.

Avant nous pouvons avoir une vue plus précise de cette correspondance, voyons comment elle fonctionne. En premier, nous utilisons différentes règles pour utiliser l'appariement récent. Celui-ci se sert de plusieurs listes d'événements récents. Par défaut la liste utilisée est DEFAULT. Nous créons une nouvelle entrée dans la liste avec cette option, ainsi une fois qu'une règle est complètement vérifiée (l'option placée est toujours une correspondance), nous pouvons ajouter une entrée dans la liste récente spécifiée. L'entrée de la liste contient un horodatage, et l'adresse source IP utilisée dans le paquet qui déclenche l'option. Une fois ceci fait, nous pouvons utiliser une série d'options différentes pour sélectionner cette information, comme la mise à jour des entrées d'horodatage, etc.

Enfin, si nous voulons pour quelque raison supprimer une entrée de la liste, nous pouvons le faire en supprimant la correspondance du module récent. Toutes les règles utilisant la correspondance Recent, doivent charger ce module (-m recent). Voyons en les options.

Tableau 10.27. Options de la correspondance Recent

Correspondance --name
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m recent --name examplelist
Explication

L'option "name" donne le nom de la liste à utiliser. Par défaut la liste DEFAULT est utilisée, ce qui n'est probablement pas ce que nous voulons si nous nous servons de plus d'une liste.

Correspondance --set
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m recent --set
Explication

Ceci crée une nouvelle entrée dans la liste récente, qui contient un horodatage et l'adresse source IP de l'hôte qui a déclenché la règle. Cette correspondance retournera toujours vrai, sauf si elle précédée du signe !, auquel cas elle renverra faux.

Correspondance --rcheck
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m recent --name examplelist --rcheck
Explication

L'option --rcheck vérifie si l'adresse IP source du paquet est dans la liste nommée. Si c'est le cas, la correspondance renvoit un "vrai", dans le cas contraire elle renverra un "faux". Cette option peut être inversée avec le signe !. Dans ce dernier cas, elle renverra vrai si l'adresse IP source n'est pas dans la liste, et faux si elle est dans la liste.

Correspondance --update
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m recent --name examplelist --update
Explication

Cette correspondance est vraie si la source est disponible dans la liste spécifiée et met à jour le dernier horodatage dans la liste. Elle peut aussi être inversée par le ! devant le module. Exemple, ! --update.

Correspondance --remove
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m recent --name example --remove
Explication

Cette correspondance essaie de trouver l'adresse source du paquet dans la liste, et renvoie un vrai si le paquet est présent. Elle supprimera aussi l'entrée de liste correspondante de la liste. Cette commande peut être inversée avec le signe !.

Correspondance --seconds
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m recent --name example --check --seconds 60
Explication

Cette correspondance n'est valide seulement qu'avec les commandes --check et --update. Le module --seconds est utilisé pour spécifier le délai de mise à jour de la colonne "dernier apperçu" dans la liste récente. Si la colonne dernier apperçu est plus ancienne qu'un certain nombre de secondes, la correspondance renvoit faux. Si la correspondance récent fonctionne normalement, l'adresse source doit toujours être dans la liste pour un retour vrai de la correspondance.

Correspondance --hitcount
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m recent --name example --check --hitcount 20
Explication

La correspondance --hitcount doit être utilisée avec les commandes --check ou --update, elle limitera la sélection aux seuls paquets vus par le compteur. Si cette correspondance est utilisée avec la commande --seconds, cela nécessite que le compteur de paquets spécifié soit vu dans le bloc de temps. Elle peut être inversée par le signe ! devant la commande. Avec la commande --seconds, elle indique le maximum de paquets qui peuvent avoir été vus durant le bloc de temps spécifié. Si les deux correspondances sont inversées, alors un maximum de paquets peuvent avoir été vus durant le dernier minimum de secondes.

Correspondance --rttl
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m recent --name example --check --rttl
Explication

La correspondance --rttl vérifie que la valeur TTL du paquet est la même que celle du paquet original utilisé pour placer l'entrée dans la liste récente. Ceci peut être utilisé pour vérifier que les adresses sources de personnes n'ont pas été mystifiées (spoofing) pour interdire aux autres l'accès à leur serveur en faisant usage de la correspondance recent.

Correspondance --rsource
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m recent --name example --rsource
Explication

La correspondance --rsource indique au module recent de sauvegarder l'adresse source et les ports dans la liste recent. C'est le comportement par défaut.

Correspondance --rdest
Noyau 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m recent --name example --rdest
Explication

--rdest est l'opposé de --rsource en ce qu'elle indique à la correspondance recent d'enregistrer l'adresse et le port de destination dans la liste recent.


j'ai créé un petit exemple de script sur la façon d'utiliser la correspondance recent, vous pouvez le trouver dans la section Recent-match.txt.

En bref, c'est une pauvre variation de la machine d'état disponible dans netfilter. Cette version fut créé avec à l'esprit un serveur http, mais qui fonctionnera avec n'importe quelle connexion TCP. En premier, nous avons créé deux chaînes nommées http-recent et http-final. La chaîne http-recent est utilisée aux étapes du démarrage de la connexion, et pour la transmission des données, tandis que la chaîne http-final est utilisée pour les derniers FIN, FIN/ACK dans l'établissement de la liaison.

[Avertissement] Avertissement

C'est une très mauvaise alternative pour la machine d'état et elle ne dispose pas de toutes les possibilités de la machine d'état. Cependant, c'est un bon exemple de ce qui peut être fait avec la correspondance Recent sans être trop spécifique. N'utilisez pas cet exemple en production. Il est lent, gère mal les cas spéciaux, et ne doit être jamais être utilisé que comme un exemple.

Par exemple, il ne gère pas les ports fermés dans une connexion, les établissements de liaison FIN asynchrones (où une des parties connectée se ferme, tandis que l'autre continue d'envoyer des données), etc.

Suivons un paquet à travers l'exemple de la table de règles. D'abord le paquet entre dans la chaîne INPUT, et nous l'envoyons à la chaîne http-recent.

  1. Le premier paquet sera un paquet SYN, et n'aura pas de bit ACK, FIN ou RST placé. Il est sélectionné en utilisant la ligne --tcp-flags SYN,ACK,FIN,RST SYN. À ce niveau nous ajoutons la connexion à httplist avec la ligne -m recent --name httplist --set. Enfin nous acceptons le paquet.

  2. Après le premier paquet nous recevons un paquet SYN/ACK indiquant que le paquet SYN a été reçu. Ceci peut être vérifié en utilisant la ligne --tcp-flags SYN,ACK,FIN,RST SYN,ACK. FIN et RST sont illégaux à ce niveau. Nous mettons à jour l'entrée dans httplist par -m recent --name httplist --update et finalement nous avons l'ACCEPT du paquet.

  3. Maintenant nous obtenons un paquet final ACK, venant du créateur de la connexion, nous permettant de savoir que le SYN/ACK a été envoyé par le serveur. SYN, FIN et RST devraient être illégaux à ce point de la connexion, et la ligne ressemblera à --tcp-flags SYN,ACK,FIN,RST ACK. Nous mettons à jour la liste de la même façon que dans l'étape précédente, et nous ACCEPTons.

  4. À ce niveau, la transmission de données peut démarrer. La connexion ne contiendra jamais aucun paquet SYN maintenant, mais contiendra des paquets ACK pour permettre de savoir que les données sont envoyées. Chaque fois que nous voyons un paquet comme celui-là, nous mettons à jour la liste et ACCEPTons les paquets.

  5. La transmission peut se terminer de deux façons, la plus simple est le paquet RST. RST réinitialisera la connexion et la coupera. Avec FIN/ACK le correspondant répond avec un FIN, et ferme la connexion ainsi l'expéditeur du FIN/ACK ne peut plus envoyer de données. L'hôte qui reçoit le FIN pourra toujours envoyer des données, et nous arrivons à l'étape finale de la connexion.

  6. Dans les chaînes http-recent-final nous vérifions si le paquet est toujours dans la httplist, et si c'est le cas, nous l'envoyons à la chaîne http-recent-final1. Dans cette chaîne nous supprimons la connexion de la httplist l'ajoutons à la liste http-recent-final. Si la connexion a déjà été supprimée et déplacée vers la liste http-recent-final, nous envoyons le paquet vers la chaîne http-recent-final2.

  7. Dans la chaîne http-recent-final2, nous attendons que la partie non fermée finisse d'envoyer ses données, et fermons ensuite la connexion. Une fois ceci fait, la connexion est définitivement fermée.

Comme nous l'avons vu la liste recent peut devenir tout à fait complexe, mais elle nous donne un vaste éventail de possibilités si nécessaire. Encore une fois, nous ne réinventons pas la roue. Si la fonctionnalité que vous désirez est déjà implémentée, utilisez la au lieu d'essayer de créer votre propre solution.

10.3.20. Correspondance State

L'extension de correspondance state est associée au code de traçage de connexion dans le noyau. La correspondance d'état accède à l'état du traçage de connexion des paquets grâce à la machine de "conntracking". Elle permet de savoir dans quel état se trouve la connexion, et fonctionne pour quasiment tous les protocoles y compris les protocoles sans état tels que ICMP et UDP. Dans tous les cas, la connexion est sujette à un dépassement de temps établi par défaut ("default timeout") et sera, le cas échéant, supprimée de la base de données du traçage de connexion. Cette correspondance exige d'être chargée explicitement en ajoutant la directive -m state à la règle. Vous disposerez alors d'une nouvelle correspondance appelée state. Le concept de correspondance d'état est couvert plus en détail dans le chapitre La machine d'état, étant donné que le sujet est assez vaste.

Tableau 10.28. Options de la correspondance State

Correspondance --state
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -m state --state RELATED,ESTABLISHED
Explication

Cette option indique à la correspondance state dans quels états doivent être les paquets pour être sélectionnés. Actuellement, 4 états sont disponibles : INVALID, ESTABLISHED, NEW et RELATED. INVALID signifie que le paquet n'est associé à aucun flux, ni à aucune connexion connus, et qu'il peut contenir des données ou des en-têtes erronés. ESTABLISHED signifie que le paquet est lié à une connexion déjà établie, qui a vu passer des paquets dans les deux directions et qui est considérée comme valide. NEW signifie que le paquet a démarré ou démarrera une nouvelle connexion, ou bien qu'il est associé à une connexion qui n'a pas vu passer des paquets dans les deux directions. Enfin, RELATED signifie que le paquet démarre une nouvelle connexion et qu'il est associé à une connexion déjà établie. Ceci peut évoquer par exemple un transfert de données par FTP, ou une erreur ICMP associée à une connexion TCP ou UDP. Notez que l'état NEW n'examine pas les bits SYN des paquets TCP qui tentent de démarrer une nouvelle connexion. Par conséquent, cet état ne devrait pas être utilisé tel quel dans les situations où il n'existe qu'un seul pare-feu, ou quand il n'y a pas d'équilibrage de charge entre les différents pare-feux. Cependant, cet état se révèle utile dans certains cas. Pour en savoir plus, consultez le chapitre La machine d'état.


10.3.21. Correspondance Tcpmss

La correspondance tcpmss est utilisée pour sélectionner un paquet basé sur le Maximum Segment Size (Taille maximum de segment) dans TCP. Ceci vérifie seulement la validité des paquets SYN et SYN/ACK. Pour une explication plus détaillée de la valeur MSS, voir l'annexe, Options TCP la RFC 793 - Transmission Control Protocol et la RFC 1122 - Requirements for Internet Hosts - Communication Layers. Cette correspondance est chargée en utilisant -m tcpmss et prend uniquement cette option.

Tableau 10.29. Options de la correspondance Tcpmss

Correspondance --mss
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp --tcp-flags SYN,ACK,RST SYN -m tcpmss --mss 2000:2500
Explication

L'option --mss indique à la correspondance tcpmss quel Maximum Segment Size sélectionner. Ceci peut être soit une simple valeur MSS, soit une plage de valeurs MSS séparées par :. La valeur peut être inversée par le signe !, comme dans l'exemple suivant :

-m tcpmss ! --mss 2000:2500

Cet exemple vérifiera toutes les valeurs MSS, sauf les valeurs comprises dans la plage 2000 à 2500.


10.3.22. Correspondance Tos

La correspondance TOS peut servir à sélectionner les paquets à partir de leur champ de TOS. TOS signifie type de service ; il est constitué de 8 bits et se situe dans l'en-tête IP. Cette correspondance est chargée explicitement en ajoutant -m tos à la règle. Elle est normalement utilisée afin d'informer les hôtes intermédiaires de l'ordre de priorité du flux et de son contenu (ce n'est pas vraiment le cas, mais il informe des besoins spécifiques au flux, comme une réexpédition aussi rapide que possible, ou un impératif de débit). Les différents routeurs et administrateurs gèrent ces valeurs de façon variable. La plupart ne s'en préoccupent pas du tout, alors que d'autres font de leur mieux pour gérer les paquets en question et les données qu'ils fournissent.

Tableau 10.30. Options de la correspondance Tos

Correspondance --tos
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp -m tos --tos 0x16
Explication Cette correspondance s'utilise tel que décrit ci-dessus. Elle sélectionne les paquets à partir de leur champ de TOS et de sa valeur. Ceci peut être employé avec le programme iproute2 et les fonctions avancées de routage de Linux pour effectuer un marquage des paquets pour un usage ultérieur. La correspondance prend en option une valeur hexadécimale ou numérique, ou éventuellement un des noms fournis par la commande 'iptables -m tos -h'. Actuellement, elle fournit les noms suivants : Minimize-Delay 16 (0x10), Maximize-Throughput 8 (0x08), Maximize-Reliability 4 (0x04), Minimize-Cost 2 (0x02), et Normal-Service 0 (0x00). Minimize-Delay signale de minimiser le retard pour les paquets qui traversent - les services classiques qui requièrent ceci peuvent être, par exemple, telnet, SSH et FTP-control. Maximize-Throughput précise de trouver un chemin qui offre le plus haut débit possible - un protocole typique est FTP-data. Maximize-Reliability indique de maximiser la fiabilité de la connexion, donc d'utiliser des lignes aussi fiables que possible - deux exemples typiques sont BOOTP et TFTP. Minimize-Cost signale de minimiser le coût des paquets qui traversent tous les liens vers le client ou le serveur ; par exemple, déterminer la route qui offre le voyage le moins onéreux de bout en bout. Des exemples de protocoles classiques qui peuvent l'utiliser sont RTSP ("Real Time Stream Control Protocol" ou protocole de contrôle de flux en temps-réel) et d'autres protocoles de flux vidéo/audio. Enfin, Normal-Service désigne tout protocole classique n'ayant aucun besoin particulier.

10.3.23. Correspondance Ttl

La correspondance TTL permet de sélectionner les paquets à partir de leur champ TTL ("Time To Live" ou durée de vie) localisé dans l'en-tête IP. Le champ TTL contient 8 bits de données, et il est décrémenté de 1 à chaque fois qu'il est traité par un hôte intermédiaire entre le client et l'hôte destinataire. Si le TTL atteint 0, un message ICMP type 11 code 0 (TTL égal à 0 pendant le transit) ou code 1 (TTL égal à 0 pendant le réassemblage) est transmis à l'expéditeur du paquet pour l'informer du problème. Cette correspondance est utilisée seulement pour sélectionner les paquets à partir de leur TTL, et non pour effectuer une modification quelle qu'elle soit. Ce comportement, soit dit en passant, s'applique à tout type de correspondance. Pour charger cette correspondance, vous devez ajouter -m ttl à la règle.

Tableau 10.31. Options de la correspondance Ttl

Correspondance --ttl-eq
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m ttl --ttl-eq 60
Explication Cette option de correspondance permet de spécifier la valeur TTL à sélectionner. Cette option requiert une valeur numérique et établit une correspondance avec cette valeur dans le paquet. Aucune inversion n'est disponible et il n'y a rien d'autre, en particulier, à sélectionner. Mais ceci peut être utile, par exemple, pour déboguer votre réseau local - c'est-à-dire les hôtes de votre LAN qui semblent présenter des problèmes de connexion avec un hôte sur Internet - ou pour trouver d'éventuelles entrées de chevaux de Troie, etc. Les possibilités de cette option sont relativement limitées, cependant son intérêt dépend essentiellement de votre imagination. Un exemple pourrait être de trouver des hôtes avec de mauvaises valeurs par défaut de TTL (pouvant être la conséquence d'un pile TCP/IP mal implémentée, ou simplement d'un défaut de configuration).
Correspondance --ttl-gt
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m ttl --ttl-gt 64
Explication Cette option sert à sélectionner un TTL plus grand que la valeur spécifiée. La valeur peut être comprise entre 0 et 255 et la correspondance ne peut pas être intervertie. Elle peut, par exemple sélectionner un TTL plus grand qu'une valeur spécifiée et ensuite la forcer vers une valeur standardisée. Elle peut être utilisée pour contourner certaines formes d'espionnage de la part des fournisseurs d'accès qui cherchent à savoir si vous avez plusieurs machines derrière un pare-feu, à l'encontre de leurs règlements.
Correspondance --ttl-lt
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A OUTPUT -m ttl --ttl-lt 64
Explication La correspondance --ttl-lt est utilisée pour sélectionner les TTL plus petits qu'une valeur spécifiée. C'est à peu près la même que --ttl-gt, mais sélectionne les TTL plus petits. Elle peut être utilisée également de la même façon que --ttl-gt, ou pour simplement homogénéiser les paquets quittant votre réseau en général.

10.3.24. Correspondance Unclean

La correspondance unclean ne prend aucune option et ne nécessite rien de plus qu'un chargement explicite si vous souhaitez l'utiliser. Notez que cette option est considérée comme expérimentale, qu'elle peut ne pas fonctionner en toutes circonstances et qu'elle ne prendra pas en charge tous les paquetages ou problèmes relatifs à unclean. La correspondance unclean tente de sélectionner les paquets qui paraissent malformés ou inhabituels, comme des paquets avec des en-têtes ou des sommes de contrôle (checksums) erronés. Elle peut être utilisée pour rejeter des connexions (avec la cible DROP) et pour rechercher les flux douteux par exemple. Cela dit, vous devez être conscient qu'il existe un risque d'interruption de connexions saines.