HOWTO sur les Firewalls sous Linux

Le HOWTO du pare-feu et des serveurs mandataires
Mark Grennan mark@grenna.com
v0.67, 26 septembre 1999 - Adaptation française Bernard Choppy, choppy@imaginet.fr 7 décembre 1999






Ce document est destiné à enseigner les bases des systèmes pare-feux ainsi que pour donner quelques détails sur la configuration d'un pare-feu aussi bien filtrant que serveur mandataire avec un PC sous Linux. Une version HTML de la version originale en anglais de ce document est disponible à http://www.grennan.com/Firewall-HOWTO.html.
 
 
 
 
 

1. Introduction
1.1 Réactions
1.2 Avertissement
1.3 Droit d'auteur
1.4 Les raisons qui me poussent à écrire ceci
1.5 Autres sources d'information

2. Comprendre les pare-feux
2.1 Politiques de sécurité
2.2 Types de pare-feux
2.3 Serveurs mandataires

3. Architecture de pare-feu

4. Configurer le pare-feu filtrant Linux
4.1 Matériel nécessaire
4.2 Logiciel nécessaire

5. Préparer le système Linux
5.1 Compiler le noyau
5.2 Configurer deux cartes réseau
5.3 Configurer les adresses réseau
5.4 Tester votre réseau
5.5 Sécuriser le pare-feu

6. Configuration du filtrage IP (IPFWADM)

7. Configuration du filtrage IP (IPchains)

8. Rendre le tout plus simple

9. Installer un mandataire Squid transparent

10. Installer le serveur mandataire TIS
10.1 Trouver le logiciel
10.2 Compilation du FWTK TIS
10.3 Installation du FWTK TIS
10.4 Configuration du FWTK TIS

11. Le serveur mandataire SOCKS
11.1 Installation du serveur mandataire
11.2 Configuration du serveur mandataire
11.3 Travailler avec un serveur mandataire
11.4 Faire fonctionner le serveur mandataire avec les paquets UDP
11.5 Inconvénients des serveurs mandataire

12. Configurations avancées
12.1 Un grand réseau avec sécurité renforcée

13. Simplifier l'administration

14. Outrepasser un pare-feu mandataire
 
 

1. Introduction

David Rudder drig@execpc.com. est l'auteur de la version d'origine de ce Firewall-HOWTO, il y a de si nombreux mois, et je voudrais encore le remercier pour m'avoir autorisé à mettre son travail à jour.

Les pare-feux sont devenus très populaires en tant que "nec plus ultra" de la sécurité sur Internet. Comme de nombreuses choses dont la renommée grandit, une certaine incompréhension s'y est jointe. Ce HOWTO présente les bases de la définition d'un pare-feu et la manière d'en configurer un.

J'utilise un noyau 2.2.15 et RedHat 6.0 pour développer ce howto, ainsi les exemples ci-dessous sont fondés sur cette distribution. Si vous trouvez des différences dans votre distribution, envoyez-moi un courriel et je mettrai à jour ce howto.

NdT : Diverses traductions ont été proposées pour le terme firewall, dont pare-feu, coupe-feu, mur anti-feu, etc. Le traducteur a adopté "pare-feu", qui semble actuellement le terme le plus couramment admis.
 
 

1.1 Réactions

Toute réaction est la bienvenue. SIGNALEZ TOUTE INEXACTITUDE DANS CET ARTICLE S'IL VOUS PLAIT ! Je suis humain, et donc sujet aux erreurs. Si vous trouvez une correction, envoyez-la moi. Je tenterai de répondre à tout courriel, mais je suis très occupé, donc ne m'en veuillez pas si je ne le fais pas.

Mon adresse courriel est : mark@grennan.com.
 
 

1.2 Avertissement

JE NE SUIS RESPONSABLE D'AUCUN DOMMAGE RESULTANT D'ACTIONS FONDEES SUR LE PRESENT DOCUMENT. Ce document est conçu comme une introduction au fonctionnement des pare-feux et des serveurs mandataires. Je ne suis, ni ne prétends être un expert ès sécurité. ;-) Je suis simplement un individu qui a trop lu et qui apprécie les ordinateurs plus que ce n'est le cas pour beaucoup. Considérez que j'écris ceci pour familiariser les gens avec ce sujet, et que je ne suis pas prêt à perdre ma jeunesse dans l'exactitude de ce qui s'y trouve.

NdT : Pour sa part, le traducteur émet les mêmes réserves que celles de l'auteur.
 
 

1.3 Droit d'auteur

Sauf mention contraire, les documents Linux HOWTO sont la propriété de leurs auteurs respectifs. Les documents Linux HOWTO peuvent être reproduits et distribués en totalité ou en partie, sur tout support physique ou électronique, tant que cette notice de droit d'auteur est présente sur chaque copie. La redistribution commerciale est autorisée et encouragée ; néammoins, l'auteur souhaite être informé de toute distribution de ce genre.

Toute traduction, travail dérivé, ou agrégat incorporant tout ou partie d'un ou plusieurs documents Linux HOWTO doit être couvert par ce même droit d'auteur. Ce qui veut dire que vous ne pouvez produire un travail dérivé d'un HOWTO et imposer des restrictions supplémentaires concernant sa distribution. Des exceptions à ces règles peuvent être délivrées sous certaines conditions ; contactez le coordinateur des Linux HOWTO.

En bref, nous souhaitons promouvoir la dissémination de cette information à travers autant de canaux que possible. Néammoins, nous souhaitons conserver un droit d'auteur sur les documents HOWTO, et être avisés de tout plan de distribution les concernant.

