Avant propos:
Ne vous risquez pas à essayer ce que je décris ici si vous avez des tâches importantes en
cours.Certaines commandes décrites ici pourraient bloquer certaines applications sur votre machine le temps de votre session. Vous pourriez ne pas savoir tout de suite comment revenir en arrière. Egalement, si vous avez déjà un firewall sur votre machine, les scripts ci-dessous pourraient dérégler les règles de firewall que vous avez déjà établies. Donc prudence…)
Idem, si vous avez un réseau local chez vous, certains scripts ici peuvent en bloquer les connexions.
Le script évoqué ici concerne un poste unique, non connecté à un réseau local.
II – Iptables
Il existe un outil integré la plupart du temps dans le noyau Linux, c’est iptables (pour les noyaux 2.4 et 2.6).
Son administration s’effectue en ligne de commande et en root.
II.1 – Introduction
Il faut d’abord que vous compreniez le concept des tables et des chaînes sous iptables. Imaginez que vous ayez trois tables dans votre salle à manger. Sur chacune d’entre elles, vous avez des cartes qui concernent les routes de vos connexions.
A partir de maintenant, c’est vous qui déciderez des chemins qu’elles devront emprunter. Voyons tout d’abord une description de chaque table :
la table NAT. Elle ne nous concerne pas. Elle sert pour le routage (masquerading), c’est en quelque sorte une carte qui permet de définir des déviations pour certaines connexions, de leur dire quel chemin prendre, changer leur destination ou leur provenance. Elle sert par exemple pour le très populaire “partage de connexion Internet”.
la table MANGLE. Elle est rarement employée car elle concerne des fonctions avancées du firewall. Globalement, on dit que cette table concerne la modification des paquets. Elle permet de “marquer” les paquets ou modifier leur en-tête dans le but d’un routage avancé entre plusieurs interfaces, de gestion de bande passante et/ou par services (style ToS, QoS ou encore iproute).
la table FILTER. C’est celle qui nous intéresse. Elle permet de dire qui peut passer, et qui ne passera pas dans tel ou tel coin.
A chaque fois que nous utiliserons un script iptables ici, nous invoquerons cette table de cette manière :iptables -t filter
Avec -t comme table. Filter est la table utilisée par défaut si vous ne précisez rien en invoquant iptables. Vous pouvez donc tout simplement écrire “iptables” tout court si ça vous arrange, mais au moins ça peut vous faire prendre de bonne habitudes, et vous eviter des confusions si vous utilisez les autres tables à l’avenir.
Puis viennent les chaînes. C’est en quelque sorte les grands axes de votre carte de la table filter. Il ya en a trois :
La chaîne INPUT. C’est le grand axe des connexions entrantes sur votre machine, celles qui proviennent de l’extérieur.
La chaine OUTPUT. C’est l’axe des connexions sortantes et générées sur votre machine. Tout simplement, lorsque vous vous connectez sur un site Web, la connexion commence par une requête sortant de chez vous pour aller sur le site Web.
La chaine FORWARD, pour les connexions qui seront routées, c’est-à-dire les connexions que vous avez demandé de dévier.
Lorsque l’on invoque telle ou telle chaîne, on procède avec ce modèle :iptables -t <table> -Action <chaîne>
La table, c’est filter, l’action peut être -A , -I , -P ou -D (plus d’autres spécifiques dont on ne parlera pas), ce sont des choses que nous verrons plus loin. Et la chaîne, vous avez le choix entre les trois au dessus.
Ex :iptables -t filter -A INPUT (règle à définir)
II.2 – P comme Policy : Politique
Pour commencer, on établit une “politique” générale pour les trois chaîne de la table “filter” (la table qui filtre les paquets).
La politique, c’est la règle majoritaire, la règle par défaut pour une connexion qui concerne telle chaîne.
=> Si le Firewall ne trouve pas de règle pour cette connexion, alors il s’en remet à la politique de cette chaîne.
Pour configurer une politique on utilise cette syntaxe :iptables -t <table> -P <chaine> <politique>
(NB : La configuration qui suit ne vous concerne que si vous vous connectez à Internet via une interface ppp0.
Renseignez-vous bien sur votre propre configuration. Vous pouvez consulter vos interfaces et leur configuration avec la commande /sbin/ifconfig.)
Tout d’abord, pour faire un firewall basique qui bloque uniquement les connexions entrantes. On construit les politiques des trois chaînes de la table filter :iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD ACCEPT iptables -t filter -P OUTPUT ACCEPT
Les deux politiques que vous devez connaître sont “ACCEPT” et “DROP”.
Pour le premier, j’accepte les connexions, pour le second je ne laisse pas entrer les connexions.
Ici, les connexions sortantes ne seront pas filtrées. Ce n’est donc pas une configuration ultra-sécurisée mais pour bloquer les connexions entrantes. C’est déjà mieux que rien.
II.3 – A comme Append : Ajouter
Ensuite, nous allons laisser les applications qui utilisent la boucle locale s’éxécuter sans être bloquées. Car certaines applications utilisent les connexions TCP sur la boucle locale (127.0.0.1) pour s’éxécuter. On ajoute donc une règle pour la chaîne INPUT pour lui dire que les connexions en provenance de l’adresse de boucle locale et entrant vers l’interface locale seront acceptées :iptables -t filter -A INPUT -s 127.0.0.1 -i lo -j ACCEPT
Ici j’utilise -A pour signifier à iptables que je vais Ajouter une nouvelle règle.
Pour faire une brève traduction, on va décomposer cette ligne.
“-A INPUT” signifie qu’on va ajouter une règle dans la chaîne input. -s 127.0.0.1 signifie que cette nouvelle règle concerne les connexions en provenance de la boucle locale. -i lo pour dire que la règle concerne les connexions arrivant (-i interface entrante) vers l’interface locale désignée par “lo”. (Dans les autres interfaces que lo vous avez aussi eth0 pour l’interface ethernet, ppp0 pour l’interface d’un modem (internet) etc… eth0 et ppp0 peuvent aussi bien être eth1 ou ppp1 selon le nombre d’interfaces ethernet ou ppp que vous possédez). Et enfin -j ACCEPT pour préciser que la règle est d’accepter ces connexions.
Avec ce que vous avez là, vous risquez ne pas pouvoir surfer sur Internet car vous pouvez tenter d’accéder à un site Web, s’il vous répond, votre firewall le bloquera. On utilise pour cela un module appelé “state” qui comporte plusieurs options notamment celles qui nous intéresse : ESTABLISHED et RELATED. ESTABLISHED signifie grossièrement que la connexion analysée par le firewall a été vue dans l’autre sens précédemment.
Par exemple j’envoie une requête vers www.Telechargercours.com pour consulter la page d’acceuil.
Le firewall a vu passer une requête partant de chez moi pour aller vers CCM. CCM m’envoie une réponse. Ici, le firewall constatera que c’est moi qui ait commencé cette connexion, il considérera alors cette connexion comme “ESTABLISHED”. “RELATED” concerne de nouvelles connexions mais qui ont été initialisées par une connexion déjà existante et établie. Seul ce genre de connexions sera autorisé, ça nous donne donc :iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Pour traduire ces nouveaux éléments (je ne reviens pas sur ce que j’ai expliqué plus haut), ça nous donne :
-m state=> On charge le module state.–state ESTABLISHED,RELATED=> de ce module state, on spécifie les états ESTABLISHED et RELATED, donc seules les connexions de ce genre seront concernées par la règle.
Je récapitule donc l’ensemble des commandes pour écrire notre firewall :iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD ACCEPT iptables -t filter -P OUTPUT ACCEPT iptables -t filter -A INPUT -s 127.0.0.1 -i lo -j ACCEPT iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
II.4 – I comme Insert : Insérer
Cette action est semblable à l’action -A (Append) vue précédemment, à ceci près qu’il s’agit là “d’insérer” une règle dans la table de filtrage. Il faut savoir que les règles de filtrage sont parcourues dans un certain ordre lorsqu’un paquet est examiné. Attention : l’ordre des règles peut totalement changer le comportement du firewall !
Une règle définie avec -A va être simplement ajoutée à la suite des règles déjà établies dans la chaîne concernée.
Les règles définies avant seront donc prioritaires (si le paquet examiné correspond au descriptif d’une règle, les règles suivantes ne seront alors pas utilisées).
Une règle “insérée” avec -I va se placer au tout début des règles de la chaîne au lieu de s’ajouter après. Cette règle va donc logiquement déplacer toutes les autres “vers le bas”. Elle sera prioritaire sur toutes les autres.
Cette action est généralement utilisée dans des cas précis, par exemple si on doit soudainement bloquer ou autoriser un service, et ce, malgré les règles du firewall définies au départ.
On peut également insérer une règle à un emplacement précis (voir la page de manuel) avec -I.
II.5 – L comme List : Lister
Pour lister, consulter les règles de votre firewall :iptables -t filter -L
Regardons ce bilan. Avec ça, vous avez un petit firewall basique pour la plupart des configurations monopostes avec modem ADSL connecté par USB par exemple (peut être même, pour les modems bas débits). Je dis firewall basique car, je le répète, il ne pose aucune restriction pour les connexions sortantes. De plus, il n’est pas adapté si vous avez un serveur, ou une application à l’écoute sur un port . Par exemple si vous avez un serveur http, il vous faudra probablement débloquer le port 80.
Pour ouvrir le port tcp 80 aux connexions entrantes:iptables -A INPUT -p tcp --dport 80 -j ACCEPT
II.6 – D comme Delete : Effacer
On vient de voir que vous pouviez faire un faire un bilan en utilisant l’argument -L. Il se peut que vous vouliez effacer une règle.
Par exemple, je n’ai plus besoin de mon serveur Http pour aujourd’hui, je vais masquer le port 80, puisque je n’ai plus d’application à l’écoute sur ce port. Donc, je vais effacer la règle d’autorisation de connexion sur le port TCP 80.
C’est la politique de ma chaîne INPUT qui prendra le relais avec cette règle par défaut que nous avons définie plus haut => DROP.
On utilisera alors l’argument -D avec cette syntaxe :iptables -t <table> -D <chaîne> <n de la règle à effacer>
Alors on va devoir trouver le n de notre règle. Pour celà on utilise la commande “iptables -t filter -L” qui nous
donne :Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT all -- localhost.localdomain anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:www Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
On y retrouve nos politiques et les règles des chaînes. Pour la chaine INPUT, ma première règle, c’est d’acceptertout ce qui vient de “partout” tant que la connexion est “ESTABLISHED” ou “RELATED”.
En 2, j’ai “accepter les connexions en provenance de localhost”.
Et en 3, j’ai “accepter toutes les connexions sur le port “www”, c’est à dire le port 80.
C’est donc la règle 3 de la chaîne INPUT qui nous concerne. Pour la supprimer on tape :iptables -t filter -D INPUT 3
Votre Firewall ne trouvera plus de règle pour les connexions vers le port TCP 80, il s’en remettra ainsi à la politique d’INPUT qui est DROP, donc les connexions seront refusées.
Et voilà :-)
II.7 – F comme Flush : Nettoyer
Si vous voulez remettre à zéro votre firewall, et lui demander de ne bloquer aucune connexion (configuration par défaut généralement) il faut taper :# Pour vider les règles de toute la table "filter" iptables -t filter -F # Pour que les politiques acceptent les connexions iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
Sources et documents largements plus complets :
How-to du site officiel www.netfilter.org/documentation/HOWTO/fr/packet-filtering-HOWTO.html
Un autre How-To en français (merci à kameo pour le lien) www.nbs-system.com/article/iptables_howto
Pages du manuel d’iptables => man iptables (à taper dans un shell)
III – Les alternatives
Il existe beaucoup de logiciels qui pourront faciliter l’administration de votre firewall, bien souvent (si ce n’est toujours ?) des front-end pour iptables, c’est à dire des interfaces qui rendent plus facile la configuration d’iptables. Shorewall Kmyfirewall Firestarter (Voir cet article) Vuurmuur
(Sources : quelques discussions ça et là dans le forum GNU/Linux