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

10.2.1. Correspondances TCP

Ces correspondances sont dédiées à un protocole, et en l'occurence 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, comme 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'information 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'information 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étro-compatibilité 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.

10.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 disponible 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électionnne 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'information, consultez l'extension de correspondance multiport.

10.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 à celle 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. A 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 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és 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 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.

[Note] Note

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 le types ICMP.


10.2.4. Correspondances SCTP

SCTP ou Stream Control Transmission Protocol est une occurence relativement nouvelle dans le domaine du réseau en comparaison des protocoles TCP et UDP. Le chapitre Caracté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 un 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