Table des matières

Guide d'utilisation de Netfilter_cfg

Olivier ALLARD-JACQUIN

Version 0.5.8alpha3 - 11 mars 2004

PLAN :

Le but de ce programme est de configurer le firewall intégré aux kernels Linux 2.4 et supérieurs appelé "netfilter".
Le principal outil pour configurer ce firewall est la commande "iptables" qui doit être lancée en temps que root.

Vous trouverez la dernière version de ce document :

I Téléchargement

La licence de ce programme et de sa documentation est évidement la GPL

La dernière version de "Netfilter_cfg" est la 0.5.8

Vous pouvez télécharger d'autres versions plus anciennes ici :

II Historique

Après de nombreuses années à entendre parler et à survoler de très haut le problème du firewall sous Linux, je me suis finalement décidé à y regarder de plus près, et à me plonger dans la documentation.

On appelle "firewall" (littéralement "mur de flammes" en français) tout ce qui touche au filtrage des connexions sur un ordinateur ou un réseau. Plutôt que de laisser des transmissions réseaux se faire dans tout les sens, et donc qu'une personne extérieur au réseau interne puisse récupérer des informations dont il n'est pas supposé pouvoir accéder, le firewall est là pour contrôler les flux de données, interdire et éventuellement enregistrer (on utilise le terme de "log" en anglais) les flux non autorisés ou "bizarres".

L'approche des techniques de firewall de Linux est très différente de ce que l'on peut trouver dans un OS largement connu comme Windows®. Contrairement à cet OS, et notamment à sa dernière monture (en 2003) appelée "Windows XP®", le firewall Linux est intégré directement dans le coeur de l'OS, au plus près des fonctions réseau du système.

Il en résulte que :

Ainsi est donc né "netfilter_cfg". Ce script / programme ne se veut pas révolutionnaire, ou exceptionnel, mais uniquement pratique et le plus facilement modifiable, adaptable, et utilisable possible.

Enfin, ce script a principalement été pensé dans le cadre d'une utilisation non permanente à Internet, via un modem par exemple ou par une connexion intermittente à l'ADSL. De plus, possédant plusieurs cartes réseaux et adresses IP locales, j'ai voulu écrire un script qui soit le plus adaptable à des configurations "bizarres".

Cela explique donc certains choix techniques, et notamment que ce script doit être exécuté à chaque fois que la connexion Internet est activée. Un des gros intérêt de ce script est qu'il détecte automatiquement l'état de la connexion à Internet, et qu'il se configure automatiquement en conséquence, sans attendre de la part de l'utilisateur un paramétrage quelconque ...

A noter que dans ce document je parle principalement du firewall, mais que le rôle de netfilter ne se résume pas qu'à ceci. Cette couche du kernel Linux sert aussi au NAT (Network Adress Translation), au marquage des paquet (la table "Mangue"), et à plein d'autres choses ...

Enfin, je suis l'auteur d'un autre document ayant pour sujet Netfilter et les mesures de protections à prendre afin de protéger sa machine ou son réseau local. Il s'agit d'un tutoriel que j'ai écris en parallèle à une conférence que j'ai présenté dans le cadre de l'association Guilde, le 2 juillet 2003. Vous y trouverez un grand nombre d'informations, tant destinées aux néophytes qu'aux utilisations plus complexes, qui vous aiderons à mieux comprendre l'utilisation et le fonctionnement de "netfilter_cfg".

III Philosophie générale de filtrage

Les capacités de filtrage de ce programme se veulent les plus simples possibles (sans pour autant transformer votre machine en gruyère en terme de sécurité), aussi :

Certains utilisateurs Windows® vont sans doute trouver ce dernier point aberrant, mais je justifie ce choix par 2 choses :

Quoi qu'il en soit, je conçois que l'utilisateur venant du monde Windows® éprouve certaines craintes vis à vis du comportement de ses logiciels. Une prochaine version de ce script rajoutera donc un niveau de protections supplémentaires, et permettra de limiter les connexions à destination d'Internet.

Les conséquences de ces règles de filtrages sont :

IV Configuration du programme

Avant d'utiliser ce programme, il va falloir tout d'abord que vous le configuriez. Et pour cela, il va falloir que vous modifiez son code source... Ce n'est pas en soit très très difficile, il suffit d'avoir quelques notions de base du langage utilisé : le "sh" / "bash".

