Léa-Linux & amis :   LinuxFR   GCU-Squad   Zarb.Org   GNU
Reseau-secu-firewall

Firewall

Attention : cette documentation est obsolète.

Firewall
par Serge (légèrement modifié par Jicé)
Protégez vous derrière un mur de feu.

Ce document a été inspiré du Firewall-HOWTO, de l'IPCHAINS-HOWTO et du IP-Masquerade-HOWTO. C'est la synthèse de ces trois documents pour permettre la mise en place des techniques de Firewalling. Je vous conseille quand même de lire ces HOWTO pour plus de compréhension. Je suppose que vous savez configurer un réseau IP, au cas où jeter un coup d'oeil sur la rubrique réseau local. Il se peut que des erreurs se soient glissées dans cette présentation, de plus je ne pourrai être tenu responsable d'une mauvaise configuration de votre système. La sécurité est un sujet vaste, toujours en évolution et je ne prétends pas vous fournir ici une solution exempte de tout danger. Ce document est à prendre comme une présentation de ces techniques.

Attention : le filtrage plus fin et les techniques de proxy ne sont pas encore décrits.

Explications

Bon qu'est un Firewall ? Si on traduit, cela nous donne « pare-feu » , vous allez me dire « ha bon mon micro me protège du feu ? », bien sûr que non, un Firewall sert en fait à protéger un réseau vis à vis d'un autre ou d'autre réseaux.
Plusieurs types de Firewall existent et ne travaillent pas de la même façon et n'offrent pas les mêmes sécurités.
Les Firewall sont de plus en plus utilisés pour protéger les réseaux locaux d'entreprises vis à vis de l'internet. Il s'agit en fait d'une machine qui est reliée vers l'extérieur (Internet) et vers le réseaux local aussi et qui en quelque sorte analyse le trafic réseau qui la traverse pour savoir si oui ou non elle laisse passer ce trafic que ça soit dans un sens ou dans l'autre :
  _ ---- _         ________     +---> PC2
 (        )       |        |    |
( INTERNET )<---->|FIREWALL|<---+---> PC3
 (_      _)       |________|    |
    ----                        +---> PC4

Les différents types de Firewall

Le Firewall le plus simple est une machine qui possède une connexion vers l'extérieur et une autre sur le réseau local et qui ne transmet pas le trafic réseau d'un réseau à l'autre. Si une machine du réseau local veut accéder vers l'extérieur, elle ouvre en fait une session sur le Firewall, et travaille directement sur cette machine pour accéder vers l'extérieur. De ce fait aucun trafic réseau de l'extérieur ne peut rentrer sur le réseau local.

Vous avez compris les problèmes que cela engendre :

  • on travaille directement sur le Firewall donc chaque utilisateur qui va par exemple « naviguer » sur le web vas lancer un nouveau processus « navigateur »,
  • on n'a pas accès directement à sa machine avec ses ressources mais à celle du Firewall, et la protection s'arrête juste a une authentification d'utilisateur.
Ce type de Firewall en fait ne filtre absolument rien et peut donc être sujet à la moindre attaque extérieure. En fait il n'est plus utilisé, on va dire que c'est le « Firewall préhistorique » en quelque sorte. Voyons maintenant les types de Firewall utilisés :

Les Firewalls à filtrage de paquets

Ils travaillent sur les paquets réseaux eux-même. Pour les personnes qui ont des connaissances réseaux, ce type de Firewall travaille sur la couche réseau du modèle OSI. Ils analysent les paquets entrants/sortants suivant leur type, leurs adresses source et destination et les ports. Comme ils travaillent directement sur la couche IP, ils sont très peu gourmands en mémoire.

Avec Linux ce style de filtrage au niveau de la couche IP est intégré directement dans le noyau, il suffit donc d'avoir un 486 avec 8 Mo de mémoire et d'une distribution Linux avec juste un kernel de base et la couche IP pour faire un tel Firewall.

De plus ils sont totalement transparents pour les utilisateurs, pas d'authentification pour aller vers l'extérieur et pas de paramétrages spécifiques sur les machines des utilisateurs. Un désavantage, c'est qu'il n'y a pas d'authentification possible par utilisateur mais par adresse IP. C'est à dire que si l'on veut en interne interdire à certaine personnes d'aller vers l'extérieur ce n'est possible que si l'on connaît l'adresse de la machine de cet utilisateur, on ne peut pas empêcher que la personne aille sur une autre machine et il faut de plus que les machines aient toujours la même adresse, ce qui peut poser problème lorsqu'on on utilise DHCP.