Si vous avez des questions, veuillez me contacter (cf. supra).

NdT : Le traducteur (Bernard Choppy) se met aussi à disposition, soit pour répondre directement, dans la mesure de ses faibles moyens, à toute question, soit pour transmettre et traduire, entre l'auteur et l'interlocuteur francophone. Son adresse est : choppy@imaginet.fr
 
 

1.4 Les raisons qui me poussent à écrire ceci

Il y a quelques années, alors que je travaillais pour l'État de l'Oklahoma en tant qu'"administrateur Internet", il me fut demandé de "mettre l'État sur Internet", sans m'allouer de budget (note : il n'existait pas de titre de ce genre à l'époque. J'étais juste le type qui faisait tout le travail). La meilleure manière de faire en sorte que cela puisse arriver était d'utiliser le plus possible de logiciel libre et de matériel de récupération. Linux et un tas de vieux 486 étaient tout ce que j'avais pour travailler.

Les pare-feux du commerce sont hors de prix et la documentation sur leur fonctionnement est considérée quasiment comme secret-défense. J'ai découvert que la création d'un pare-feu de mon cru était à peu près impossible.

Dans mon travail suivant, il m'a été demandé de mettre en place un pare-feu. Linux venait d'intégrer le code correspondant. À nouveau sans budget, j'ai commencé à monter un pare-feu avec Linux. Six mois plus tard, mon pare-feu était en place et ce document mis à jour.
 
 

1.5 Autres sources d'information

The Linux Networking Overview HOWTO ;
The Ethernet HOWTO ;
IPchains Firewalling made Easy! ;
Linux Network Address Translation ;
The Net-3 HOWTO ;
The NET-PPP HOWTO ;
TCP/IP Network Administrator's Guide aux éditions O'Reilly and Associates ;
The Documentation for the TIS Firewall Toolkit .
Ces sites web sont des sources d'informations sur le sujet de la sécurité en général.

Secure Linux.
Il s'agit de mon propre site de sécurité sur lequel j'ai rassemblé des livres blancs, de la documentation et des programmes concourant à la sécurisation de systèmes Unix.
 


2. Comprendre les pare-feux

Un pare-feu est une structure destinée à empêcher un feu de la traverser. Dans un immeuble, il s'agit d'un mur qui divise complètement des parties de celui-ci. Dans une voiture, un pare-feu est une pièce métallique qui sépare le moteur du compartiment passagers.
Les pare-feux Internet sont conçus pour isoler votre réseau local privé des flammes de l'Internet, ou de protéger la pureté des membres de votre réseau local en leur interdisant l'accès aux tentations démoniaques de l'Internet. ;-)
Le premier pare-feu informatique était une machine Unix sans routage avec deux connexions à deux réseaux différents. Une carte réseau était connectée à Internet et l'autre au réseau privé.
Pour atteindre Internet depuis le réseau privé, il fallait se loger sur le pare-feu (Unix). Ensuite, on utilisait les ressources de ce système pour accéder à Internet. Par exemple, on pouvait utiliser X-Window pour lancer le navigateur Netscape sur le pare-feu et en avoir l'affichage sur sa station de travail. Si le navigateur tourne sur le pare-feu, il a accès aux deux réseaux.
Cette sorte de hôte à double réseau (un système à deux connexions réseau) est bien si l'on peut faire confiance à TOUS les utilisateurs. On peut configurer simplement un système Linux et y créer un compte pour tout utilisateur souhaitant un accès à Internet. Avec cette configuration, le seul ordinateur du réseau privé qui connaisse quelque chose du monde extérieur est le pare-feu proprement dit. Personne ne peut télécharger directement sur un poste de travail personnelle il faut d'abord télécharger un fichier sur le pare-feu, puis transférer celui-ci du pare-feu au poste de travail.
NOTE IMPORTANTE : 99% des intrusions commencent par l'obtention d'un accès utilisateur sur le système attaqué. Pour cette raison, je ne recommande pas ce type de pare-feu. De plus, il est aussi extrêmement limité.
 


2.1 Politiques de sécurité