Les modifications du code source doivent se limiter à la première partie du script, où sont déclarées les variables globales de celui-ci. Si vous modifiez la suite du programme, vous le faite à vos risques et périls...

Par convention :

IV-1 Configuration du réseau local

Le script gère autant de réseaux locaux que vous en avez. Vous pouvez avoir plusieurs cartes réseaux sur votre machine, et / ou plusieurs adresses IP par carte réseau. Pour chaque réseau que vous avez déclarés dans votre configuration de Linux, vous devez rajouter une ligne de type :

LAN[<un nombre>]="<Interface>|<Adresse IP>|<Masque de sous réseau>|<Adresse de broadcast>|<Adresse de la passerelle>|<Options>"

Exemple :

LAN[0]="eth0|192.168.0.1|255.255.255.0|192.168.0.255||routable:dhcp_server"
LAN[1]="eth0|192.168.1.1|255.255.255.0|192.168.1.255||routable"
LAN[2]="eth0|192.168.2.1|255.255.255.0|192.168.2.255||non_routable"
LAN[3]="eth1|62.147.73.23|255.255.255.0|62.147.73..255||non_routable:degroupe"

Dans cette exemple :

En général, vous n'avez qu'une seule carte réseau local, donc cela devrait aller assez vite à configurer. Utilisez les commandes "ifconfig" en temps que root ou "/sbin/ifconfig" en temps qu'utilisateur simple afin de remplir à ces informations.

Dans une prochaine version de ce programme, je rajouterai un module de détection automatique de la configuration réseau ce qui évitera de configurer cette partie là du script...

IV-2 Debug

Ce programme peut afficher ou sauver dans un fichier des messages d'informations, permettant de trouver plus facilement des erreurs de paramétrage. C'est ce que l'on appellera par la suite le debug.

Si vous ne voulez pas vous ennuyer, laissez les valeurs par défaut, et passez à la suite...

IV-3 Log

Lorsque "Netfilter" n'arrive pas à trouver une règles l'autorisant à laisser passer un paquet de données, et parce qu'il est configuré comme ceci par ce programme, Netfilter les détruit impitoyablement. Mais auparavant, il peut stocker cette information via un mécanisme de "log" (on peut traduire cette action par l'anglicisme barbare "logger").

La technique de log utilisé est défini par la variable "LOG_TYPE=<LOG|ULOG|NO_LOG>"

Si vous ne voulez pas vous ennuyer, laisser les valeurs par défaut, et passez à la suite...

Astuce : Un moyen très pratique de visualiser un fichier de log en temps réel est la commande : tail -f <le nom du fichier>

Par exemple :

[root@phoenix /]# tail -f /var/log/messages

Laissez cette commande s'exécuter dans un terminal, elle affichera en temps réel les modifications du fichiers "/var/log/messages". Ainsi, vous verrez immédiatement les connexions qui sont refusées par le firewall.

Les autres variables pour le log sont "LOG_PREFIX=" et "LOG_LOG_LEVEL=". Ce n'est pas très important, regardez dans le code source pour avoir plus d'informations...

IV-4 Paramètres du programme

A priori, vous n'êtes pas supposé changer cette partie là, sauf si vous voulez modifier le comportement par défaut du programme. Comme vous le verrez plus tard, le programme peut se lancer en lui fournissant des paramètres, afin de le configurer suivant vos besoins.

Les différents paramètres du programme se trouvent dans la section "WAITING_PARAMETERS". Chaque ligne correspond à un paramètre que sait gérer "netfilter_cfg". Par exemple, on trouve le paramètre WAITING_PARAMETERS[3]="--nat|on|off|off", ou --nat est le paramètre.

C'est la dernière valeur de chaque ligne (après le dernier "|") qui définie la valeur par défaut. Il faut que ce soit une des précédentes valeurs (sauf la première, évidement).

Par exemple, pour 'WAITING_PARAMETERS[1]="--drop-rules|on|off|on"', le paramètre "--drop-rules" attend 2 valeurs possibles : "on" et "off". Et par défaut, c'est à dire si ce paramètre n'est pas passé au programme, ou si il est passé sans "on" ou "off", c'est la valeur "on" qui sera utilisé.

