Ce chapitre décrit la façon dont les paquets traversent les
différentes chaînes, et dans quel ordre. De même, il explique
l'ordre dans lequel les tables sont traversées. Vous percevrez
l'importance de ce fonctionnement plus loin, lors de l'écriture de
vos propres règles. D'autres points seront examinés, liés à des
éléments dépendants du noyau, car ils entrent également en
considération dans ce chapitre. Entre autres, les différentes
décisions de routage. C'est particulièrement utile si vous voulez
écrire des règles pour iptables qui peuvent modifier les
consignes/règles de routage des paquets, c-à-d. pourquoi et comment
les paquets sont routés; le DNAT et le SNAT sont des exemples
caractéristiques. Bien sûr, il ne faut pas oublier les bits de
TOS
.
Quand un paquet arrive pour la première fois dans un pare-feu, il rencontre le niveau matériel, puis il est recueilli par le pilote de périphérique approprié au sein du noyau. Ensuite, le paquet enchaîne une succession d'étapes dans le noyau, avant d'être envoyé à l'application adéquate (localement), ou expédié à un autre hôte - ou quoi que ce soit d'autre.
D'abord, analysons un paquet destiné à la machine locale. Il enchaîne les étapes suivantes avant d'être réellement délivré à l'application qui le reçoit :
Tableau 6.1. Hôte local destinataire (votre propre machine)
Étape | Table | Chaîne | Commentaire |
---|---|---|---|
1 | Sur le câble (ex. Internet) | ||
2 | Arrive sur l'interface (ex. eth0) | ||
3 | raw | PREROUTING | Cette chaîne sert normalement à
modifier les paquets, i.e. changer les bits de TOS , etc. |
4 | Lors du contrôle de code de connexion comme indiqué dans le chapitre La machine d'état. | ||
5 | mangle | PREROUTING | Chaîne principalement utilisée pour modifier les paquets, i-e, changement de TOS, etc. |
6 | nat | PREROUTING | Cette chaîne sert principalement au
DNAT . Évitez de filtrer dans cette
chaîne puisqu'elle est court-circuitée dans certains cas. |
7 | Décision de routage, i.e. le paquet est-il destiné à notre hôte local, doit-il être réexpédié et où ? | ||
8 | mangle | INPUT | Ici, il atteint la chaîne INPUT de la table mangle. Cette chaîne permet
de modifier les paquets, après leur routage, mais avant qu'ils
soient réellement envoyés au processus de la machine. |
9 | filter | INPUT | C'est l'endroit où est effectué le filtrage du trafic entrant à destination de la machine locale. Notez bien que tous les paquets entrants et destinés à votre hôte passent par cette chaîne, et ceci quelle que soit leur interface ou leur provenance d'origine. |
10 |
Processus/application local (i.e. programme client/serveur) |
Remarquez que cette fois, le paquet est transmis à travers la
chaîne INPUT
au lieu de la chaîne
FORWARD
. C'est parfaitement
logique. Et c'est certainement la seule chose logique à vos yeux
dans le parcours des tables et des chaînes pour le moment, mais si
vous continuez d'y réfléchir, vous trouverez ceci de plus en plus
clair au fur et à mesure.
À présent, analysons les paquets sortant de notre hôte local et les étapes qu'ils enchaînent.
Tableau 6.2. Hôte local source (votre propre machine)
Étape | Table | Chaîne | Commentaire |
---|---|---|---|
1 | Processus/application local (i.e. programme client/serveur) | ||
2 | Décision de routage. Quelle adresse source doit être utilisée, quelle interface de sortie, et d'autres informations nécessaires qui doivent être réunies. | ||
3 | raw | OUTPUT | C'est l'endroit où le traçage de connexion prend place pour les paquets générés localement. Vous pouvez marquer les connexions pour qu'elles ne soient pas tracées par exemple. |
4 | C'est ici que le traçage de connexion se situe pour les paquets générés localement, par exemple les changements d'état, etc. Voir le chapitre La machine d'état pour plus d'information. | ||
5 | mangle | OUTPUT | C'est là où les paquets sont modifiés. Il est conseillé de ne pas filtrer dans cette chaîne, à cause de certains effets de bord. |
6 | nat | OUTPUT | Cette chaîne permet de faire du NAT sur des paquets sortant du pare-feu. |
7 | Décision de routage, comment les modifications des mangle et nat précédents peuvent avoir changé la façon dont les paquets seront routés. | ||
8 | filter | OUTPUT | C'est de là que les paquets sortent de l'hôte local. |
9 | mangle | POSTROUTING | La chaîne POSTROUTING de la table mangle est
principalement utilisée lorsqu'on souhaite modifier des paquets
avant qu'ils quittent la machine mais après les décisions de
routage. Cette chaîne est rencontrée d'une part par les paquets qui
ne font que transiter par le pare-feu, d'autre part par les paquets
créés par le pare-feu lui-même. |
10 | nat | POSTROUTING | C'est ici qu'est effectué le
SNAT . Il est conseillé de ne pas
filtrer à cet endroit à cause des effets de bord, certains paquets
peuvent se faufiler même si un comportement par défaut a été défini
pour la cible DROP. |
11 | Sort par une certaine interface (ex. eth0) | ||
12 | Sur le câble (ex. Internet) |
Dans cet exemple, on suppose que le paquet est destiné à un autre hôte sur un autre réseau. Le paquet parcourt les différentes étapes de la façon suivante :
Tableau 6.3. Paquets redirigés
Étape | Table | Chaîne | Commentaire |
---|---|---|---|
1 | Sur le câble (ex. Internet) | ||
2 | Arrive sur l'interface (ex. eth0) | ||
3 | raw | PREROUTING | Ici vous pouvez placer une connexion qui ne sera pas interprétée par le système de traçage de connexion. |
4 | C'est ici que le traçage de connexion généré non-localement prend place, nous verrons celà dans le chapitre La machine d'état. | ||
5 | mangle | PREROUTING | Cette chaîne est typiquement utilisée
pour modifier les paquets, i.e. changer les bits de TOS , etc. |
6 | nat | PREROUTING | Cette chaîne sert principalement à
réaliser du DNAT . Le SNAT est effectué plus loin. Evitez de filtrer
dans cette chaîne car elle peut être court-circuitée dans certains
cas. |
7 | Décision de routage, c-à-d. le paquet est-il destiné à votre hôte local, doit-il être redirigé et où ? | ||
8 | mangle | FORWARD | Le paquet est alors envoyé à la chaîne
FORWARD de la table mangle. C'est
utile pour des besoins très spécifiques, lorsque l'on souhaite
modifier des paquets après la décision de routage initiale, mais
avant la décision de routage finale effectuée juste avant l'envoi
du paquet. |
9 | filter | FORWARD | Le paquet est routé vers la chaîne
FORWARD . Seuls les paquets
réexpédiés arrivent ici, et c'est ici également que tout le
filtrage est effectué. Notez bien que tout trafic redirigé passe
par ici (et pas seulement dans un sens), donc vous devez y
réfléchir en rédigeant vos règles. |
10 | mangle | POSTROUTING | Cette chaîne est employé pour des formes particulières de modification de paquets, que l'on veut appliquer postérieurement à toutes les décisions de routage, mais toujours sur cette machine. |
11 | nat | POSTROUTING | Cette chaîne est employée principalement pour le SNAT. Évitez de faire du filtrage ici, car certains paquets peuvent passer cette chaîne sans être vérifiés. C'est aussi l'endroit où l'on fait du masquerading (masquage d'adresse). |
12 | Sort par l'interface de sortie (ex. eth1). | ||
13 | Sort de nouveau par le câble (ex. LAN). |
Comme vous pouvez le constater, il y a de nombreuses étapes à
franchir. Un paquet peut être arrêté dans n'importe quelle chaîne
d'iptables, et même
ailleurs s'il est malformé. Pourtant, il est intéressant de se
pencher sur le sort du paquet vu par iptables. Remarquez qu'aucune
chaîne ou table spécifique n'est définie pour des interfaces
différentes, ou quoi que ce soit de semblable. La chaîne
FORWARD
est systématiquement
parcourue par les paquets qui sont redirigés par l'intermédiaire de
ce pare-feu/routeur.
Attention | |
---|---|
N'utilisez pas la chaîne |
Maintenant, vous avez découvert comment les différentes chaînes sont traversées selon trois scénarios distincts. On peut en donner une représentation graphique :
Pour être plus clair, ce dessin mérite quelques explications. Si
un paquet atteignant la première décision de routage n'est pas
destiné à la machine locale, il sera orienté vers la chaîne
FORWARD
. En revanche, s'il est
destiné à une adresse IP
que la
machine écoute, ce paquet sera envoyé vers la chaîne INPUT
, et donc à la machine locale.
Il est important de remarquer que même si des paquets sont
destinés à la machine locale, leur adresse de destination peut être
modifiée à l'intérieur de la chaîne PREROUTING
par une opération de NAT
. En effet, puisque ceci a lieu avant la
première décision de routage, le paquet ne sera examiné qu'après un
éventuel changement. A cause de cette particularité, le routage
peut être altéré avant que la décision de routage ne soit prise.
Notez bien que tous les
paquets transiteront par l'un ou l'autre des chemins de ce dessin.
Si vous réalisez du DNAT
sur un
paquet pour le renvoyer sur le réseau duquel il provient, il
continuera malgré tout sa route à travers les chaînes restantes
jusqu'à ce qu'il retourne sur le réseau externe.
Astuce | |
---|---|
Si vous pensez avoir besoin d'informations supplémentaires, vous pouvez utiliser le script rc.test-iptables.txt. Ce script de test devrait vous procurer des règles suffisantes pour expérimenter et comprendre de quelle façon les tables et les chaînes sont traversées. |