Il ne faut pas croire qu'un pare-feu soit la panacée. Il faut tout d'abord définir une politique de sécurité.
Les pare-feux sont utilisés dans deux buts :
pour maintenir des gens (intrus, vandales...) dehors ;
pour maintenir des gens (employés, enfants...) dedans.
Lorsque j'ai commencé à travailler sur les pare-feux, j'ai été surpris d'apprendre que l'entreprise pour laquelle je travaillais cherchait plus à "espionner" ses propres employés qu'à maintenir les intrus hors de ses réseaux.
Au moins dans mon état (l'Oklahoma), les employeurs ont le droit de surveiller les appels téléphoniques et l'activité Internet à condition d'informer préalablement les employés de cette surveillance (NdT : la législation française est identique de ce point de vue).
Big Brother n'est pas le gouvernement. Big Brother est le Big Businness.
Ne me méjugez pas : les gens sont au travail pour travailler, non pour jouer. Et il me semble que l'éthique du travail est en train de s'éroder. Néanmoins, j'ai aussi observé que certains types de directions se trouvent aussi les principaux transgresseurs des règles qu'ils ont eux-mêmes édictées. J'ai vu des vacataires réprimandés car ils avaient utilisé Internet pour chercher le trajet de bus pour venir au travail alos que le même directeur passait des heures au travail à chercher de bons restaurants et boîtes de nuit pour y trouver des clients potentiels.
Mon correctif de ce genre d'abus est de publier les traces du pare-feu sur une page web accessible à tout un chacun.
Le travail dans la sécurité peut être difficile. Si vous êtes gestionnaire de pare-feux, surveillez vos arrières.
 


2.2 Types de pare-feux

Il y a deux types de pare-feux :
pare-feux IP ou filtrants - ils bloquent tout le trafic sauf celui sélectionné ;
serveurs mandataires (parfois appelés bastions) - ils réalisent les connexions réseau pour vous.
Pare-feux filtrants
Le filtrage de paquets est le type de pare-feu inclus dans le noyau Linux.
Un pare-feu filtrant fonctionne au niveau du réseau. Les données ne sont autorisées à quitter le système que si les règles du pare-feu le permettent. Lorsque les paquets arrivent, ils sont filtrés en fonction de leurs type, origine, destination et port qui sont décrits dans chacun de ceux-ci.
De nombreux routeurs comportent un certain nombre de services de type pare-feu. Les pare-feux filtrants peuvent être pensés comme des types particuliers de routeurs. Pour cette raison, il faut une profonde compréhension de la structure des paquets IP pour travailler avec l'un d'eux.
Puisque très peu de données sont analysées et tracées, les pare-feux filtrants consomment peu de temps processeur et créent moins de latence sur un réseau.
Les pare-feux filtrants ne fournissent pas de contrôle par mot de passe. Un utilisateur ne peut s'identifier en tant que tel. La seule identité connue pour un utilisateur est l'adresse IP de son poste de travail. Cela peut être un problème lorsqu'on souhaite utiliser DHCP (assignation dynamique d'adresses IP). En effet, les règles étant fondées sur les adresses IP, il faut ajuster celles-ci à chaque fois que de nouvelles adresses sont assignées. Je ne sais pas comment automatiser ce processus.
Les pare-feux filtrants sont plus transparents pour les utilisateurs. Ceux-ci n'ont en effet pas à configurer des règles dans leurs applications pour utiliser Internet. Ce n'est pas vrai avec la plupart des serveurs mandataires.
 


2.3 Serveurs mandataires

Le meilleur exemple du fonctionnement de ceux-ci est celui d'une personne se connectant à un système puis, depuis celui-ci, au reste du monde. C'est seulement avec un serveur mandataire que ce processus est automatique. Lorsque vous vous connectez à l'extérieur, le logiciel client vous connecte en fait d'abord au serveur mandataire. Le serveur mandataire se connecte alors au serveur que vous cherchez à atteindre (l'extérieur) et vous renvoie les données reçues. NdT : en français, on utilise souvent le terme "bastion" pour désigner un serveur mandataire situé entre le réseau local interne et l'extérieur. Dans le présent document, on utilisera plutôt le terme bastion pour désigner la machine qui porte le serveur mandataire.
Puisque les serveurs mandataires gèrent toutes les communications, ils peuvent enregistrer tout ce qu'ils font (donc ce que vous faites). Pour les mandataires HTTP (web), cela comprend les URL que vous demandez. Pour les mandataires FTP, cela inclut chaque fichier téléchargé. Ils peuvent même expurger les mots "inappropriés" des sites que vous visitez ou analyser la présence de virus.
Les serveurs mandataires d'applications peuvent authentifier des utilisateurs. Avant qu'une connexion soit réalisée vers l'extérieur, le serveur peut demander à l'utilisateur de se connecter préalablement. Pour un utilisateur web, cela fonctionnera comme si chaque site requérait une connexion.
Mandataire SOCKS
Un mandataire SOCKS ressemble beaucoup à un vieux central téléphonique à fiches. Il interconnecte simplement une machine interne à une autre externe.
De nombreux serveurs SOCKS fonctionnent uniquement avec les connexions de type TCP. De même, comme les pare-feux filtrants, il ne permettent pas l'authentification d'utilisateurs. En revanche, ils peuvent enregistrer la destination de la connexion de chaque utilisateur.
 


3. Architecture de pare-feu

Il existe de nombreuses manières de structurer un réseau pour protéger des systèmes à l'aide d'un pare-feu.
Si l'on dispose de connexions dédiées à Internet par un routeur, on peut connecter directement celui-ci au système pare-feu. Au contraire, on peut passer par un hub pour permettre un accès complet aux serveurs à l'extérieur du pare-feu.
On peut configurer un certain nombre de règles de filtrage matérielles dans le routeur. Néanmoins, ce routeur peut être la propriété d'un FAI (fournisseur d'accès Internet), auquel cas on ne dispose pas du contrôle de celui-ci. Il faut demander au FAI d'y inclure des filtres (NdT : et avoir pleine confiance dans son FAI !).

On peut aussi utiliser un service commuté comme une ligne RNIS. Dans ce cas on peut utiliser une troisième carte réseau pour créer une DMZ (De-Militarized Zone, ou "zone démilitarisée") filtrée. Cela donne un contrôle total sur les services Internet et maintient la séparation avec le réseau local normal.

Si l'on ne fournit pas soi-même des services Internet mais que l'on souhaite surveiller où vont les utilisateurs, on voudra utiliser un serveur mandataire (bastion). Cela peut être intrégré dans le pare-feu.

On peut aussi placer le serveur mandataire sur le réseau local. Dans ce cas, les règles du pare-feu ne doivent autoriser que le bastion à se connecter à Internet pour les services que celui-ci fournit. Ainsi les utilisateurs ne peuvent accéder à Internet que par le mandataire.