Un conseil tout simple : N'y touchez pas, les options par défaut vont satisfaire tout le monde dans la majorité des cas... Smiley

IV-5 Règles de rejet systématique

Lorsque vous êtes connectés sur Internet, une grand quantité de trafic va faire réagir votre firewall, et lui faire remplir le fichier de log. C'est notamment le cas de l'activité "peer-to-peer", comme "kazaa", "edonkey", "emule", et autres logiciels de ce genre.

Il peut être donc intéressant de ne pas logger ce type de connexions entrantes, en même temps que de les ignorer. C'est le but du paramétrage "DROP" ("rejeter" en Français) :

DROP[<un nombre>]="<Chaîne>|<Interface>|<Source>|<Cible>|<Type de connexion>|<Port source>|<Port cible>"

Exemples d'utilisation :

DROP[0]="INPUT|ppp0|||tcp||4660:4700"
DROP[1]="INPUT|ppp0|||udp||4660:4700"

Ces 2 règles permettent de supprimer tout les paquets de type P2P venant ("INPUT") d'Internet ("ppp0"), quelque soit leur adresses IP source ou destination ("|||"), de type "tcp" ou "udp" (et donc pas du type "icmp"), quelque soit leur port source ("||"), et à destination des ports compris entre "4660" et "4700" ("4660:4700").

Comment rajouter de nouvelles règles de rejet ? C'est très simple : Vous lancez votre firewall, et vous regardez de temps en temps votre fichier de log. Si vous voyer qu'il se remplit de messages de connexion d'un type particulier (faites plus précisément attention au port cible), vous pouvez rajouter une règle de rejet.

Par exemple :

DROP[0]="INPUT|ppp0|||tcp||139"
DROP[1]="INPUT|ppp0|||udp||137"

permet d'éliminer les requêtes NETBIOS faites par des "vilains pirates" qui veulent accéder à vos répertoires partagés Windows® ou Samba.

IV-6 Paramétrages particuliers pour les serveurs

A priori, vous n'êtes pas intéressé par ce chapitre. Il s'agit des options permettant de laisser passer des paquets de données à destination de divers serveurs que vous avez pu installer sur votre ordinateur, et dont vous voulez laisser l'accès à Internet.

Hoouu la la, vous êtes sûr que vous avez fait cela ??? Z'êtes pas fou, non ? Smiley. Bon, commençons par voir comment paramétrer l'accès à ces serveurs, puis nous verrons un peu plus loin comment indiquer à "netfilter_cfg" de laisser ces serveurs accessibles depuis Internet.

IV-6-1 Tactical Ops

C'est un jeu se jouant en réseau local ou sur Internet. Ces options permettent de configurer les fonctions de serveur sur Internet.

IV-6-2 Serveur FTP

Si vous avez un serveur FTP, que vous voulez rendre accessible depuis Internet.

IV-6-3 Serveur HTTP/HTTPS

Si vous faite tourner un serveur web avec des pages encodées (HTTPS <=> port 443) ou non (HTTP <=> port 80).

IV-6-4 Serveur SSH (Secure SHell)

Cette option configure le firewall pour rendre un serveur SSH (un shell utilisateur) accessible depuis Internet.

IV-6-5 Serveur Jabber

Jabber est un système de client/serveur de discussion (chat) sur Internet. Le modèle est quelque peu particulier, car les serveurs Jabber sont distribués sur Internet, et n'importe quel machine connecté à Internet peut serveur Jabber. Si vous hébergez un serveur Jabber sur votre machine, il vous faudra ouvrir 2 ports.

IV-6-6 Autres serveurs

Pour l'instant, je n'ai pas prévu de nouvelles extensions pour serveurs. Mais c'est tout à fait faisable d'en rajouter de nouvelles. Je vous laisse donc le soin de les rajouter vous-même, à moins que vous ne m'en fassiez la suggestion ... Après tout, la licence GPL est faite pour cela ! Smiley

IV-7 Paramétrages particuliers pour les clients

Tout comme les logiciels de type serveurs, certains logiciels de type clients doivent pouvoir être accessible depuis Internet. Il convient dans ce cas de leur ouvrir certains ports, afin qu'ils puissent communiquer et remplir leur office.

IV-7-1 Client GnomeMeeting