Les Firewalls Proxy

Les Proxy serveur sont utilisés pour contrôler et analyser tout trafic avec l'extérieur. Certains proxies utilisent en plus un cache, c'est à dire qu'ils stockent des données en local, ce qui permet de réduire le trafic réseau, en effet si une même donnée est demandée plusieurs fois, au lieu d'aller la chercher au nouveau vers l'extérieur c'est le proxy lui même qui la fournit. Leur fonctionnement dépend de leur type :

Proxy d'applications

Leur fonctionnement ressemble un peu au fonctionnement du premier Firewall, c'est à dire quand une application d'une machine locale va vers l'extérieur, en fait elle se connecte sur le Proxy et c'est le Proxy lui-même qui va chercher l'information puis la renvoyer vers la machine demandeuse.
Un exemple : vous voulez récupérer un fichier via FTP sur internet, en fait votre client FTP vas se connecter sur le proxy qui va faire serveur FTP, le Proxy va en même temps ouvrir une session FTP sur le serveur distant, il va récupérer le fichier cible et vous le renvoyer via son serveur FTP. En fait c'est toujours le Proxy qui récupère les données et vous les renvoie.
Ça à l'avantage d'être très sécurisé pour la machine cliente, ça fait cache la plupart du temps donc ça réduit le trafic réseau, ça peut permettre l'authentification aussi si l'on oblige une authentification sur les applications du Proxy. Par contre ça demande des configurations spéciales sur les clients, ça demande aussi d'installer sur le proxy les applications serveur de chaque protocole que l'on souhaite fournir aux utilisateurs et ça consomme énormément de ressources.

Proxy « SOCKS »

Il ne travaille pas sur les applications, en fait il « refait » en quelque sorte les connexions. Le client passe par le Proxy qui lui en interne refait la connexion vers l'extérieur. Comme les Firewalls filtrants, ils ne font pas d'authentification, mais peuvent quand même enregistrer l'utilisateur qui a demandé la connexion.

Pré-installation d'un Firewall filtrant sous Linux

On va dans cette partie configurer le kernel pour préparer notre système à devenir un Firewall filtrant.
Comme je l'ai dit plus haut, les Firewall filtrants sont facilement configurables sous Linux car ils sont pris en charge directement dans le noyau de Linux. Ce type de Firewall étant très léger, il vous suffit d'un 486 avec 16 voire 8 Mo de RAM. Vous avez besoin aussi suivant la version du kernel :
  • Version 1.x.x : une copie de ipfwadm (mais bon je vous conseille vivement de passer a une version supérieure de kernel).
  • Version 2.0.x : ipwadm est sûrement déjà présent, vérifiez quand même.
  • Version 2.2.x : ipchains (sûrement présent aussi).
  • Version 2.3.x et 2.4 à venir : le format de firewall a encore changé, il n'est pas encore décrit dans ce document.
Pour ce document je décris la manière de mettre en place tout ça pour un kernel de version 2.2.X car à mon goût le Firewall est beaucoup plus sûr avec ce kernel (stack IP plus sûre et ipchains bien plus puissant que ipwadm), de plus il est facile de trouver une distribution à base de kernel 2.2.X, les 2.0.X deviennent rare.
Si vous voulez de plus faire un Proxy, récupérez l'un de ces programmes :
  • Squid
  • TIS Firewall toolkit (FWTK)
  • Socks
Une recherche sur freshmeat vous trouvera ça :) Mais bon pour l'instant ce document ne traite que des Firewall filtrant, j'ajouterais une rubrique Proxy plus tard.
Bon il faut maintenant configurer le kernel pour activer ce filtrage. Cochez les options suivantes :
<y> Enable experimental
 
<y> Enable loadable module support
 
<*> Packet socket
[ ] Kernel/User netlink socket
[y] Network firewalls
[ ] Socket Filtering
<y> Unix domain sockets
[y] TCP/IP networking

[ ] IP: multicasting

[y] IP: advanced router

[ ] IP: kernel level autoconfiguration

[y] IP: firewalling