Si l'on souhaite réaliser un service comme ceux de Yahoo! ou peut-être SlashDot, on peut souhaiter réaliser une architecture redondante de routeurs et pare-feux (cf. High Availability HOWTO).
En utilisant une technique de DNS à jeton tournant ou à l'aide de serveurs d'application à équilibrage de charge, on peut créer un service à 100% de disponibilité.

Il est facile de voir corrompre son réseau local. Il faut conserver le contrôle de chaque connexion. Il suffit d'un utilisateur avec un modem pour compromettre tout un réseau local.
 

4. Configurer le pare-feu filtrant Linux

4.1 Matériel nécessaire

Les pare-feux filtrants ne nécessitent pas de matériel haut de gamme. Ils ne sont pas grand chose de plus que de simples routeurs.
Tout ce qu'il faut est :
un 486-DX66 avec 16 Mo de mémoire vive ;
un disque dur de 200 Mo (500 Mo sont tout de même recommandés) ;
des connexions réseau (cartes Ethernet, ports série, connexions sans fil ?) ;
un moniteur et un clavier.
Avec certains systèmes, on peut même éliminer le moniteur et le clavier en utilisant une console sur port série.
Si l'on a besoin d'un serveur mandataire qui doive gérer un fort trafic, il faut prendre le système le plus puissant qui soit possible. En effet, pour chaque utilisateur qui se connectera par le bastion, il se créera un nouveau processus. Si l'on a 50 utilisateurs simultanés ou plus, je pense qu'il faut :
un Pentium II avec 64 Mo de mémoire vive ;
un disque dur de 2 Go pour contenir toutes les traces ;
deux connexions réseau ;
un moniteur et un clavier.
Les connexions réseau peuvent être de n'importe quel type (cartes NIC, RNIS ou même des modems).
 

4.2 Logiciel nécessaire

Pare-feu filtrant
Pour créer un pare-feu filtrant, aucun logiciel spécifique n'est nécessaire. Linux suffit.
Si l'on utilise un _TRES_ vieux noyau Linux (1.0.x ou plus ancien), il faut une copie de ipfwadm (NdT : il faut surtout passer à un noyau plus récent, car ces noyaux sont obsolètes, et risquent de plus de contenir des points faibles dont il sera difficile de retrouver trace).
Si l'on utilise un noyau 2.1.102 ou plus récent, il faut utiliser un ipchaining comme par exemple celui développé par http://www.rustcorp.com/linux/ipchains.
Serveur mandataire
Si l'on veut configurer un serveur mandataire, il faut l'un des paquetages suivants :
Squid ;
la boîte à outils TIS Firewall (FWTK) ;
SOCKS.
Squid est un beau paquetage et fonctionne avec la fonctionnalité de Linux de mandataire transparent. Je vais décrire comment configurer ce serveur.
À l'heure où j'écris ces lignes, Network Associates <http://www.networkassociates.com/> et Trusted Information System's (TIS) ont fusionné. Il faut donc continuer à consulter leurs sites web pour toute information sur les modifications. Dans l'intervalle, la boîte à outils TIS est toujours disponible sur : <http://www.tis.com/research/software/>.
Trusted Information System fournit une collection de programmes conçue pour faciliter la gestion de pare-feux. Avec cette boîte à outils, on configure un daemon pour chaque service (web, telnet, etc.) qui sera utilisé.
 

5. Préparer le système Linux

5.1 Compiler le noyau

Commencez avec une installation minimale propre de votre distribution Linux. Moins vous installez de logiciels, moins votre système aura de trous de sécurité, portes dérobées et/ou bogues susceptibles d'induire des problèmes de sécurité dans votre système.
Prenez un noyau stable. J'utilise le noyau Linux 2.2.9 ou plus pour mon système. La documentation est donc fondée sur ces paramètres.
Vous devez recompiler le noyau Linux avec les options appropriées. Si vous n'avez jamais recompilé de noyau, je vous renvoie au Kernel HOWTO, à l'Ethernet HOWTO et au NET-3 HOWTO.
Voici les paramètres réseau que je sais correspondre à quelque chose qui fonctionne. J'en ai signalé quelques-uns avec un "?". Si l'on souhaite utiliser cette fonctionnalité, il faut aussi l'activer.
J'utilise "make menuconfig" pour éditer ma configuration de noyau.
    <*> Packet socket
    [ ] Kernel/User netlink socket
    [*] Network firewalls
    [ ] Socket Filtering
    <*> Unix domain sockets
    [*] TCP/IP networking
    [ ] IP: multicasting
    [*] IP: advanced router
    [ ] IP: kernel level autoconfiguration
    [*] IP: firewalling
    [?] IP: always defragment (required for masquerading)
    [?] IP: transparent proxy support
    [?] IP: masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [?] IP: ICMP masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [ ] IP: masquerading special modules support
    [*] IP: optimize as router not host
    < > IP: tunneling
    < > IP: GRE tunnels over IP
    [?] IP: aliasing support
    [*] IP: TCP syncookie support (not enabled per default)
    --- (it is safe to leave these untouched)
    < > IP: Reverse ARP
    [*] IP: Allow large windows (not recommended if <16Mb of memory)
    < > The IPv6 protocol (EXPERIMENTAL)
    ---
    < > The IPX protocol
    < > Appletalk DDP
    < > CCITT X.25 Packet Layer (EXPERIMENTAL)
    < > LAPB Data Link Driver (EXPERIMENTAL)
    [ ] Bridging (EXPERIMENTAL)
    [ ] 802.2 LLC (EXPERIMENTAL)
    < > Acorn Econet/AUN protocols (EXPERIMENTAL)
    < > WAN router
    [ ] Fast switching (read help!)
    [ ] Forwarding between high speed interfaces
    [ ] PU is too slow to handle full bandwidth
    QoS and/or fair queueing  --->
