Le filtrage de paquets sous Linux

ArticleCategory:

System Administration

AuthorImage:

Vincent Renardias

TranslationInfo:[Author and translation history]

original in fr Vincent Renardias  

AboutTheAuthor

Utilisateur de GNU/Linux depuis 1993, Vincent Renardias a commenc� a s'impliquer activement dans son d�veloppement � partir de 1996 : D�veloppeur de la distribution Debian, auteur de la traduction Fran�aise de The GIMP et de l'environnement GNOME, cr�ateur du groupe d'utilisateurs Linux de Marseille (PLUG),... Actuellement directeur R&D de la soci�t� EFB2, il continue � contribuer activement au syst�me GNU/Linux.

Abstract

Cet article a �t� publi� dans un num�ro sp�cial sur la s�curit� de Linux Magazine France. L'�diteur, les auteurs, les traducteurs ont aimablement accept� que tous les articles de ce num�ro hors-s�rie soient publi�s dans LinuxFocus. En cons�quence, LinuxFocus vous "offrira" ces articles au fur et � mesure de leur traduction en Anglais. Merci � toutes les personnes qui se sont investies dans ce travail. Ce r�sum� sera reproduit pour chaque article ayant la m�me origine.


Un des meilleurs moyens pour �viter les tentatives de piratage reste encore de filtrer d�s l'entr�e du r�seau tout ce qui n'est pas sens� y �tre utile. Cette t�che est g�n�ralement remplie par une machine qui joue le r�le de "firewall" (pare-feu en fran�ais).
Dans cet article, nous allons d�tailler les bases indispensables pour la mise en place et la configuration d'un tel syst�me.

ArticleIllustration:[Das Titelbild des Artikels, do not translate]

[Illustration]

ArticleBody:[Der eigentliche Artikel. �berschriften innerhalb des Artikels sollten h2 oder h3 sein.]

Passerelle, Proxy-Arp ou Ethernet Bridge ?

Le dispositif de filtrage peut �tre consid�r� comme un filet qui va stopper un certain nombre de paquets ind�sirables. Tout l'art revient � trouver la taille ad�quate des mailles du filet ainsi que son emplacement id�al.

Emplacement du firewall sur le r�seau
Firewall location

Afin de pouvoir filtrer efficacement les paquets, le dispositif de filtrage doit �tre physiquement intercal� entre le r�seau qu'il prot�ge et le "reste du monde". Concr�tement, cela se fait avec une machine poss�dant 2 interfaces r�seau (Ethernet la plupart du temps), l'une connect�e sur la partie interne du r�seau et l'autre sur le routeur qui permet d'acc�der � l'ext�rieur. De cette mani�re, les communications passeront obligatoirement par le firewall qui aura la charge de les bloquer ou non selon leur contenu.

La machine sur laquelle sera plac� le dispositif de filtrage peut �tre configur�e de 3 mani�res diff�rentes :
- passerelle "simple" : C'est la configuration la plus courante. La machine fait office de passerelle entre deux r�seaux ou sous-r�seaux. Toutes les machines du r�seau local devront �tre reconfigur�es pour utiliser le firewall et non plus le routeur comme destination de la route par d�faut.
- passerelle "Proxy-ARP" : La configuration pr�c�dente force le d�coupage du r�seau en deux sous-r�seaux suppl�mentaires, ce qui fait perdre la moiti� des adresses IP disponibles ce qui est souvent g�nant, �tant donn� qu'actuellement les adresses IP sont distribu�es au compte-gouttes. Dans le cas d'un sous-r�seau de 16 adresses (avec un masque de r�seau sur 28 bits), seules 14 sont exploitables, car il faut retirer l'adresse de r�seau et l'adresse de diffusion (broadcast). En �tendant le masque de sous-r�seau d'un bit, on passe de 14 � seulement 6 adresses disponibles (8 IP moins les 2 pour les adresses de r�seau et de diffusion). Lorsque l'on ne peut pas se permettre de "perdre" la moiti� des adresses IP disponibles, on utilise cette technique qui est d�taill�e un peu plus loin dans cet article. D'autre part, cette technique ne demande aucune modification des param�tres r�seaux des machines existantes, aussi bien le routeur que les machines prot�g�es.
- Ethernet bridge : En mettant une passerelle au niveau Ethernet (et non plus IP), il est possible de rendre le dispositif de filtrage totalement invisible depuis les autres machines. En effet une telle configuration peut se faire sans attribuer d'adresses IP aux interfaces Ethernet. La machine est alors ind�tectable par PING, Traceroute, etc.. Notons cependant que la mise en place d'un filtrage de paquets sur une telle configuration n�cessite l'utilisation d'un kernel 2.2.x car le portage de cette fonctionnalit� sur les noyaux 2.4.x n'est pas encore termin�.

