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.
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. |
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. |
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
|
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
-
DATA - U ou u pour Unordered bit, B ou b pour Beginning fragment bit et E ou e pour Ending fragment bit.
-
ABORT - T ou t pour TCB destroy flag.
-
SHUTDOWN_COMPLETE - T ou t pour TCB destroyed flag.