IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Le filtrage avec iptables


précédentsommairesuivant

11. Correspondances iptables

Cette section permet d'approfondir les correspondances. Elles sont intentionnellement classées en cinq catégories distinctes. En premier, on trouve les correspondances génériques qui s'emploient avec toutes les règles. Ensuite, il y a les correspondances TCP qui ne s'appliquent qu'aux paquets TCP. De même, pour les correspondances UDP qui ne s'appliquent qu'aux paquets UDP, et les correspondances ICMP qui ne s'appliquent qu'aux paquets ICMP. Et à la fin, on décrit les correspondances spéciales, comme les correspondances d'état, de propriétaire, de limite, etc. Ces dernières correspondances sont réparties en autant de sous-catégories, même si elles ne se révèlent pas singulièrement si différentes. J'espère que cette répartition est suffisamment cohérente pour être compréhensible.

Comme vous l'avez peut-être déjà compris si vous avez lu les chapitres précédents, une correspondance est quelque chose qui spécifie une condition spéciale dans le paquet et qui doit être vraie (ou fausse). Une seule règle peut contenir plusieurs correspondances de cette sorte. Par exemple, nous voulons sélectionner des paquets issus d'un hôte spécifique sur notre réseau local, et seulement des ports particuliers sur cet hôte. Nous utilisons alors les correspondances qui indiquent la règle à appliquer à la cible - ou saut - sur les paquets qui ont une adresse source spécifique, arrivant sur l'interface connectée au réseau local et ces paquets doivent être sur un des ports spécifiés. Si une de ces correspondances est erronée (ex. l'adresse source est incorrecte, mais le reste est correct), la règle complète échoue et la règle suivante est testée sur le paquet. Si toutes les correspondances sont vraies, la cible spécifiée par la règle est appliquée.

11-1. Correspondances génériques

Les correspondances génériques désignent un type de correspondance toujours disponible, et ce quel que soit le protocole concerné ou les extensions de correspondances chargées. Autrement dit, ces correspondances ne requièrent aucun paramètre particulier. La correspondance --protocol a été délibérément incluse ici, bien qu'elle s'adresse spécifiquement aux protocoles. Par exemple, si vous désirez utiliser une correspondance TCP, vous devez appeler la correspondance --protocol et lui fournir TCP pour option. Pourtant, --protocol est également en elle-même une correspondance générique, puisqu'elle permet d'établir une correspondance avec des protocoles différents. Les correspondances suivantes sont donc toujours disponibles.

Tableau 10.1. Correspondances génériques

