Tout le trafic circulant dans un réseau est envoyé sous la forme de paquets. Par exemple, pour charger ce paquetage (disons qu'il fait 50k) vous avez dû recevoir plus ou moins 36 paquets de 1460 octets chacun (pour prendre des valeurs au hasard).
Le début de chaque paquet précise où celui-ci va, d'où il vient, le type du paquet, et divers autres détails administratifs. Le début de chaque paquet est appelé l'entête. Le reste du paquet, contenant les données à transmettre, est couramment appelé le corps.
Quelques protocoles, comme le TCP, qui est utilisé pour le trafic web, mail et les connexions à distance, utilisent le concept de `connexion' -- avant que le moindre paquet de données ne soit envoyé, divers paquets de configuration (avec des entêtes spéciales) sont échangés en disant `je veux me connecter', `OK' et `Merci'. Ensuite les paquets normaux sont échangés.
Un filtre de paquet est un logiciel qui regarde l'entête des paquets lorsque ceux-ci passent, et décide du destin du paquet entier. Il peut décider de le refuser (le supprimer comme s'il n'avait jamais été reçu), de l'accepter (le laisser circuler) ou de le rejeter (effet identique au refus, mais il est précisé à la source que le paquet n'a pas été accepté).
Sous Linux, le filtrage des paquets est inclus dans le noyau, et il y a diverses choses que nous pouvons faire avec les paquets, mais le principe général (regarder les entêtes et décider du destin du paquet) est toujours présent.
Contrôle. Sécurité. Vigilance.
Lorsque vous utilisez un ordinateur sous Linux pour connecter votre réseau interne à un autre réseau (disons, l'Internet) vous aurez l'opportunité de permettre certains types de trafics, et d'interdire les autres. Par exemple, l'entête d'un paquet contient l'adresse de destination du paquet, et vous pouvez ainsi éviter que des paquets aillent vers un certain endroit du réseau extérieur. Comme autre exemple, j'utilise Netscape pour accéder aux archives de Dilbert. Il y a des publicités provenant de doubleclick.net sur la page, et Netscape perd du temps en les chargeant gentiment. Dire au filtre des paquets de ne pas autoriser la circulation de paquets provenant ou allant vers doubleclick.net résoud le problème (il y a cependant de meilleurs moyens pour y parvenir).
Lorsque votre machine Linux est le seul rempart entre le chaos de l'Internet et votre réseau propre et bien ordonné, il est utile de savoir que vous pouvez restreindre ce qui vient sonner à votre porte. Par exemple, vous pouvez autoriser tout ce qui sort de votre réseau, mais vous pouvez vous inquiéter du fort connu 'Ping of Death' pouvant provenir d'intrus extérieurs. Comme autre exemple, vous pouvez interdire aux personnes extérieures de se connecter en telnet sur votre machine Linux, même si tous vos comptes ont des mots de passe ; peut-être désirerez-vous (comme la plupart des gens) être un simple observateur sur l'Internet, et non un serveur (de bonne volonté ou non) -- simplement en ne laissant personne se connecter, le filtrage de paquets rejetant tous les paquets entrants utilisés pour créer des connexions.
Parfois, une machine mal configurée du réseau local décidera d'envoyer des paquets au monde extérieur. Il est sympathique de pouvoir spécifier au filtre de paquets de vous informer si quelque chose d'anormal se produit ; vous pourrez éventuellement y faire quelque chose, ou bien laisser libre cours à la simple curiosité.
Vous aurez besoin d'un noyau disposant du nouveau code de chaînes de protection IP. Vous pouvez savoir si le noyau que vous utilisez actuellement en dispose en cherchant le fichier `/proc/net/ip_fwchains'. Si ce fichier existe, alors c'est tout bon.
Sinon, vous devez créer un noyau contenant le code de chaînes de protection IP. Tout d'abord, récupérez les sources du noyau que vous désirez. Si vous avez un noyau dont le numéro est supérieur ou égal à 2.1.102, vous n'aurez pas besoin de le corriger (il se trouve déjà inclus dans le noyau). Autrement, appliquez le correctif que vous trouverez sur la page web listée plus haut, et utilisez la configuration détaillée ci-dessous. Si vous ne savez pas comment le faire, ne paniquez pas -- lisez le Kernel-HOWTO.
Les options de configuration que vous devez utiliser pour les noyaux de série 2.0 sont :
CONFIG_EXPERIMENTAL=y CONFIG_FIREWALL=y CONFIG_IP_FIREWALL=y CONFIG_IP_FIREWALL_CHAINS=y
Pour les séries de noyaux 2.1 ou 2.2 :
CONFIG_FIREWALL=y CONFIG_IP_FIREWALL=y
L'outil ipchains
parle au noyau et lui dit quels paquets filtrer.
À moins que vous ne soyez un programmeur, ou un curieux invétéré, c'est
ainsi que vous contrôlerez le filtrage des paquets.
L'outil ipchains
insère et efface des règles dans la section
de filtrage de paquets du noyau. Ce qui signifie que quoi que vous
configuriez, tout sera perdu lors d'un redémarrage ; voyez la section
Rendre les règles permanentes pour savoir comment
s'assurer que les règles seront restaurées au prochain lancement de Linux.
ipchains
remplace ipfwadm
, qui était utilisé par l'ancien
code pare-feu. Il y a un ensemble de scripts utiles disponibles sur le site
ftp d'ipchains :
ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz
Cette archive contient un script shell appellé ipfwadm-wrapper
qui
vous autorisera à utiliser le filtrage de paquets comme avant. Vous ne devriez
probablement pas utiliser ce script à moins que vous ne souhaitiez un moyen
rapide de mettre à jour un système utilisant ipfwadm
(ce script est
plus lent, ne vérifie pas les arguments, etc.). Dans ce cas, vous n'avez pas
non plus besoin de ce howto.
Voyez l'annexe
Différences entre ipchains et ipfwadm et l'annexe
Utiliser le script `ipfwadm-wrapper' pour des détails supplémentaires concernant
ipfwadm
.
Votre configuration actuelle de pare-feu est sauvée dans le noyau, et sera ainsi perdue lors d'un redémarrage. Je vous recommande d'utiliser les scripts `ipchains-save' et `ipchains-restore' pour rendre vos règles permanentes. Pour ce faire, configurez vos règles, puis utilisez (en tant que super-utilisateur) :
# ipchains-save > /etc/ipchains.rules
#
Créez un script comme le suivant :
#! /bin/sh
# Script to control packet filtering.
# If no rules, do nothing.
[ -f /etc/ipchains.rules ] || exit 0
case "$1" in
start)
echo -n "Turning on packet filtering:"
/sbin/ipchains-restore < /etc/ipchains.rules || exit 1
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "."
;;
stop)
echo -n "Turning off packet filtering:"
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/ipchains -X
/sbin/ipchains -F
/sbin/ipchains -P input ACCEPT
/sbin/ipchains -P output ACCEPT
/sbin/ipchains -P forward ACCEPT
echo "."
;;
*)
echo "Usage: /etc/init.d/packetfilter {start|stop}"
exit 1
;;
esac
exit 0
Assurez vous que ceci est lancé suffisamment tôt dans la procédure de lancement. Dans mon cas (Debian 2.1), j'ai créé un lien symbolique appellé `S39packetfilter' dans le répertoire `/etc/rcS.d' (il sera ainsi lancé avant S40network).