Tutoriel pour la configuration d'un script iptables

I./ Qu'est-ce qu'Iptables?

Vous ne le savez peut-être pas, mais iptables n'est pas le/un parfeux des systèmes GNU/Linux! En effet, le parfeux sous GNU/Linux, c'est netfilter.
Iptables n'est en fait qu'un langage de script, une "interface" en quelque sorte, pour configurer netfilter correctement. Il en existe d'autres. Nous pouvons citer par exemple Shorewall qui était par defaut sur les mandrake 9.2, 10.1; après je ne sais pas, j'ai utilisé iptables! Il existe également des interfaces graphiques qui permettent de configurer netfilter.
Netfilter est integré au noyau linux, ce qui implique parfois de le recompiler pour obtenir quelques options spécifiques. Il également interessant d'aller voir dans les nouveaux noyaux quelles sont les nouvelles options, ou celles qui peuvent nous interesser.
N'oubliez pas que si vous avez besoin d'aide, le man iptables est assez complet, et très compréhensible une fois qu'on a compris le fonctionnement d'iptables.

II./ Historique.

Iptables a été integré au noyau linux à partir de la version 2.4. Il est issu de la réecriture d'ipchains qui fonctionnait sur les noyaux de la serie 2.2. Ainsi, les commandes, tout du moins au début d'iptables, sont peu différentes.

III./ Fonctionnement général.

Pour bien configuer netfilter et créer un script performant, il faut comprendre le cheminement d'un paquet au coeur de netfilter. Introduisons d'abord le concept de tables.

1./ Les tables.

Netfilter fonctionne sous forme de tables. Chaque paquet va circuler dans ces tables qui contiennent des chaines de filtres. Ce sont ces chaines que nous nous efforcerons d'expliquer. Par defaut, il existe 3 tables : la table filter, la table nat, et la table mangle.

a./ La table filter.

Cette table sert à filtrer les paquets. L'utilisation principale de cette tables va donc être d'accepter (ACCEPT), de rejeter (REJECT), ou de détruire (DROP) les paquets que nous choisirons de filtrer. Remarquons au passage que nous commençons à introduire le vocabulaire des scripts iptables, et que l'emploie des majuscules pour ACCEPT, REJECT et DROP n'est pas une coquetterie!
Retenez que c'est l'endroit privilégié pour filtrer.

b./ La tables nat.