Correspondance -p, --protocol
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp
Explication Cette correspondance permet de vérifier le type de protocole, par exemple TCP, UDP ou ICMP. De plus, le protocole doit nécessairement soit faire partie des protocoles définis en interne comme TCP, UDP ou ICMP, soit prendre une valeur spécifiée dans le fichier /etc/protocols, ce qui, si elle ne s'y trouve pas, retourne une erreur. Le protocole peut aussi être entré sous forme d'un nombre entier. À titre d'exemple, le protocole ICMP est identifié par la valeur entière 1, TCP par la valeur 6 et UDP par 17. Enfin, le protocole peut aussi prendre la valeur ALL. ALL signifie tous, donc il établit une correspondance avec tous les protocoles TCP, UDP et ICMP. La commande accepte aussi une liste de protocoles séparés par des virgules, telle que udp,tcp qui permet d'établir une correspondance avec tous les paquets UDP et TCP. Si on désigne le protocole par la valeur zéro (0), ceci est équivalent à ALL, soit tous les protocoles, qui est aussi la valeur par défaut si la correspondance --protocol est omise. Cette correspondance peut également être inversée à l'aide du symbole !. Dans ce cas, --protocol ! tcp identifie les protocoles différents de TCP, et établit donc une correspondance avec UDP et ICMP.
Correspondance -s, --src, --source
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -s 192.168.1.1
Explication C'est la correspondance de source. Elle sert à sélectionner les paquets à partir de leur adresse IP source. La forme principale permet d'établir une correspondance avec des adresses IP uniques, telles que 192.168.1.1. Mais il est possible d'employer un masque réseau sous une forme binaire de type CIDR, en spécifiant le nombre de « 1 » dans la partie gauche du masque réseau. Par exemple, ajouter /24 signifie utiliser le masque réseau 255.255.255.0. Ainsi, un intervalle complet d'adresses IP peut être détecté, comme celui d'un réseau local ou d'un sous-réseau derrière un pare-feu. La commande ressemble alors à 192.168.0.0/24, qui établit une correspondance avec les paquets de l'intervalle 192.168.0.x. Une autre méthode consiste à utiliser un masque réseau ordinaire de la forme 255.255.255.255, ce qui donne finalement 192.168.0.0/255.255.255.0. On peut également inverser la sélection avec un ! comme précédemment. Ainsi, avec une correspondance du type --source ! 192.168.0.0/24, on établit une correspondance avec tous les paquets dont l'adresse source n'appartient pas à l'intervalle 192.168.0.x. Le comportement par défaut sélectionne toutes les adresses IP.
Correspondance -d, --dst, --destination
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -d 192.168.1.1
Explication La correspondance --destination est utilisée pour sélectionner les paquets à partir de leur(s) adresse(s) destination. Ceci fonctionne sensiblement comme la correspondance --source et avec la même syntaxe, excepté qu'on s'intéresse ici à la destination des paquets. Pour correspondre avec un intervalle d'adresses IP, on peut ajouter un masque réseau soit sous sa forme exacte, soit avec le nombre de 1 compris dans la partie gauche du masque réseau sous forme binaire. Voici des exemples : 192.168.0.0/255.255.255.0 et 192.168.0.0/24. Les deux sont parfaitement équivalents. Il est toujours possible d'inverser la sélection à l'aide du signe ! comme précédemment. --destination ! 192.168.0.1 établit une correspondance avec tous les paquets sauf ceux qui sont destinés à l'adresse IP 192.168.0.1.
Correspondance -i, --in-interface
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -i eth0
Explication Cette correspondance est destinée à sélectionner les paquets issus d'une certaine interface. Remarquez que cette option n'est autorisée que dans les chaînes INPUT, FORWARD et PREROUTING, et qu'elle retourne une erreur si elle est utilisée ailleurs. Si aucune interface n'est spécifiée, le comportement par défaut présuppose que le caractère + a été omis. Ce caractère permet d'établir une correspondance avec une chaîne de caractères (composée de lettres et chiffres). Un simple + stipule au noyau de reconnaître tous les paquets sans identifier leur interface d'origine. Le caractère + peut également être juxtaposé au type d'interface, donc eth+ désigne tous les périphériques Ethernet. Le sens de cette option peut être inversé à l'aide du symbole !. Une ligne dont la syntaxe est -i ! eth0 cherche à correspondre à toutes les interfaces d'entrée, sauf eth0.
Correspondance -o, --out-interface
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A FORWARD -o eth0
Explication La correspondance --out-interface permet de sélectionner les paquets en fonction de l'interface par laquelle ils sortent. Remarquez que cette correspondance n'est disponible que pour les chaînes OUTPUT, FORWARD et POSTROUTING, à l'opposé de la correspondance --in-interface. À part ça, elle fonctionne presque de la même façon. L'extension + traduit une correspondance avec des périphériques similaires, ainsi eth+ établit une correspondance avec tous les périphériques de type eth, et ainsi de suite. Pour inverser le sens de la sélection, utilisez le signe ! exactement comme pour la correspondance --in-interface. Si aucune interface de sortie n'est spécifiée avec --out-interface, le comportement par défaut accepte tous les périphériques, indépendamment de la direction prise par les paquets.
Correspondance -f, --fragment
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -f
Explication Cette correspondance est destinée à sélectionner le deuxième et le troisième fragment d'un paquet fragmenté. En fait, dans le cas d'un paquet fragmenté, il est impossible de connaître ni les ports source ou destination des fragments, ni les types ICMP, ni d'autres choses encore. Ainsi, les paquets fragmentés peuvent être utilisés dans des cas très particuliers pour organiser des attaques contre des ordinateurs. De tels fragments ne correspondent à aucune autre règle, ce qui a conduit à créer celle-ci. Cette option peut aussi être employée avec le symbole ! ; mais exceptionnellement ici, le signe ! doit précéder la correspondance, c'est-à-dire ! -f. Quand cette correspondance est inversée, elle sélectionne tous les fragments d'en-tête et/ou tous les paquets non fragmentés. Ceci signifie qu'on établit une correspondance avec tous les premiers fragments des paquets fragmentés, et pas avec les deuxièmes, troisièmes, et ainsi de suite. On établit aussi une correspondance avec les paquets qui n'ont pas été fragmentés pendant le transfert. Notez qu'il y a d'excellentes options de défragmentation dans le noyau, et qui peuvent se substituer à cette correspondance. Notez également que si vous utilisez le traçage de connexion, vous ne verrez aucun paquet fragmenté, puisqu'ils sont pris en compte avant d'atteindre les chaînes ou les tables dans iptables.