R�gles de base du filtrage

Maintenant que nous savons o� placer notre filtre, il reste � d�terminer ce qu'il va effectivement devoir �liminer ou au contraire accepter de laisser passer.
Il existe deux principales mani�res de configurer un tel filtre :
- La bonne mani�re : Par d�faut, aucun paquet ne passe, sauf ceux qu'une r�gle autorise explicitement � passer.
- La mauvaise mani�re (malheureusement assez souvent employ�e) : seuls les paquets explicitement interdits sont stopp�s, les autres passent.
L'explication est simple : dans le premier cas, l'oubli d'une r�gle de filtrage r�sulte en un service qui ne fonctionne pas comme il devrait, voire pas du tout. On s'en aper�oit alors g�n�ralement assez vite et il suffit d'ajouter la r�gle ad�quate pour que tout rentre dans l'ordre.
Dans le deuxi�me cas, un oubli cr�e un probl�me de s�curit� potentiel qui risque d'�tre long et difficile � mettre en �vidence, si tant est qu'on le d�couvre.

Netfilter

Le logiciel de filtrage le plus utilis� sous Linux 2.4 est Netfilter; il remplace avantageusement 'ipchains' qui �tait utilis� par la version 2.2 du kernel Linux. Netfilter est compos� de 2 parties : le support kernel qui doit �tre compil� dans votre noyau, ainsi que la commande 'iptables' qui devrait d�j� �tre disponible sur votre syst�me.

Exemple de mise en place

Un exemple comment� valant mieux qu'un long discours, nous allons dans la suite de cet article d�crire l'installation et la mise en place d'un dispositif de filtrage. La machine sera tout d'abord configur�e comme une passerelle utilisant Proxy-ARP pour limiter l'utilisation d'adresses IP, ensuite le dispositif de filtrage sera mis en place.

L'auteur a une pr�f�rence marqu�e pour la distribution Debian pour effectuer ce genre d'installation, mais n'importe quelle autre distribution ferait aussi bien l'affaire.

Commencez par vous assurer que votre noyau comporte effectivement le support de Netfilter. Si c'est le cas les 2 lignes suivantes devraient �tre pr�sentes dans les messages de boot :

ip_conntrack (4095 buckets, 32760 max)
ip_tables: (c)2000 Netfilter core team

Dans le cas contraire, vous devrez recompiler votre noyau apr�s avoir activ� le support Netfilter. Les options correspondantes se situent dans le sous-menu "Network Packet Filtering" du menu "Networking Options". Dans la section "Netfilter Configuration" choisissez les options qui vous interessent. Dans le doute, vous pouvez les s�lectionner toutes. Il est �galement pr�f�rable d'inclure Netfilter directement dans le noyau et de ne pas utiliser les modules. En effet, si pour une raison ou pour une autre un des modules de Netfilter venait � manquer ou n'�tait pas charg�, le filtrage serait inop�rant avec tous les risques que cela comporte.

Vous devrez �galement installer le package 'iproute2' (Celui-ci n'est pas rigoureusement indispensable, mais notre exemple va l'utiliser car il permet de simplifier le script de configuration). Sous Debian, il suffit de taper la commande 'apt-get install iproute'.
Sur les autres distributions, procurez-vous le package correspondant selon la m�thode habituelle, ou installez le logiciel � partir des sources que vous pourrez t�l�charger � l'adresse suivante :
ftp://ftp.inr.ac.ru/ip-routing/

Il faut maintenant configurer les 2 cartes Ethernet. Il est important de noter que le kernel Linux, lors de l'auto-d�tection du mat�riel arr�te la recherche des cartes r�seaux d�s qu'il en a trouv� une. Par d�faut, seule la premi�re carte sera donc d�tect�e.
Ce probl�me est facilement contourn� en ajoutant la ligne suivante dans le fichier lilo.conf :
append="ether=0,0,eth1"

Nous devons maintenant configurer les interfaces Ethernet. La m�thode que nous avons choisi d'utiliser permet d'utiliser la m�me adresse IP sur les 2 cartes permettant ainsi d'�conomiser une adresse supl�mentaire.
Dans ce qui suit, nous allons supposer que nous disposons du sous-r�seau 10.1.2.96/28, c'est-�-dire des adresses allant de 10.1.2.96 � 10.1.2.111 incluses. Le routeur aura pour adresse 10.1.2.97 et notre machine filtrante 10.1.2.98. D'autre part l'interface eth0 sera connect�e au routeur, au moyen d'un cable RJ45 crois� si les 2 cartes sont reli�es directement sans passer par un hub ou un switch; l'interface eth1 sera donc connect�e au hub/switch reliant entre elles les machines du r�seau local.