GnomeMeeting est un fabuleux logiciel de conférence audio, vidéo et texte. Il permet de faire communiquer plusieurs utilisateurs à travers Internet. Comme il doit pourvoir être contacté par vos correspondants, il a besoin d'un certains nombre de ports ouverts. Consultez la documentation de GnomeMeeting pour plus d'informations sur les besoins d'ouvertures de ports

IV-7-2 Client xMule

xMule est un logiciel de Peer-To-Peer, c'est à dire d'échange de fichiers. Il utilise le réseau "eMule".

IV-7-3 Client BitTorrent

BitTorrent (BT) est un logiciel de peer-to-peer, à la manière de "xMule". Contrairement à xMule, il utilise un plage de ports TCP "flottants" de 6881 à 6999. On peut change la plage de port sur lesquels BT écoute en lançant le programme BT avec les options "--minport" et "--maxport".

IV-8 Plus de sécurité avec le kernel

Les couches réseaux du kernel Linux peuvent apporter un lot d'options intéressantes. Netfilter_cfg propose d'utiliser certaines d'entre elles, afin de renforcer un peu plus la sécurité de la machine.

Ces options sont :

V Utilisation

V-1 Mise en garde

Bien, maintenant que vous avez modifié le script, il ne vous reste plus qu'à l'exécuter. Comme il est écrit au tout début de ce document, la principale commande qui va être utilisé dans ce script est "iptables", qui doit être lancé en temps que root. Donc si vous n'êtes pas l'administrateur de votre machine, jetez ce programme et allez jouer à Frozzen Bubble. Ou retournez sous Windows® vous faire cracker, espionner et piéger... Smiley

Bon, tout cela pour dire que, afin que ce programme ("netfilter_cfg") marche, vous devez le lancer avec les droits root, les droits absolus sur votre machine quoi ... Vous devez donc pour cela avoir confiance dans mon programme .... Glups, pas évident, hein ? Vous savez, vous avez encore le temps d'aller jouer à Frozzen Bubble... Smiley

Vous êtes toujours là ? Biennnnnnn !!!! Bon, merci de votre confiance. A priori je n'ai pas fait de bêtises en écrivant ce logiciel, et je l'utilise tous les jours depuis déjà quelques temps ... A défaut de vous rassurer, passons tout de suite à ce qui est important, à savoir : L'installer et le lancer ...

V-2 Installation

Commencez par vous logger en temps que root. Puis sauvez le fichier "netfilter_cfg" quelque part sur votre disque dur. Personnellement, le répertoire "/usr/local/sbin/" me semble le meilleur endroit. Ne vous soucier pas pour l'instant du fichier "netfilter_cfgd", nous aurons l'occasion d'en reparler un peu plus loin. Maintenant, donnez les droits d'exécution au fichier "netfilter_cfg" avec la commande "chmod".

Par exemple :

[root@phoenix /]# chmod +x /usr/local/sbin/netfilter_cfg

Il est de bon goût de donner la propriété et l'usage exclusif au root de ce fichier. Tapez donc les commandes suivantes :

[root@phoenix /]# chown root:root /usr/local/sbin/netfilter_cfg
[root@phoenix /]# chmod 750 /usr/local/sbin/netfilter_cfg

La première commande indique que ce fichier appartient au root. La seconde autorise uniquement le root à l'exécuter, et les autres utilisateurs ne peuvent même pas le lire ...

V-3 Droits d'utilisation

Comment lancer le programme ? En fait, il y a 4 méthodes différentes :

Bien, passons maintenant aux paramètres

V-4 Paramètres

Comme nous l'avons vu au-dessus, ce programme attend certains paramètres pour s'exécuter. La liste complète des paramètres s'obtient avec la commande : netfilter_cfg --help

Si il s'avère que vous lancez systématiquement "netfilter_cfg" avec les même paramètres, vous pouvez modifier le comportement par défaut du programme, en forçant la valeur de ces paramètres dans le script. Pour cela, modifiez la valeur par défaut des paramètres en modifiant le tableau WAITING_PARAMETERS[..], comme indiqué plus haut.

Explications des paramètres :