Après avoir réalisé toute la configuration qu'il vous faut vous devez recompiler, réinstaller le noyau et rebouter.
J'utilise la commande :
make dep;make clean;make bzlilo;make modules;make modules_install;init 6
pour accomplir tout cela en une étape.
 

5.2 Configurer deux cartes réseau

Si vous avez deux cartes réseau dans votre ordinateur, vous devrez très certainement ajouter un paramètre "append" dans votre fichier /etc/lilo.conf pour décrire les IRQ et adresses des deux cartes. Le mien se présente ainsi :
append="ether=12,0x300,eth0 ether=15,0x340,eth1"
 

5.3 Configurer les adresses réseau

Nous arrivons à la partie amusante de notre configuration. Je ne vais pas entrer très profondément dans les détails de mise en place d'un réseau local. Pour résoudre vos problèmes à ce niveau, vous pouvez vous reporter au Networking-HOWTO.
Votre but est de fournir deux connexions réseau à votre système pare-feu filtrant : l'une est Internet (côté dangereux) et l'autre est le réseau local (côté sécurisé).
Dans tous les cas, vous devez prendre quelques décisions :
utiliserez-vous des adresses IP réelles ou non pour votre réseau local ?
votre FAI vous assigne-t'il une adresse IP ou utilisez-vous des adresses IP statiques ?
Puisque nous ne souhaitons pas laisser InterNet accéder au réseau privé, il n'est pas nécessaire d'utiliser des adresses "réelles". On peut toujours choisir des adresse arbitraires pour un réeau privé, mais ce n'est pas recommandé : au cas où des données seraient routées en-dehors de celui-ci, elles pourraient arriver sur un autre système.
Un certain nombre de plages d'adresses Internet ont été laissées de côté pour les réseaux privés. Parmi celles-ci, nous utiliserons celles de 192.168.2.xxx pour nos exemples.
Il vous faudra utiliser le masquage IP (IP masquerading) pour permettre à cela de fonctionner. Dans ce mode de fonctionnement, le pare-feu transmet les paquets en les traduisant en adresses IP "réelles" pour leur permettre de voyager sur Internet.
L'utilisation de ces adresses IP non routables rend le réseau privé plus sûr, car les routeurs Internet ne transmettront pas les paquets porteurs de ces adresses.
Il peut être judicieux maintenant de lire le IP Masquerading HOWTO.

Vous devez assigner l'adresse IP "réelle" à la carte réseau du côté Internet. Cette adresse peut vous être assignée de manière permanente (comme adresse IP statique) ou à chaque connexion par le processus PPP.
Vous assignez vos numéros IP internes, comme 192.168.2.1 pour la carte Ethernet du réeau local. Il s'agira de votre adresse de passerelle. Vous pouvez assigner une adresse de la plage 192.168.2.xxx à toutes les autres machines du réseau protégé (soit 192.168.2.2 à 192.168.2.254).
J'utilise Linux RedHat. Pour configurer le réseau lors du démarrage, j'ai ajouté un fichier "ifcfg-eth1" dans le répertoire /etc/sysconfig/network-scripts. On peut aussi trouver des fichiers ifcfg-ppp0 ou ifcfg-tr0 dans ce répertoire. Ces fichiers "ifcfg-" sont utilisés par RedHat pour configurer et activer les périphériques réseau lors du démarrage. Leur nom est fonction du type de connexion.
Voici l'allure du fichier ifcfg-eth1 (deuxième carte Ethernet) de notre exemple :
        DEVICE=eth1
        IPADDR=192.168.2.1
        NETMASK=255.255.255.0
        NETWORK=192.168.2.0
        BROADCAST=192.168.2.255
        GATEWAY=199.1.2.10
        ONBOOT=yes
Si vous utilisez une connexion commutée, vous devrez consulter les fichiers ifcfg-ppp0 et chat-ppp0 qui contrôlent votre connexion PPP.
Ce fichier ifcfg peut avoir l'allure suivante :
    DEVICE="ppp0"
    ONBOOT="yes"
    USERCTL="no"
    MODEMPORT="dev/modem"
    LINESPEED="115200"
    PERSIST="yes"
    DEFABORT="yes"
    DEBUG="yes"
    INITSTRING="ATZ"
    DEFROUTE="yes"
    HARDFLOWCTL="yes"
    ESCAPECHARS="no"
    PPPOPTIONS=""
    PAPNAME="LoginID"
    REMIP=""
    NETMASK=""
    IPADDR=""
    MRU=""
    MTU=""
    DISCONNECTTIMEOUT=""
    RETRYTIMEOUT="5"
    BOOTPROTO="none"
 

5.4 Tester votre réseau

Commencer en utilisant les commandes ifconfig et route. Si vous avez deux cartes réseau, votre ifconfig doit ressembler à :
        #ifconfig
        lo      Link encap:Local Loopback
                inet addr:127.0.0.0  Bcast:127.255.255.255  Mask:255.0.0.0
                UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
                RX packets:1620 errors:0 dropped:0 overruns:0
                TX packets:1620 errors:0 dropped:0 overruns:0

        eth0    Link encap:10Mbps Ethernet  HWaddr 00:00:09:85:AC:55
                inet addr:199.1.2.10 Bcast:199.1.2.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:0 errors:0 dropped:0 overruns:0
                TX packets:0 errors:0 dropped:0 overruns:0
                Interrupt:12 Base address:0x310

        eth1    Link encap:10Mbps Ethernet  HWaddr 00:00:09:80:1E:D7
                inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:0 errors:0 dropped:0 overruns:0
                TX packets:0 errors:0 dropped:0 overruns:0
                Interrupt:15 Base address:0x350