[y] IP: always defragment (required for masquerading)

[y] IP: transparent proxy support

[M] IP: masquerading

--- Protocol-specific masquerading support will be built as modules.

[M] IP: ICMP masquerading

--- Protocol-specific masquerading support will be built as modules.

[Y] IP: masquerading special modules support <- Choisir tout les modules en répondant M

[y] IP: optimize as router not host

< > IP: tunneling

< > IP: GRE tunnels over IP

[y] IP: aliasing support

[y] IP: TCP syncookie support (not enabled per default)

--- (it is safe to leave these untouched)

< > IP: Reverse ARP

[y] IP: Allow large windows (not recommended if <16Mb of memory)

< > The IPv6 protocol (EXPERIMENTAL)

Cochez également toutes les autres options nécessaires (voir la [../kernel/kernel.php3 rubrique noyau]).

Bon vous recompilez le noyau (make dep; make clean; make bzImage), déplacez votre ancien répertoire de module (mv /lib/module/votre_version /lib/module/votre_version.old), puis compilez et instakllez les modules (make modules; make modules_install), copiez alors le nouveau kernel (cp /usr/src/linux/arch/i386/boot/bzImage /boot) et si vous utilisez LILO, reconfigurez le pour qu'il pointe sur votre nouveau kernel (editez /etc/lilo.conf) et relancez lilo (/sbin/lilo), sinon reconfigurez votre loader (CHOS, LOADLIN, etc.). Enfin on reboute (reboot). Ouf ! :)
Remarque 
Vérifiez la configuration réseau, assurez-vous que l'adresse de réseau de votre LAN est bien une des adresses réservée (192.168.2.0 par exemple, voir la [lan.php3 rubrique réseau local] pour ça). Pour la configuration de la carte externe, assurez vous aussi de sa bonne configuration pour accéder au net (testez votre connexion en fait), de même si la connexion se fait par modem. Pour tout ce qui suit je suppose que votre connexion au net se fait via une carte ethernet, en fait si vous utilisez un modem, de toute façon c'est identique. Bon avant de vraiment configurer le firewall on va tout d'abord mettre en place le « masquerading ».

Mise en place du filtrage, du masquerading, routage LAN<->NET et règles de base

Assurez-vous d'avoir bien la configuration précédente pour votre kernel (validez les lors de la configuration du kernel).
Compilez le kernel puis les modules. Une fois tout ça réalisé, ajouter dans le fichier /etc/rc.d/rc.local (vérifiez le chemin, il peut être différent suivant les distributions) le chargement des modules de masquerade :
/sbin/depmod -a (n'ajoutez cette ligne que si elle n'est pas déjà présente)
/sbin/modprobe ip_masq_ftp  (pour ftp)
/sbin/modprobe ip_masq_raudio (pour real audio)
/sbin/modprobe ip_masq_irc  (pour IRC)
et tout autre module comme ip_masq_cuseeme, ip_masq_vdolive, etc. que vous pouvez récupérer sur le net, si vous voulez bien sûr que de tels services soit accessibles par votre réseau local.


 