Chacune des 2 interfaces sera donc initialement configur�e avec les param�tres suivants :

address  : 10.1.2.98
netmask  : 255.255.255.240
network  : 10.1.2.96
broadcast: 10.1.2.111
gateway  : 10.1.2.97

Ensuite on utilise le script suivant, � lancer juste apr�s la configuration initiale des cartes r�seaux pour terminer la mise en place.

net.vars : Variables de configuration

PREFIX=10.1.2
DMZ_ADDR=$PREFIX.96/28
# Interface definitions
BAD_IFACE=eth0
DMZ_IFACE=eth1
ROUTER=$PREFIX.97

net-config.sh : Script de configuration r�seau

#!/bin/sh
# D�commenter la ligne suivante pour afficher les commandes
lors de leur ex�cution
# set -x
# On lit les variables d�finies dans le fichier pr�c�dent
source /etc/init.d/net.vars
# On enl�ve les routes actuelles sur le r�seau local
ip route del $PREFIX.96/28 dev $BAD_IFACE
ip route del $PREFIX.96/28 dev $DMZ_IFACE
# On indique que le r�seau local est accessible via eth1,
sauf
# le routeur qui est accessible via eth0.
ip route add $ROUTER dev $BAD_IFACE
ip route add $PREFIX.96/28 dev $DMZ_IFACE
# On active Proxy-ARP pour chacune des 2 interfaces
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp
# On active le "forwarding" pour permettre aux paquets arrivant
sur une carte
# d'�tre rout�s vers l'autre.
echo 1 > /proc/sys/net/ipv4/ip_forward

Revenons un instant sur le m�canisme Proxy-ARP qui est indispensable pour faire fonctionner notre configuration.
Lorsqu'une machine doit communiquer avec une autre sur le m�me r�seau, on a besoin de d�terminer l'adresse Ethernet (ou adresse MAC ou encore adresse hardware) correspondant � son adresse IP. La machine source envoie donc en broadcast la question "Quelle est l'adresse MAC de l'interface qui r�pond � l'adresse IP 1.2.3.4 ?", ce a quoi l'int�ress�e doit r�pondre.

Voici un exemple d'une telle discussion vue par tcpdump :
- la requ�te : la machine 172.16.6.72 demande l'adresse MAC r�pondant � l'adresse IP 172.16.6.10.
19:46:15.702516 arp who-has 172.16.6.10 tell 172.16.6.72
- la r�ponse : la machine 172.16.6.10 donne son num�ro de carte.
19:46:15.702747 arp reply 172.16.6.10 is-at 0:a0:4b:7:43:71

Ce qui nous am�ne au terme de cette petite explication : les requ�tes ARP �tant faites par broadcast, celles-ci sont limit�es � un seul r�seau physique. La requ�te d'une machine prot�g�e pour trouver l'adresse MAC du routeur serait donc normalement bloqu�e par la machine filtrante. L'activation de la fonctionnalit� Proxy-ARP permet de pallier � ce probl�me en demandant explicitement � ce que les requ�tes et r�ponses ARP arrivant par une carte soient propag�es vers l'autre et vice-versa.

A ce stade, vous devriez � nouveau avoir un r�seau en �tat de fonctionnement, avec une machine suppl�mentaire par laquelle tout le trafic entre le r�seau local et l'ext�rieur passe.

Il s'agit maintenant de mettre le filtrage en place gr�ce � Netfilter.
Netfilter permet d'agir directement sur le cheminement des paquets. Dans la configuration de base, les paquets passent par 3 cha�nes de r�gles :
- INPUT : par laquelle passent tous les paquets entrant par une interface,
- FORWARD : par laquelle passent tous les paquets qui sont transmis d'une interface � une autre,
- OUTPUT : par laquelle passent les paquets avant de sortir par une interface.

La commande 'iptables' permet d'ajouter, modifier ou retirer des r�gles dans chacune de ces cha�nes pour modifier le comportement du filtrage.
De plus, chaque cha�ne poss�de une politique (policy) par d�faut, c'est-�-dire le comportement � suivre lorsqu'aucune r�gle de la cha�ne n'a correspondu au paquet.
Les quatre comportements les plus courants sont :
- ACCEPT : On laisse passer le paquet,
- REJECT : On rejette le paquet et on envoie le paquet d'erreur associ� (ICMP Port Unreachable, TCP RESET, selon les cas),
- LOG : Enregistre une notification du paquet dans syslog,
- DROP : Le paquet est tout simplement ignor� et aucune r�ponse n'est envoy�e.

