Linux - Installation d'un Firewall

Décembre 2016


Installation d'un Firewall sous Linux




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. Également, 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.

Il existe plusieurs façons de configurer un pare-feu sous Linux.

Iptables


Il existe un outil intégré 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.

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 bonnes habitudes et vous éviter 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 y 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 chaîne 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 chaîne 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)

P comme Policy : Politique


Pour commencer, on établit une "politique" générale pour les trois chaînes 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 ACCEPT : j'accepte les connexions ; pour DROP : 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.

A comme Append : Ajouter


Ensuite, nous allons laisser les applications qui utilisent la boucle locale s'exécuter sans être bloquées. Car certaines applications utilisent les connexions TCP sur la boucle locale (127.0.0.1) pour s'exé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.commentcamarche.net] pour consulter la page d'accueil.
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

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.

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

D comme Delete : Effacer


On vient de voir que vous pouviez 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 chaîne INPUT, ma première règle, c'est d'accepter tout 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à :-)

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

Cela rendra votre système vulnérable bien évidemment, mais rendra la configuration par défaut si vous n'aviez appliqué aucun firewall avant de tester ces scripts.

Sources et documents largement plus complets :

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.
(Sources : quelques discussions ça et là dans le forum GNU/Linux :-)

A voir également :

Ce document intitulé «  Linux - Installation d'un Firewall  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.