11-2. Correspondances implicites

Cette section se charge de décrire les correspondances chargées implicitement. Ces correspondances implicites sont sous-jacentes, acquises et automatiques. Par exemple, lorsqu'on établit une correspondance avec --protocol tcp sans autre critère. Il y a actuellement trois types de correspondances implicites pour trois protocoles différents : les correspondances TCP, les correspondances UDP et les correspondances ICMP. Les correspondances basées sur TCP contiennent un ensemble de critères uniquement valables pour les paquets TCP. De même pour les correspondances UDP et ICMP. D'un autre côté, il peut aussi y avoir des correspondances explicites, c'est-à-dire chargées explicitement. Les correspondances explicites ne sont ni sous-jacentes ni automatiques, vous devez obligatoirement les spécifier. Pour celles-ci, utilisez l'option -m ou --match, qui est abordée dans la section suivante.

11-2-1. Correspondances TCP

Ces correspondances sont dédiées à un protocole, et en l'occurrence elles sont seulement disponibles pour des paquets ou des flux TCP. Pour utiliser ces correspondances, vous devez ajouter --protocol tcp à la ligne de commande avant de vous en servir. Notez bien que --protocol tcp doit précéder (donc être situé à gauche) les correspondances spécifiques au protocole. Celles-ci peuvent être chargées implicitement de la même façon que peuvent l'être les correspondances UDP et ICMP. Les autres correspondances sont développées à la suite de cette section.

Tableau 10.2. Correspondances TCP