Cheminement des paquets dans les cha�nes standards

Packet flow

Voici les principales options d'iptables permettant de manipuler des cha�nes enti�res. Nous reviendrons ensuite un peu plus en d�tail sur chacune d'entre elles :

-N : Cr�ation d'une nouvelle cha�ne.
-X : Suppression d'une cha�ne vide.
-P : Changement de la politique par d�faut d'une cha�ne.
-L : Liste les r�gles d'une cha�ne.
-F : Élimine toutes les r�gles d'une cha�ne.
-Z : Remet � z�ro les compteurs d'octets et de paquets ayant travers� la cha�ne.

En ce qui concerne les modifications de cha�nes, les commandes suivantes sont disponibles :
-A : Ajoute une r�gle � la fin d'une cha�ne.
-I : Ins�re une nouvelle r�gle � une position donn�e dans une cha�ne.
-R : Remplace une r�gle donn�e dans une cha�ne.
-D : Efface une r�gle dans une cha�ne, soit par son num�ro d'ordre, soit en d�crivant la r�gle.

Voyons tout de suite un petit exemple pratique : nous allons interdire les r�ponses PING (c'est-�-dire les paquets ICMP de type 'echo-reply') venant d'une machine donn�e.
Commen�ons par nous assurer que pour le moment, on peut effectivement "pinger" la machine en question :

# ping -c 1 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes
64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms
--- 172.16.6.74 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms
Maintenant, nous allons ajouter une r�gle dans la cha�ne INPUT qui va intercepter les paquets ayant pour source la machine 172.16.6.74 ('-s 172.16.6.74'), de type ICMP-Reply ('-p icmp --icmp-type echo-reply'). Ces paquets seront tout simplement ignor�s ('-j DROP').
# iptables -A INPUT -s 172.16.6.74 -p icmp --icmp-type echo-reply -j DROP

Maintenant essayons � nouveau un PING vers cette machine :

# ping -c 3 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes
--- 172.16.6.74 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss

Comme nous pouvions nous y attendre, cette fois les r�ponses au PING ne passent plus. D'autre part, nous pouvons v�rifier que les 3 r�ponses ont bien �t� bloqu�es (3 paquets, pour un total de 252 octets) :

# iptables -L INPUT -v
Chain INPUT (policy ACCEPT 604K packets, 482M bytes)
pkts bytes target     prot opt in    out      source       destination
 3   252   DROP       icmp --  any   any      172.16.6.74  anywhere
 

Pour revenir � la situation initiale, il nous suffit de demander la suppression de la premi�re r�gle de la cha�ne INPUT :

# iptables -D INPUT 1

Et maintenant, le PING devrait � nouveau fonctionner correctement

:
# ping -c 1 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes
64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms
--- 172.16.6.74 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms
#

Ça marche !

En plus des 3 cha�nes pr�-existantes (qu'il est d'ailleurs impossible de supprimer), il est �galement possible de cr�er d'autres cha�nes et d'y faire passer une certaine partie du trafic. Ceci est tr�s utile pour, par exemple, �viter de dupliquer des r�gles communes entre plusieurs cha�nes.

Attachons-nous maintenant � mettre en place les r�gles n�cessaires pour un firewall minimaliste. Celui-ci laissera passer les services ssh, domain (DNS), http et smtp � l'exception de tous les autres.
Pour simplifier les choses, les commandes pour mettre les r�gles en place sont enregistr�es dans un script shell pour rendre la configuration plus pratique. Le script commence par enlever toute la configuration  actuelle du filtrage avant de mettre la nouvelle en place. Cette petite astuce permet au script d'�tre "idempotent", c'est-�-dire que l'on peut le relancer m�me si la configuration est d�j� active sans risque d'avoir de r�gle en double.

rc.firewall

#!/bin/sh
# Effacement de toutes les r�gles
iptables -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

# On construit une cha�ne par direction.
# bad = eth0 (ext�rieur)
# dmz = eth1 (int�rieur)
iptables -X bad-dmz
iptables -N bad-dmz
iptables -X dmz-bad
iptables -N dmz-bad
iptables -X icmp-acc
iptables -N icmp-acc
iptables -X log-and-drop
iptables -N log-and-drop

# Cha�ne sp�ciale destin�e a logguer les paquets
avant de les bloquer
iptables -A log-and-drop -j LOG --log-prefix "drop "
iptables -A log-and-drop -j DROP

# On �limine les paquets ayant tous les flags TCP activ�s ainsi que ceux
# avec aucun flag activ� (souvent utilis� par les scans de Nmap)
iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j log-and-drop
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j log-and-drop

# On bloque les paquets provenant des classes d'adresses r�serv�es
# ainsi que le multicast
iptables -A FORWARD -i eth+ -s 224.0.0.0/4 -j log-and-drop
iptables -A FORWARD -i eth+ -s 192.168.0.0/16 -j log-and-drop
iptables -A FORWARD -i eth+ -s 172.16.0.0/12 -j log-and-drop
iptables -A FORWARD -i eth+ -s 10.0.0.0/8 -j log-and-drop

# On accepte les paquets appartenants � une connexion d�j� �tablie
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# Selon le sens d'arriv�e des paquets on transmet � la cha�ne correspondante
iptables -A FORWARD -s $DMZ_ADDR -i $DMZ_IFACE -o $BAD_IFACE -j dmz-bad
iptables -A FORWARD -o $DMZ_IFACE -j bad-dmz
# On ignore tout le reste
iptables -A FORWARD -j log-and-drop

# ICMPs accept�s
iptables -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-request -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A icmp-acc -j log-and-drop

# Cha�ne Ext�rieur -> Int�rieur
# On accepte les services mail, DNS, http(s) et SSH
iptables -A bad-dmz -p tcp --dport smtp -j ACCEPT
iptables -A bad-dmz -p udp --dport domain -j ACCEPT
iptables -A bad-dmz -p tcp --dport domain -j ACCEPT
iptables -A bad-dmz -p tcp --dport www -j ACCEPT
iptables -A bad-dmz -p tcp --dport https -j ACCEPT
iptables -A bad-dmz -p tcp --dport ssh -j ACCEPT
iptables -A bad-dmz -p icmp -j icmp-acc
iptables -A bad-dmz -j log-and-drop

# Cha�ne Int�rieur -> Ext�rieur
# On accepte les services mail, DNS, http(s) et telnet
iptables -A dmz-bad -p tcp --dport smtp -j ACCEPT
iptables -A dmz-bad -p tcp --sport smtp -j ACCEPT
iptables -A dmz-bad -p udp --dport domain -j ACCEPT
iptables -A dmz-bad -p tcp --dport domain -j ACCEPT
iptables -A dmz-bad -p tcp --dport www -j ACCEPT
iptables -A dmz-bad -p tcp --dport https -j ACCEPT
iptables -A dmz-bad -p tcp --dport telnet -j ACCEPT
iptables -A dmz-bad -p icmp -j icmp-acc
iptables -A dmz-bad -j log-and-drop

# Chaines pour la machine elle-m�me
iptables -N bad-if
iptables -N dmz-if
iptables -A INPUT -i $BAD_IFACE -j bad-if
iptables -A INPUT -i $DMZ_IFACE -j dmz-if

# Interface externe
# On accepte uniquement SSH sur la machine elle-m�me
iptables -A bad-if -p icmp -j icmp-acc
iptables -A bad-if -p tcp --dport ssh -j ACCEPT
iptables -A bad-if -p tcp --sport ssh -j ACCEPT
ipchains -A bad-if -j log-and-drop

# Interface Interne
iptables -A dmz-if -p icmp -j icmp-acc
iptables -A dmz-if -j ACCEPT

Un dernier point sur la qualit� de service. Linux peut modifier le champ ToS ("Type of Service") des paquets et �ventuellement modifier sa valeur pour rendre le paquet plus ou moins prioritaire. Par exemple, la commande suivante modifie les paquets ssh sortants afin d'am�liorer la r�activit� des connexions.

iptables -A OUTPUT -t mangle -p tcp --dport ssh -j TOS --set-tos Minimize-Delay

De m�me, pour les connexions FTP vous pourrez utiliser l'option '--set-tos Maximize-Throughput' pour am�liorer le d�bit au prix d'une possible d�t�rioration de l'interactivit� de la session.

Voil�. Maintenant, vous �tes en possession des bases pour mettre en place un filtrage de paquets efficace. Gardez cependant en t�te qu'un firewall n'est pas la panac�e en mati�re de s�curit�, mais simplement une pr�caution suppl�mentaire. La mise en place d'un dispositif de filtrage ne dispense en rien l'utilisation de mots de passe non triviaux, de logiciels �quip�s des derniers patchs de s�curit�, de la mise en place d'un dispositif de d�tection d'intrusion, etc...

R�f�rences