Remarque :
Je vous rappelle quand même que plus vous ouvrirez de services, plus votre sécurité baissera. En effet certains services « supplémentaires » peuvent contenir des bugs encore inconnus mais exploitables plus tard. Si vous voulez une sécurité accrue n'autorisez que le web ainsi que le FTP, surtout si vous êtes sur un réseau d'entreprise, je ne vois pas pourquoi l'IRC par exemple doit être activé, on n'en a pas besoin pour travailler dans une entreprise :).
Avant de continuer vérifiez bien que votre LAN (réseau local) est bien sur une adresse réservée privé, c'est a dire du type:
10.0.0.0 - 10.255.255.255 Classe A
172.16.0.0 - 172.31.255.255 Classe B
192.168.0.0 - 192.168.255.255 Classe C
Pour plus de simplicité, je considère que votre LAN est sur l'adresse réseau 192.168.1.0 et que votre « passerelle » (le firewall Linux) a comme adresse 192.168.1.1
Configurez aussi les autres machines de votre LAN avec bien sûr une adresse IP valide (de 192.168.1.2 jusqu'à 192.168.1.254), l'adresse de passerelle et de DNS, celle du Firewall (192.168.1.1).
Bon maintenant sur le Firewall, on va activer le masquerade avec:
# ipchains -P forward DENY
# ipchains -A forward -s yyy.yyy.yyy.yyy/x -j MASQ
avec x qui correspond au masque et yyy.yyy.yyy.yyy l'adresse réseau de votre LAN (ici 192.168.1.0)


 
 

Masque Valeur de x Classe
255.0.0.0 8 A
255.255.0.0
16
B
255.255.255.0
24
C
255.255.255.255
32
Point à point

Si pour vous ce style de notation de masque vous gêne vous pouvez aussi utiliser la notation xxx.xxx.xxx.xxx du masque pour remplacer x.

Pour notre exemple on tape alors:

# ipchains -P forward DENY

# ipchains -A forward -s 192.168.1.0/24 -j MASQ
ou
# ipchains -P forward DENY
# ipchains -A forward -s 192.168.1.0/255.255.255.0 -j MASQ
Bon on a fait quoi au juste là ?
  • La première ligne indique au noyau de ne transmettre AUCUN paquet, donc on bloque TOUT en fait.
  • La deuxième ligne elle indique de transmettre les paquets réseaux de notre LAN (192.168.1.0 avec masque 255.255.255.0).
Donc en fait notre Firewall Linux ne laissera passer au travers de lui que les communications LAN<->Extérieur.
Au lieu de laisser la possibilité à toutes les machines de notre LAN d'avoir accès vers l'extérieur, on aurait pu aussi ne spécifier que certaines machines, par exemple on veut que juste le patron de notre société ainsi que l'administrateur réseau par exemple qui ont des machines avec adresse IP 192.168.1.3 et 192.168.1.10. Pour cela il faut jouer sur le masque, ça nous donne:
# ipchains -P forward DENY
# ipchains -A forward -s 192.168.1.3/32 -j MASQ
# ipchains -A forward -s 192.168.1.10/32 -j MASQ
 
Pour rendre ces règles « permanentes » après chaque reboot, ajoutez-les aussi dans un fichier que vous appelez par exemple rc.firewall que vous placez dans /etc/rc.d, sinon vous allez devoir les taper à chaque reboot du système.
 
On résume alors ce qui peut se trouver dans un tel fichier:

#!/bin/bash
#
# Firewall.rc
#
# Script de démarrage des règles du firewall
#
# Tchesmeli serge , Version 0.2
#
# Lea : http://www.lea-linux.org
#
echo "Démarrage FIREWALL :"
 
echo "- Activation de l'IP forwarding..."
echo "1" > /proc/sys/net/ipv4/ip_forward

# D'abord on bloque tout

echo -n "- Arrêt total des transmissions réseau..."
if [ -x /sbin/ipchains ]; then
    /sbin/ipchains -P forward DENY
    echo "OK"
else
    echo "Erreur !"
    echo "Votre noyau n'est pas configuré pour\
permettre le filtrage.... veuillez le recompiler."
    exit
fi
 
# On charge les modules de masquerade
echo -n "- Chargement des modules de masquerade... "
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_irc

echo "OK"
# Vous pouvez y inclure ou enlever
# les modules de votre choix

# Puis on applique les règles

echo -n "- Chargement des règles de filtrage... "
# ipchains -P forward DENY
ipchains -A forward -s 192.168.1.0/255.255.255.0 -j MASQ

echo "OK"
# A vous de bien fixer les règles suivant votre réseau

 
echo "Firewall prêt."

On peut alors appeler ce script depuis /etc/rc.d/rc.local en y ajoutant une ligne :

source rc.firewall
Voilà ! Votre firewall est configuré ! A vous de jouer sur les règles afin d'optimiser la sécurité sur votre réseau local...
Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Serge Tchesmeli le 05/06/2000.


Autres ressources



@ Retour à la rubrique Réseau et sécurité


Copyright

Copyright © 05/06/2000, Serge Tchesmeli

Vous avez l'autorisation de copier, distribuer et/ou modifier ce document suivant les termes de la Licence pour documents libres, Version 1.1 publiée par la La Guilde des Doctorants. Pour plus d'informations consulter la LDL sur le site de La Guilde des Doctorants.
Affichages

Serveur hébergé par ST-Hebergement et Lost-Oasis / IRC hébergé par FreeNode / NS secondaire hébergé par XName
Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons CC-BY-SA