Correspondance --sport, --source-port
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp --sport 22
Explication La correspondance --source-port permet de sélectionner des paquets à partir de leur port source. Sans cela, on sous-entend tous les ports source. La correspondance accepte indifféremment un nom de service ou un numéro de port. Si vous spécifiez un nom de service, celui-ci doit figurer dans le fichier /etc/services, parce qu'iptables s'appuie sur ce fichier pour identifier le service. Si vous spécifiez le port par son numéro, la règle sera chargée légèrement plus vite, puisqu' iptables n'a pas à valider le nom du service. Cependant, la correspondance risque d'être un peu plus difficile à lire qu'avec un nom de service. Si vous écrivez une table de règles constituée de plus de 200 règles, vous devriez utiliser les numéros de port, car la différence devient sensible (sur une machine lente, ceci peut conduire à un écart de 10 secondes, si vous avez défini une table de règles contenant au moins 1000 règles). La correspondance --source-port permet aussi de sélectionner n'importe quel intervalle de ports. Par exemple, --source-port 22:80 établit une correspondance avec tous les ports source compris entre 22 et 80. Si vous omettez la spécification du premier port, le port 0 est implicitement considéré. Ainsi, --source-port :80 permet d'établir une correspondance avec les ports de 0 à 80. Et si vous omettez la spécification du dernier port, le port 65535 est considéré. Ainsi, --source-port 22: permet d'établir une correspondance avec tous les ports de 22 à 65535. Si vous intervertissez les ports de l'intervalle, iptables corrige automatiquement en réordonnant les numéros. Donc, écrire --source-port 80:22 est naturellement interprété --source-port 22:80. Une correspondance peut être inversée en ajoutant le symbole !. Par exemple, --source-port ! 22 signifie établir une correspondance avec tous les ports sauf le port 22. L'inversion peut s'appliquer aussi à un intervalle de ports, par exemple --source-port ! 22:80 qui établit une correspondance avec tous les ports sauf ceux de l'intervalle 22 à 80. Notez que cette correspondance n'accepte pas plusieurs ports ou intervalles de ports distincts. Pour plus d'informations sur cette possibilité, consultez l'extension de correspondance multiport.
Correspondance --dport, --destination-port
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p tcp --dport 22
Explication Cette correspondance permet de sélectionner des paquets TCP en fonction de leur port de destination. Elle s'appuie sur la même syntaxe que la correspondance --source-port. Elle comprend les spécifications de ports et d'intervalle de ports, ainsi que l'option d'inversion. De même, elle intervertit si nécessaire les premier et dernier ports dans la spécification d'intervalle, comme ci-dessus. Cette correspondance considère également par défaut les valeurs de ports de 0 et 65535 si les extrémités d'intervalle sont omises. En définitive, elle fonctionne exactement selon la même syntaxe que --source-port. Notez que cette correspondance n'accepte pas plusieurs ports ou intervalles de ports distincts. Pour plus d'informations sur cette possibilité, consultez l'extension de correspondance multiport.
Correspondance --tcp-flags
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
Explication Cette correspondance permet de sélectionner les paquets à partir de leurs fanions TCP. En premier, la correspondance nécessite une liste de fanions à tester (un masque) suivie de la liste des fanions qui doivent être positionnés à 1 (donc activés). Dans les deux listes, les fanions sont séparés par des virgules. La correspondance reconnaît les fanions SYN, ACK, FIN, RST, URG et PSH. Elle accepte aussi les mots ALL et NONE dont le sens est plutôt intuitif : ALL équivaut à tous les fanions et NONE à aucun. Typiquement, --tcp-flags ALL NONE vérifie tous les fanions TCP et établit une correspondance si aucun n'est activé (donc positionné à 1). Cette option peut également être inversée à l'aide du signe !. Par exemple, spécifier ! SYN,FIN,ACK SYN revient à faire correspondre les paquets qui possèdent les bits ACK et FIN activés, mais pas le bit SYN. Notez que la séparation des fanions par des virgules ne doit inclure aucune espace, comme vous pouvez le voir dans l'exemple ci-dessus.
Correspondance --syn
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -p tcp --syn
Explication La correspondance --syn est plus ou moins une relique du règne d'ipchains. Elle perdure pour garantir une certaine rétrocompatibilité et simplifier la transition vers iptables. Elle permet d'établir une correspondance avec des paquets s'ils possèdent le bit SYN activé et les bits ACK et RST désactivés. Cette commande se comporte rigoureusement comme la correspondance --tcp-flags SYN,RST,ACK SYN. Les paquets de ce type servent principalement aux demandes de connexion en provenance de serveurs. Si vous bloquez ces paquets, vous devriez effectivement empêcher toutes les tentatives de connexions entrantes. Toutefois, vous ne bloquerez pas les connexions sortantes, qui sont mises à profit aujourd'hui par de nombreux exploits (par exemple, détourner un service légitime pour installer localement un programme ou créer une liaison à partir d'une connexion existante sur votre hôte au lieu d'ouvrir un nouveau port). Cette correspondance peut également être inversée à l'aide du signe !. Ainsi, ! --syn correspond à tous les paquets ayant les bits RST ou ACK activés, autrement dit les paquets appartenant à une connexion déjà établie.
Correspondance --tcp-option
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -p tcp --tcp-option 16
Explication Cette correspondance permet d'établir une correspondance avec des paquets suivant leurs options TCP. Une option TCP identifie une partie spécifique de l'en-tête des paquets. Cette partie contient 3 champs différents. Le premier a une longueur de 8 bits et décrit les options utilisées dans ce flux ; le deuxième s'étend aussi sur 8 bits et précise la longueur du champ des options. L'information de longueur du champ doit son existence au caractère optionnel des options TCP. Pour être conforme aux standards, il n'est pas utile d'implémenter toutes les options, il suffit de les identifier. Si elles ne sont pas prises en charge, on lit seulement l'information de longueur afin de sauter par-dessus ces données. Cette correspondance permet de sélectionner plusieurs options TCP en fonction de leurs valeurs numériques. Elle peut également être inversée avec le signe !, de telle sorte que la correspondance s'établisse avec toutes les options TCP sauf celle passée en paramètre. Pour obtenir la liste complète des options, consultez le site Internet Engineering Task Force qui contient une liste de toutes les valeurs standard employées sur Internet.

