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

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