et votre table de routage :
        #route -n
        Kernel routing table
        Destination  Gateway      Genmask        Flags MSS   Window Use Iface
        199.1.2.0    *            255.255.255.0  U     1500  0       15 eth0
        192.168.2.0  *            255.255.255.0  U     1500  0        0 eth1
        127.0.0.0    *            255.0.0.0      U     3584  0        2 lo
        default      199.1.2.10   *              UG    1500  0       72 eth0
 
Note: 199.1.2.0 est l'adresse du côté Internet du pare-feu et 192.168.2.0 celle du côté privé (réseau local).
Vous devez commencer par vous assurer que chaque ordinateur de votre réseau local puisse atteindre l'adresse de votre pare-feu (192.168.2.2 dans cet exemple) par ping. Dans le cas contraire, replongez-vous dans le NET-3 HOWTO et retravaillez un peu votre réseau.

Ensuite, essayez d'atteindre un système Internet depuis le pare-feu. J'utilise personnellement l'adresse www.internic.net pour mes tests. Si cela ne fonctionne pas, essayez un serveur de votre FAI. Si cela ne fonctionne toujours pas, il y a un problème quelque part dans la configuration de votre connexion Internet. Vous devriez pouvoir atteindre n'importe quel point d'Internet depuis votre pare-feu. Essayez de vérifier la configuration de votre passerelle par défaut. Si vous utilisez une connexion commutée, recontrôlez votre nom d'utilisateur et votre mot de passe. Replongez--vous dans le NET-3 HOWTO et essayez encore.
Maintenant, essayez d'atteindre l'adresse extérieure du pare-feu (199.1.2.10 dans notre exemple) depuis une machine du réseau local. Cela ne doit pas fonctionner. Dans le cas contraire, le masquage IP ou la transmission IP sont activés ou vous avez déjà une sorte de filtrage de paquet positionnée. Désactivez-les et réessayez. Vous devez savoir si le filtrage est en place.
Pour les noyaux postérieurs au 2.1.102, vous pouvez utiliser la commande :
    echo "0" > /proc/sys/net/ipv4/ip_forward
Si, en revanche, vous utilisez un noyau plus ancien (pourquoi ?), vous devrez recompiler celui-ci en désactivant la transmission IP (IP forwarding, mais mettez plutôt votre noyau à jour).
Essayez à nouveau d'atteindre l'adresse extérieure du pare-feu (199.1.2.10 dans notre exemple) depuis une machine du réseau local. Cela ne doit pas fonctionner.
Maintenant, activez la transmission IP et/ou le masquage IP. Vous devez être à même d'atteindre n'importe quel point d'Internet depuis n'importe quelle machine de votre réseau local.
    echo "0" > /proc/sys/net/ipv4/ip_forward
Note importante : Si vous utilisez des adresses IP "réelles" sur votre réseau local (et non 192.168.xxx.yyy) et que vous ne puissisez atteindre Internet, mais que vous puissiez atteindre le côté extérieur de votre pare-feu, vérifiez que votre FAI route correctement les paquets depuis l'adresse de votre réseau privé.
Un test de ce problème est de connaître quelqu'un d'autre sur Internet (un ami utilisant un fournisseur local, par exemple) et de lui demander d'effectuer un traceroute vers votre réseau. Si la trace s'arrête sur le routeur de votre fournisseur, c'est qu'il ne transmet pas votre trafic.
Ça fonctionne ? Bien. La partie la plus difficile est faite. :-)
 

5.5 Sécuriser le pare-feu

Le pare-feu n'est d'aucune utilité s'il reste largement ouvert aux attaques. Un "méchant" pourrait obtenir l'accès au pare-feu et le modifier pour ses desseins personnels. Vous devez désactiver tous les services inutilisés.
Regardez dans votre fichier /etc/inetd.conf. Ce fichier contrôle inetd qu'on appelle aussi "super-serveur". Il contrôle un tas de daemons serveurs et les exécute à la demande, à partir des paquets qui arrivent sur un port "bien connu" (well known port).
Vous devez désactiver echo, discard, daytime, chargen, ftp, gopher, shell, login, exec, talk, ntalk, pop-2, pop-3, netstat, systat, tftp, bootp, finger, cfinger, time, swat ainsi que linuxconfig si vous en possédez un.
Pour désactiver un service, placez simplement un "#" (dièze) devant. Ensuite, envoyez un signal SIG-HUP au processus inetd, selon la syntaxe suivante :
kill -HUP <pid>
où "pid" est le numéro du processus inetd. Cela force inetd à relire son fichier de configuration (inetd.conf) et à se relancer sans arrêter votre système.
Testez le résultat par telnet sur le port 15 (netstat) du pare-feu. Si vous obtenez une réponse de netstat, c'est que vous n'avez pas arrêté ces services correctement.
telnet localhost 15
Vous pouvez aussi créer le fichier /etc/nologin. Placez-y quelques mots (comme "CONNEXION STOPPEE"). Lorsque ce fichier existe, login n'autorise pas de connexion d'utilisateur. Ceux-ci verront simplement le contenu de ce fichier et leur connexion sera refusée. Seul root peut alors se loger.
Vous pouvez encore éditer le fichier /etc/securetty. Si l'utilisateur est root, la connexion doit s'effectuer depuis l'un des périphériques indiqués dans /etc/securetty. Les échecs seront tracés par la facilité syslog. Avec ces deux contrôles actifs, la seule manière de se connecter sur le pare-feu est de se présenter comme root sur la console.
 