11-2-2. Correspondances UDP

Cette section décrit les correspondances qui fonctionnent seulement avec des paquets UDP. Elles sont chargées implicitement lorsque la correspondance --protocol UDP est spécifiée et elles ne sont effectivement disponibles qu'après cette spécification. Notez que les paquets UDP ne sont pas orientés connexion, et par conséquent ils ne possèdent pas de fanions particuliers pour informer du rôle joué par le datagramme tel que l'ouverture ou la fermeture d'une connexion, ou encore le simple envoi de données. Les paquets UDP ne nécessitent aucun accusé de réception. S'ils s'égarent sur le réseau, ils n'engendrent aucune action (aucun message d'erreur de type ICMP n'est expédié). Autrement dit, il existe nettement moins de correspondances associées aux paquets UDP qu'aux paquets TCP. Notez que la machine d'état fonctionne sur tous les types de paquets, même si les paquets UDP et ICMP appartiennent à des protocoles sans connexion. La machine d'état fonctionne quasiment de la même façon pour les paquets UDP que pour les paquets TCP.

Tableau 10.3. Correspondances UDP

Correspondance --sport, --source-port
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p udp --sport 53
Explication Cette correspondance fonctionne exactement comme son équivalent TCP. Elle permet d'établir des correspondances avec des paquets à partir de leurs ports source UDP. Elle prend en charge les intervalles de ports, les ports uniques et les inversions de ports selon la même syntaxe. Pour spécifier un intervalle de ports UDP, vous pouvez utiliser 22:80 qui établit une correspondance avec les ports UDP de 22 à 80. Si le premier numéro est omis, il est considéré par défaut comme étant le port 0. Si le dernier numéro est omis, le port 65535 est pris par défaut. Si le port le plus grand est mis avant le plus petit, les numéros sont intervertis automatiquement. Dans le cas d'un port UDP unique, la syntaxe se calque sur l'exemple ci-dessus. Pour inverser la correspondance de port, il suffit d'insérer le signe !. Dans --source-port ! 53, la correspondance s'établit avec tous les ports sauf le numéro 53. Cette correspondance comprend les noms de service, du moment qu'ils sont disponibles dans le fichier /etc/services. Notez que cette correspondance n'accepte pas les ports et les intervalles de ports distincts. Pour davantage d'information, consultez l'extension de correspondance multiport.
Correspondance --dport, --destination-port
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p udp --dport 53
Explication Cette correspondance s'apparente fortement à --source-port décrite ci-dessus. Elle est aussi très proche de la correspondance TCP équivalente, sauf qu'elle s'applique aux paquets UDP. Elle établit une correspondance à partir du port destination UDP. Elle accepte les intervalles de ports, les ports uniques et les inversions. Pour sélectionner un port unique, vous pouvez utiliser par exemple --destination-port 53 ; pour l'inverser, ce sera plutôt --destination-port ! 53. La première commande sélectionne tous les paquets UDP en direction du port 53, alors que la seconde sélectionne tous les paquets sauf ceux destinés au port 53. Pour spécifier un intervalle de ports, utilisez par exemple --destination-port 9:19 pour établir une correspondance avec tous les paquets destinés aux ports UDP compris entre 9 et 19. Si le premier port est omis, on considère le port 0 par défaut. Si le second est omis, on considère le port 65535 par défaut. Si le port le plus grand est placé avant le plus petit, ils sont interchangés automatiquement pour que le plus petit port précède le plus grand. Notez que cette correspondance n'accepte pas les ports et intervalles de ports distincts. Pour plus d'informations, consultez l'extension de correspondance multiport.

11-2-3. Correspondances ICMP