Remarque importante. Ce n'est pas parce que vous avez un firewall que vous êtes protégés contre toutes tentatives d'intrusion. Et notamment si vous exécutez sur votre machine un "service" (serveur ou un client "actif"), le firewall ne pourra pas sécuriser le dit service ! En effet en utilisant les options "--wan-*" vues ci-dessus, vous explicitez très clairement au firewall de laisser passer le flux de données vers ces services tournant sur votre machine. Donc c'est au service lui-même d'assurer sa propre protection... A vous donc de lire à fond la documentation qui est associé à ce service !

Comme vous pouvez le voir, le nombre d'options est assez limité (j'ai voulu faire un programme simple à utiliser ...), et pour la plupart des utilisations, il suffit de lancer "/usr/local/sbin/netfilter_cfg" sans paramètre pour avoir une protection optimum...

Les grincheux pourraient dire qu'activer le NAT par défaut aurait été une bonne chose. Sans doute chez eux, personnellement je préfère décider de quand j'autorise les machines de mon réseau local à sortir sur Internet... Mais vous pouvez vous-même mettre par défaut cette option à "on" si vous voulez Smiley.

Maintenant que vous savez quelles options sont à utiliser, vous pouvez executer votre firewall, et (enfin) sécuriser votre machine...

V-5 Exécution

Sur beaucoup de sites webs, vous trouverez des scripts semblables à "netfilter_cfg" (mais moins complexe, et sans paramètres). Et notamment, on vous parlera de la commande "/etc/init.d/iptables" et des ses options "start", "stop", "save", etc...

Les développeurs de ces scripts utilisent une technique particulière qui consiste à définir une fois pour toute la configuration de Netfilter, et à sauver les différentes commandes "iptables" utilisées grâce à la commande "/etc/init.d/iptables save". L'avantage de cette technique est qu'au prochain démarrage de la machine, le firewall sera automatiquement configuré, et qu'il n'y aura plus rien à faire. Cette technique est très séduisante, mais elle a un problème. En effet, à moins de posséder une adresse Internet statique, les règles iptables de ces scripts ne peuvent pas utiliser l'adresse IP Internet de la machine comme filtre, pour la simple raison que la connexion Internet n'est pas encore lancé, où que celle-ci à changé suite à la dernière déconnexion du fournisseur d'accès.

Par exemple, les règles de filtrage des connexions sortantes Internet que l'on pourrait avoir serait :

iptables -A OUTPUT -o ppp0 -p all -m state --state ! INVALID -j ACCEPT
iptables -A INPUT -i ppp0 -p all -m state --state RELATED,ESTABLISHED -j ACCEPT

Personnellement, je pense être un peu trop paranoïaque pour laisser des règles un peu trop souple de ce type. C'est pourquoi lorsque "netfilter_cfg" s'exécute, il détecte automatiquement la présence ou non de la connexion à Internet, et récupère l'adresse IP qui a été fournit par le fournisseur d'accès. Ainsi, si mon adresse IP est 26.87.145.23, mes règles seront automatiquement définies par :

iptables -A OUTPUT -o ppp0 -s 26.87.145.23 -p all -m state --state ! INVALID -j ACCEPT
iptables -A INPUT -i ppp0 -d 26.87.145.23 -p all -m state --state RELATED,ESTABLISHED -j ACCEPT

Contrairement aux 2 précédentes règles :

Bon, il commence à être tard, et vous vous demandez où je veux en venir, non ??? Smiley

Le but de cette explication n'était pas de montrer que mon script est peut-être meilleur (ou pas ...) que les autres, mais uniquement de vous faire comprendre à quel moment il faut le lancer ... Car, à n'en point douter, vous avez compris que pour ce que ce programme marche, il doit être lancé une fois que la connexion Internet est activée. Car ce n'est qu'à ce moment là que votre adresse IP Internet est connue...

4 cas sont donc possibles :

Bon, récapitulons un peu ce que nous venons de voir ci-dessus :

Type de connexionProgramme de connexion InternetTechnique à utiliser
Modem RTCPPP/KPPP (ou autres)Méthode 1
Netfilter_cfgd et ip-up.local && ip-down.local
Méthode 2
Netfilter_cfgd et Lancement de scripts via KPPP et sudo
Modem ADSL non dégroupé & connexion USBstartadslNetfilter_cfgd et ip-up.local && ip-down.local
Modem ADSL non dégroupé & connexion ethernetadsl-startNetfilter_cfgd et ip-up.local && ip-down.local
Modem ADSL dégroupé & connexion USBstartadslNetfilter_cfgd et ip-up.local && ip-down.local
Modem ADSL dégroupé & connexion ethernetAucunNetfilter_cfgd en modifiant le niveau d'init
Modem-routeur ADSL ou routeur simpleAucunNetfilter_cfgd en modifiant le niveau d'init