Cette table sert à faire de la traduction d'adresse réseau (Network Adress Translating). La tables NAT ne sert généralement pas à filtrer les paquets, bien que nous verrons que cela est possible. En effet, elle sert à faire passer un paquet par un autre chemin que le chemin normal. Des exemples d'utilisation sont le partage de connexion, la redirection de port, la redirection vers un serveur (par exemple si l'un de vos serveur web est en maintenance, vous pouvez envoyer tout ce qui est à destination du 80 vers un autre serveur....).
Les cibles de la tables NAT sont : DNAT, SNAT, MASQUERADE, REDIRECT.
La cibles DNAT sert à changer l'adresse de destination, SNAT pour changer l'adresse source, MASQUERADE s'utilise de la même façon que SNAT, et REDIRECT sert à changer le port de destination.

c./ La tables mangle.

Le rôle principal de cette tables est de modifier les paquets.
Les cibles de cette table sont par exemple : TOS, TTL, MARK...
Comme pour toutes les options, il est bien evidemment conseillé de lire les pages du man. Et pour les plus accrocs d'entre vous, un petit coup d'oeil dans les sources du kernel peu vous renseigner rapidement sur les nouveautées apportées.

2./ Parcours des tables.

Afin de pouvoir construire un firewall efficace, il est primordial de bien comprendre quel est le chemin des paquets dans les tables Iptables.

a./ Paquet à destination de la machine locale.

La première table qu'il traverse est la tables mangle, et la chaine utilisée est alors PREROUTING afin d'effectuer un changement des paquets des maintenant. Ensuite, le paquet traverse la table nat avec la chaine PREROUTING. C'est ici qu'il vous appartient de faire du FORWARD, sans filtrage préalable.
Si le paquet n'est pas forwardé, il traverse la chaine INPUT de la tables mangle. Cela permet de modifier le paquet après décision de routage, mais avant le processus sur la machine. La paquet passe ensuite dans la chaine INPUT de la tables filter. C'est ici que vous filtrez les paquets qui arrivent sur votre machine.
Enfin, le processus local qui a besoin du paquet le reçoit.

b./ Paquet issu de la machine locale.

Le paquet passe d'abord par la chaine OUTPUT de la table mangle. Ensuite, la tables nat est parcourue par le biais de la chaine OUTPUT. On peut ici faire du NAT sur des paquets sortant du parfeux.
La décision de routage a lieu. Le paquet n'est pas forwardé, il va dans la tables filter, par la chaine OUTPUT. Ici, la paquet est filtré. Notre paquet passe alors dans les tables mangle puis nat par la chaine POSTROUTING.
Il sort enfin de la machine sur le cable.

c./ Paquet destiné à être redirigé.

Cela correspond à ce que nous n'avons pas dit lorsque qu'il est écrit "si le paquet n'est pas forwardé...". Vous vous étiez bien sur demandé "mais que fait-il notre paquet forwardé?".
Ainsi, lorsque le paquet est redirigé avec nat, PREROUTING, celui ci va traverser mangle FORWARD, puis filter FORWARD (notez que j'écris le nom de la table en minusucle et celui de la chaine en majuscule. Cela parce que ce sera cette convention qui sera utilisée dans le script iptables.)

IV./ Construction d'un parfeux avec iptables.

Il serait maintenant tout à fait possible de vous dresser une liste des cibles et autres options pour chaque tables et chaines. Je pense néamoins qu'il est plus ludique de construire avec vous un exemple de parfeux fonctionnel avec un maximum d'options raisonnable pour la sécurité de votre installation informatique.
Le premier parfeux qui sera construit sera orienté desktop : ce qui est important à filter est ce qui vient d'internet. Ce qui sort de votre ordinateur sera jugé à priori relativement fiable (quoique...). Il n'y aura donc pas de partage de connexion, pas de redirection de ports, et autres astuces. Il n'y a qu'un interface reseau qui est connectée.
Le deuxième exemple de parfeux sera orienté passerelle/serveur. Nous présenterons à cette occasion le partage de connexion, et toutes les redirections les plus utilisées (ports, adresse source, adresse cible).

1./ Un parfeux de desktop.

Parfeux de desktop (Cliquez pour faire apparaitre le fichier)

Nous venons de faire une rapide présentation d'iptables et de quelques unes des principales règles.
Ce qui vient d'être présenté peut paraitre suffisant pour un ordinateur personnel connecté à internet. Les règles sont simples, et vous pourrez rapidement mettre en place votre parfeux.
Dans tous les cas, n'oubliez pas qu'il s'agit d'un script, et donc, n'hésitez pas à en utiliser la souplesse! Nous allons maintenant présenter un parfeux comprenant plus d'instruction. Il sera plus à destination de passerelle, ou de serveur. Mais naturellement, un grand nombre de règles peuvent être utilisées pour votre ordinateur personnel.

2./ Parfeux de passerelle/serveur. (ou utilisateur avancé/paranoïaque!)

Afin que vous puissiez lire agréablement ce paragraphe, il est nécessaire que vous ayez lu et compris les précédents. En effet, la structure d'iptables n'est pas compliquée, il suffit de l'avoir bien comprise. Ensuite, il faut avoir les idées nettes sur ce qu'on souhaite faire. Et enfin, il faut connaitre les fonctions d'iptables qui peuvent être utiles.
Nous aborderons ici la création de nouvelle chaine de vérifications, certaines redirection : partage de connexion, redirection de port en interne, redirection de port vers un serveur du lan. De plus, certaines règles serons données pour des limitations divers (nombre de paquets par minute, adresse source/cible, adresse mac source, spoofing, synflood...).

Parfeux de passerelle/serveur (Cliquez pour faire apparaitre le fichier)

Maintenant que vous avez construit votre script, il peut être interessant de regarder rapidement ce à quoi il peut ressembler. Pour cela, la commande iptables peut vous permettre d'afficher les différentes tables et chaines avec différents niveau de verbosité :
-L : liste classique
-L -t nat : liste la table nat
-v : affiche le nombre de paquets ayant transité dans chaque règle
-n : ne fait pas la correspondance de nom.

Positionnement et Statistiques Gratuites Ajoutez votre site Top des sites