Abordons maintenant les correspondances ICMP. Les paquets ICMP sont de nature éphémère, c'est-à-dire qu'ils ont une vie courte, plus courte que les paquets UDP dans le sens où ils sont sans connexion. Le protocole ICMP sert principalement aux messages d'erreur, aux contrôles de connexion, et d'autres choses du même acabit. ICMP n'est pas un protocole subordonné au protocole IP, mais plutôt qui enrichit le protocole IP et concourt à la gestion des erreurs. L'en-tête des paquets ICMP ressemble à celui des paquets IP, mais diffère sur certains aspects. La caractéristique primordiale de ce protocole provient du type d'en-tête, qui traduit la raison d'être du paquet. À titre d'exemple, si on tente d'accéder à une adresse IP inaccessible, on récupère normalement en retour un ICMP host unreachable (machine injoignable). Pour voir la liste complète des types ICMP, consultez l'annexe Types ICMPAnnexe C. Types ICMP. Une seule correspondance ICMP spécifique est disponible pour les paquets ICMP, et heureusement, elle devrait suffire. Cette correspondance est chargée implicitement quand on spécifie --protocol ICMP, et on en dispose automatiquement. Notez que toutes les correspondances génériques sont utilisables, et qu'elles permettent par exemple de sélectionner les adresses source et destination.

Tableau 10.4. Correspondances ICMP

Correspondance --icmp-type
Noyau 2.3, 2.4, 2.5 et 2.6
Exemple iptables -A INPUT -p icmp --icmp-type 8
Explication Cette correspondance permet de spécifier le type ICMP à sélectionner. Les types ICMP peuvent être définis soit par leur valeur numérique, soit par leur nom. Les valeurs numériques sont spécifiées dans le RFC 792. Pour afficher la liste complète des noms ICMP, exécutez la commande iptables --protocol icmp --help ou consultez l'annexe Types ICMPAnnexe C. Types ICMP. Cette correspondance peut être inversée en insérant le signe ! de cette façon : --icmp-type ! 8 ou --icmp-type 8/0. Pour une liste complète des noms, tapez iptables -p icmp -help.

Notez que netfilter utilise le type ICMP 255 pour sélectionner tous les types ICMP. Si vous essayez de sélectionner ce type ICMP, vous sélectionnerez tous les types ICMP.

11-2-4. Correspondances SCTP

SCTP ou Stream Control Transmission Protocol est une occurrence relativement nouvelle dans le domaine du réseau en comparaison des protocoles TCP et UDP. Le chapitre Caractéristiques SCTPCaractéristiques SCTP explique ce protocole en détail. Les correspondances implicites SCTP sont chargées en ajoutant la correspondance -p sctp à la ligne de commande de iptables.

Le protocole SCTP a été développé par certaines des plus grandes entreprises de télécommunication, et ce protocole est spécialement bien adapté pour les transactions simultanées importantes avec une haute fiabilité.

Tableau 10.5. Correspondances SCTP

Correspondance --source-port, --sport
Noyau 2.6
Exemple iptables -A INPUT -p sctp --source-port 80
Explication La correspondance --source-port est utilisée pour sélectionner un paquet SCTP basé sur le port source dans l'en-tête d'un paquet SCTP. Le port peut soit être un simple port, comme dans l'exemple ci-dessus, ou une série de ports spécifiés comme --source-port 20:100, ou il peut aussi être interverti par le signe !. Ça ressemble, par exemple, à --source-port ! 25. Le port source est un entier non signé de 16 bits, ainsi sa valeur maximale est 65535 et minimale 0.
Correspondance --destination-port, --dport
Noyau 2.6
Exemple iptables -A INPUT -p sctp --destination-port 80
Explication Cette correspondance est utilisée pour le port destination des paquets SCTP. Tous les paquets SCTP contiennent un port de destination, comme ils possèdent un port source, dans les en-têtes. Le port peut être soit spécifié comme dans l'exemple ci-dessus, ou avec une série de ports comme --destination-port 6660:6670. La commande peut également être intervertie avec le signe !, par exemple, --destination-port ! 80. Cet exemple sélectionne tous les paquets sauf ceux du port 80. On retrouve le même comportement avec les ports source et destination, le plus haut est 65535 et le plus bas 0.
Correspondance --chunk-types
Noyau 2.6
Exemple iptables -A INPUT -p sctp --chunk-types any INIT,INIT_ACK
Explication Cette correspondance est le type bloc du paquet SCTP. Il existe différents types bloc disponibles. Pour une liste complète, voir ci-dessous. La correspondance débute avec le mot-clé --chunk-types et continue avec un fanion indiquant si nous devons tout sélectionner, certains ou aucun. Après cela, nous spécifions les types bloc SCTP. Les types bloc sont présentés dans une liste séparée ci-dessous.
De plus les fanions peuvent aussi prendre certains fanions bloc. Ceci se fait, par exemple, avec la forme --chunk-types any DATA:Be. Les fanions sont spécifiques pour chaque type bloc SCTP et doivent être valides selon la liste ci-dessous.
Si une majuscule est utilisée, le fanion doit être placé, et si une minuscule est utilisée il ne doit pas être placé pour la correspondance. La correspondance complète peut être inversée avec le signe ! juste après le mot-clé --chunk-types. Exemple, --chunk-types ! any DATA:Be ne sélectionnera rien sauf cette forme.