V-6 Test

Pour tout ce qui est des tests d'intrusion, afin de vérifier la validité de votre firewall, le programme le plus intéressant qu'il existe est "nmap", qui est un scannair de ports. Ce programme peut être utilisé pour lancer des connexions sur une machine d'un réseau, afin de voir quels sont les ports TCP/IP qui sont ouverts.

Vous pourriez l'utiliser pour tester vous même la qualité de votre firewall sur votre adresse IP Internet par exemple, mais malheureusement cela ne peut pas marcher. En effet, dans ce cas précis le kernel Linux comprend que l'expéditeur et le récepteur de la communication sont une seule et même machine (lui-même), et donc il fait passer la communication via l'interface loopback (même si "nmap" affichera votre adresse IP Internet). Or, les filtrages de cet interfaces lui sont spécifiques, et sans rapport avec ceux de votre connexion Internet...

Vous êtes déçu ? Nannn, il ne faut pas. Il existe 2 méthodes très efficaces pour tester malgré tout votre configuration de netfilter :

Conclusion : Faites vous un ami !!!! Smiley

VI Conclusion

Voila, je pense avoir fait le tour de la question sur la philosophie, le paramétrage et l'utilisation de ce programme. Ce programme est tout particulièrement adapté dans le cas d'une connexion via modem RTC ou ADSL non permanent, en se lançant après le démarrage du démon ppp ou des programmes de connexion ADSL. Il peut aussi s'utiliser dans un réseau local, possédant une passerelle (ou "gateway" en anglais) pour la connexion à Internet.

Hormis la phase de configuration, qui peut sembler un brin ardus, l'utilisation de ce programme est très aisé, et le lancement sans aucun paramètre suffit à protéger votre machine dans la majeure partie des cas.

Bien évidement, je suis ouvert à toutes suggestions et toutes questions quand à son utilisation, son développement, ou à sa documentation.

VII Remerciements

Merci à Jean-Roch, Fouad, François, Keyvan et Serge pour avoir participé aux tests et à la mise en production.

Merci aussi à Antoine BUSCH, Christian CHANUEL, Jak HIGHLANDER, Francois-Xavier 'FiX' KOWALSKI, JP SYLVANIE, pour leurs idées, patchs et ajouts de fonctionnalités

Merci enfin aux futurs utilisateurs qui vont me renvoyer plein de retours d'expérience... Smiley

VIII Historique du document

Version de Netfilter_cfgDateRemarque
Version 0.5.82004/03/11Ajout du support du client BitTorrent.
Ajout du paramètre "--lan-dhcp-server" afin autoriser les broadcasts DHCP du LAN.
L'option "--wan-xmule-server" est renommée en "--wan-xmule".
Correction du "wan-gateway", et d'un possible port scanning de la part de la passerelle.
Version 0.5.72004/03/03Ajout du support du client GnomeMeeting.
Version 0.5.62004/02/29Ajout de filtrages plus restrictifs pour l'ADSL dégroupé, et corrections pour le "wan-gateway".
Ajout du support du client xMule.
Corrections sur le chargement des modules.
Ajout du paramètre "--silence".
Correction du problèmes des adresses IP multiples sur une interface réseau.
Version 0.5.52003/11/02Correction des règles anti-spoofing.
Ajout du "--wait-connexion".
Amélioration du "DebugWrite".
Ajout du support du support des serveurs HTTP, Jabber, SSH.
Correction dans les règles ULOG.
Version 0.5.42003/06/17Première version publique, documentation au format XHTML.
Version 0.5.22003/06/11Première version semi-publique, documentation en format texte.

Remarques :

Nombre de visiteurs: Compteur


Table des matières
Valid XHTML 1.0! Valid CSS!
Site de référence : http://olivieraj.free.fr/ Last modified: Thu Mar 11 22:24:13 CET 2004