6. Configuration du filtrage IP (IPFWADM)

Si vous utilisez un noyau 2.1.102 ou supérieur, passez directement à la section suivante sur IPCHAINS.
Dans les anciens noyaux, la transmission IP est activée par défaut. Pour cette raison, votre réseau doit commencer par refuser l'accès à tout et vider toutes les règles de transmission (ipfw) en place depuis le dernier lancement. Le fragment de script suivant doit se trouver dans votre script de lancement réseau (en général, /etc/rc.d/init.d/network) :
        #
        # configuration de la transmission IP et
        # de la trace
        #
        #   Transmission
        #
        # Par defaut INTERDIRE tous les services
        ipfwadm -F -p deny
        # Vider toutes les regles de trace
        ipfwadm -F -f
        ipfwadm -I -f
        ipfwadm -O -f
Maintenant, nous avons un pare-feu absolu. Rien ne peut passer au travers.
Maintenant, on peut créer le fichier /etc/rc.d/rc.firewall. Ce script doit autoriser le passage des trafics courrier, web et DNS. ;-)
#!/bin/sh
#
# rc.firewall
#
# Lancement de la bibliotheque de fonctions
. /etc/rc.d/init.d/functions

# Lecture de la configuration
. /etc/sysconfig/network

# On controle que le reseau soit actif
if [ $NETWORKING = "no" ]
then
        exit 0
fi
case "$1" in
  start)
  echo -n "Lancement des services du pare-feu : "
  # Autorise le courriel a arriver au serveur
  /sbin/ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 192.1.2.10 25
  # Autorise les connexions aux serveurs courriel externes
  /sbin/ipfwadm -F -a accept -b -P tcp -S 192.1.2.10 25 -D 0.0.0.0/0 1024:65535
  # Autorise les connexions a notre serveur web
  /sbin/ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 192.1.2.11 80
  # Autorise les connexions aux serveurs web externes
  /sbin/ipfwadm -F -a accept -b -P tcp -S 192.1.2.* 80 -D 0.0.0.0/0 1024:65535
  # Autorise le trafic DNS
  /sbin/ipfwadm -F -a accept -b -P udp -S 0.0.0.0/0 53 -D 192.1.2.0/24
  ;;
  stop)
  echo -n "Arret des services du pare-feu : "
  ipfwadm -F -p deny
  ;;
  status)
  echo -n "Montrez-vous les statistiques du pare-feu ?"
  ;;
  restart|reload)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: firewall {start|stop|status|restart|reload}"
        exit 1
esac
 
Note: Dans cet exemple, nous avons un serveur courriel (SMTP) qui tourne sur 192.1.2.10 qui doit être capable d'envoyer et recevoir des paquets sur le port 25. Le serveur web tourne sur 192.1.2.11. Nous autorisons quiconque sur le réseau local à accéder aux serveurs web externes ainsi qu'aux serveurs DNS.

Cet exemple n'est pas parfaitement sécurisé. Puisque le port 80 n'est pas obligatoirement utilisé comme port web, un intrus rusé pourrait utiliser celui-ci pour créer un réseau privé virtuel (VPN : virtual private network) au-travers du pare-feu. Pour contourner cela, il faut configurer un mandataire web, et n'autoriser que celui-ci à traverser le pare-feu. Les utilisateurs du réseau local devront alors passer par le mandataire pour atteindre les serveurs web extérieurs.
On peut aussi s'intéresser à la surveillance du trafic qui passe au-travers du pare-feu. Le script qui suit compte chaque paquet. On peut ajouter une ou deux lignes pour compter les paquets qui vont vers un système particulier.
  # Flush the current accounting rules
  ipfwadm -A -f
  # Accounting
  /sbin/ipfwadm -A -f
  /sbin/ipfwadm -A out -i -S 192.1.2.0/24 -D 0.0.0.0/0
  /sbin/ipfwadm -A out -i -S 0.0.0.0/0 -D 192.1.2.0/24
  /sbin/ipfwadm -A in -i -S 192.1.2.0/24 -D 0.0.0.0/0
  /sbin/ipfwadm -A in -i -S 0.0.0.0/0 -D 192.1.2.0/24
Si tout ce que vous cherchez est un pare-feu filtrant, vous pouvez vous arrêter ici. Testez-le et amusez-vous bien :-)
 

7. Configuration du filtrage IP (IPchains)

