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.
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. A 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 au final 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ée
à 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. A
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épendemment 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. |