Ci-dessous une liste des types bloc que la correspondance --chunk-types reconnaîtra.

Types bloc SCTP utilisés avec --chunk-types

  • ABORT
  • ASCONF
  • ASCONF_ACK
  • COOKIE_ACK
  • COOKIE_ECHO
  • DATA
  • ECN_CWR
  • ECN_ECNE
  • ERROR
  • HEARTBEAT
  • HEARTBEAT_ACK
  • INIT
  • INIT_ACK
  • SACK
  • SHUTDOWN
  • SHUTDOWN_ACK
  • SHUTDOWN_COMPLETE

Les fanions suivants peuvent être utilisés avec la correspondance --chunk-types comme vu ci-dessus. Selon la RFC 2960 - Stream Control Transmission Protocol tout le reste des fanions est réservé et non utilisé, et doivent être placés à 0. iptables ne contient pas actuellement de mesures pour renforcer ceci, heureusement, car il pourrait survenir d'autres problèmes, comme nous l'avons précédemment vu, quand ECN était implémenté dans le protocole IP.

Fanions bloc SCTP utilisés avec --chunk-types

11-3. Correspondances explicites

Les correspondances explicites doivent être chargées 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-unes 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.

11-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'informations 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 une 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.

11-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'informations :

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.

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.

11-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.

11-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.

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 a 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. La 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.

11-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'étatLa 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 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.
Les entrées valides pour cette correspondance sont :
  • INVALID
  • ESTABLISED
  • NEW
  • RELATED
  • SNAT
  • DNAT
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'étatLa machine d'état.
Elle peut aussi être inversée par le signe !. Exemple, -m conntrack ! --ctstatus ASSURED qui sélectionne tout sauf le statut ASSURED.
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.
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.

11-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.

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.

11-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 ont reçu un paquet avec un bit CE placé par un routeur. Le point limite place alors le ECE en renvoyant le 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.

11-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.

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, par exemple --hashlimit-mode dstip,dstport.

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é.

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.

11-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.

11-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.

11-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.

11-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.

  • 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.
  • 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/1000e de seconde.
  • 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.
  • Pour chaque tranche de 1/5e 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.
  • 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ée 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.txtLimit-match.txt composé d'une règle. Grâce à ce script, vous pouvez voir vous-même 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.

11-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é.

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 personnes 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 correspondance, 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.

11-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 4 294 967 296 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 quelque 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 4 294 967 296 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.

11-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.

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.

11-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 possibilité 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.txtSid-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.

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.

11-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/IPRappel 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.

11-3-18. Correspondance Realm

La correspondance realm est utilisée pour sélectionner les paquets basés sur le domaine de routage dont ils font partie. Les domaines de routage sont utilisés dans Linux pour les scénarios de routage complexes 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 ressources 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.

11-3-19. Correspondance Recent

La correspondance recent est un 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 renvoie 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 aperçu » dans la liste récente. Si la colonne dernier aperçu est plus ancienne qu'un certain nombre de secondes, la correspondance renvoie 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.txtRecent-match.txt.

En bref, c'est une pauvre variation de la machine d'état disponible dans netfilter. Cette version fut créée 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.

C'est une très mauvaise option 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ées 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.

  • 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.
  • 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.
  • 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.
  • À 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.
  • 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.
  • 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.
  • 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.

11-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'étatLa 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'étatLa machine d'état.

11-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 TCPAnnexe D. 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.

11-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 telle 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.

11-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'une 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.

11-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 mal formé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.

11-4. Prochain chapitre

Dans le prochain chapitre, nous parlerons des cibles en détail et ce qu'elles sont capables de faire. Vous y verrez les possibilités de développement de pare-feux de Linux.


précédentsommairesuivant

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