Les ipchains Linux sont une réécriture du code pare-feu IPv4 de Linux (en grande partie inspiré de BSD) ainsi que de ipfwadm qui était lui-même une réécriture du ipfw de BSD, je crois. Il est indispensable d'administrer les filtres de paquets IP dans les noyaux Linux versions 2.1.102 et au-delà.
L'ancien code ne gère pas les fragments, a des compteurs sur 32 bits (sur Intel en tout cas), ne permet aucune autre spécification de protocole que TCP, UDP ou ICMP, ne peut réaliser de vastes modifications de manière atomique, ne peut spécifier de règles inversées, a quelques défauts et peut se révéler dur à administrer (ce qui le rend vulnérable aux erreurs d'utilisation). Ou du moins c'est ce qu'en dit l'auteur.
Je ne vais pas entrer en détail sur la manière de contrôler un pare-feu IPchains, car il existe un _BON !!_ HOWTO qui en parle sur http://www.rustcorp.com/linux/ipchains/HOWTO.html. Je finirais juste par le recopier ici. En voici les bases.
On travaille avec les chaînes par noms. Il existe au début trois chaînes prédéfinies input, output et forward, qu'il est impossible de supprimer. On peut créer des chaînes personnelles. Des règles peuvent ensuite être ajoutées et supprimées de ces ensembles de règles.
Les opérations nécessaires pour travailler sur les chaînes sont les suivantes :
création d'une nouvelle chaîne (-N) ;
suppression d'une chaîne vide (-X) ;
modification de la spécification pour une chaîne prédéfinie (-P)
liste des règles d'une chaîne (-F) ;
remise à zéro des compteurs de paquets et d'octets de toutes les règles d'une chaîne (-Z).
Il existe différentes méthodes pour manipuler les règles à l'intérieur des chaînes :
ajout d'une nouvelle règle dans une chaîne (-A) ;
insertion d'une nouvelle règle à une position donnée d'une chaîne (-I) ;
remplacement d'une règle à une position donnée d'une chaîne (-R) ;
suppression d'une règle à une position donnée d'une chaîne (-D) ;
suppression de la première règle correspondante dans une chaîne (-D).
Il existe quelques opérations pour le masquage qui se trouvent dans ipchains dans l'attente d'un bon emplacement pour les placer :
liste des connexions actuellement masquées (-M -L) ;
positionnement du temps d'expiration du masquage (-M -S).
Il y a quelques détails de chronologie qui interviennent dans la modification des règles de pare-feu. Si l'on n'est pas suffisamment prudent, il est possible de laisser passer quelques paquets pendant la mise en place des modifications. Une approche simpliste est la suivante :
     # ipchains -I input 1 -j DENY
     # ipchains -I output 1 -j DENY
     # ipchains -I forward 1 -j DENY
... réalisation des modification ...
     # ipchains -D input 1
     # ipchains -D output 1
     # ipchains -D forward 1
     #
Cela interdit tout passage de paquet durant les modifications.
Voici une copie des règles de pare-feu qui précèdent dans IPChains :
#!/bin/sh
#
# rc.firewall
#
## Tout vider et repartir du debut
  /sbin/ipchains -F input
  /sbin/ipchains -F output
  /sbin/ipchains -F forward

## Redirection pour le mandatement transparent de HTTP
  #$IPCHAINS  -A input -p tcp -s 192.1.2.0/24 -d 0/0 80 -j REDIRECT 8080

## Creation de nos propres chaines
  /sbin/ipchains -N ma-chaine
  # On autorise le courriel entrant vers le serveur
  /sbin/ipchains -A ma-chaine -s 0.0.0.0/0 smtp -d 192.1.2.10 1024:-j ACCEPT
  # On autorise les connexions courriel vers l'extérieur
  /sbin/ipchains -A ma-chaine -s 192.1.2.10 -d 0.0.0.0/0 smtp -j ACCEPT
  # On autorise les connexions web entrantes vers le serveur
  /sbin/ipchains -A ma-chaine -s 0.0.0.0/0 www -d 192.1.2.11 1024: -j ACCEPT
  # On autorise les connexions web vers l'extérieur
  /sbin/ipchains -A ma-chaine -s 192.1.2.0/24 1024: -d 0.0.0.0/0 www -j ACCEPT
  # On autorise le trafic DNS
  /sbin/ipchains -A ma-chaine -p UDP -s 0.0.0.0/0 dns -d 192.1.2.0/24 -j ACCEPT

## Si on utilise le masquage
  # On ne masque pas le trafic interne
  /sbin/ipchains -A forward -s 192.1.2.0/24 -d 192.1.2.0/24 -j ACCEPT
  # On ne masque pas l'interface externe directe
  /sbin/ipchains -A forward -s 199.1.2.0/24 -d 0/0 -j ACCEPT
  # On masque tout paquet interne qui sort
  /sbin/ipchains -A forward -s 192.1.2.0/24 -d 0/0 -j MASQ

## On interdit tout le reste
  /sbin/ipchains -P my-chains input DENY
Il ne faut pas s'arrêter là. Ce n'est pas un pare-feu très puissant et je suis sûr qu'il y a d'autres services que vous souhaiteriez fournir. À nouveau, lisez le IPCHAINS-HOWTO.
 

8. Rendre le tout plus simple

Il existe des interfaces graphiques ou fondées sur le web développées pour fonctionner avec les règles de filtrage Linux. Un certain nombre d'entreprises ont même créé des pare-feux commerciaux fondés sur Linux en le plaçant dans leur propre machine avec leur propre code de management (joli).
gfcc (GTK+ Firewall Control Center) est une application GTK+ capable de contrôler les principes et règles de filtrage de Linux, fondée sur le paquetage ipchains. Rendez-vous sur <http://megaman.ypsilonia.net/kfirewall/>.
FCT est un outil HTML de configuration de pare-feu. Il permet la génération automatique de scripts de commandes de filtrage IP (ipfwadm) sur un pare-feu pour des interfaces multiples et tout service internet http://www.fen.baynet.de/~ft114/FCT/firewall.htm
 
 

Voilà, c'est ici que s'arrête cet intéressant et populaire HOWTO sur les firewalls sous linux. Ce n'est pas moi qui l'ai écrit, je me suis juste occupé de la mise en forme. Donc pour tout commentaires regardez les références au début.