Pont filtrant
Les ponts filtrants
Introduction
Un pont est un équipement réseau qui permet de relier deux sous-réseaux de manière totalement transparente. Pour ceux qui connaissent un peu le modèle OSI, il effectue une interconnexion au niveau 2, c'est-à-dire qu'il travaille au niveau des trames.
En gros, un pont écoute toute l'activité de chaque sous-réseau auquel il est connecté, les stocke en mémoire et les redirige vers le (ou les) sous-réseaux concernés.
Il n'a pas besoin d'adresse MAC (donc pas besoin d'adresse IP non plus) pour fonctionner, et est donc totalement indétectable.
Schématiquement, on peut représenter un pont reliant deux réseaux de cette facon (le pont est la machine servant de pont, eth0 et eth1 ses deux cartes réseau):
Réseau 1 -------| eth0 Pont eth1 |-------- Réseau 2
Un pont filtrant, lui, est un pont comme décrit plus haut, mais va en plus appliquer des régles de filtrage (firewalling) sur les trames qui vont le "traverser". On vas donc obtenir un firewall qui ne posséde pas d'adresse réseau, donc indétectable. Difficile pour un "pirate" d'attaquer une machine qui n'est pas visible sur un réseau, et qui ne permet aucune connexion réseau car elle n'as pas d'adresse réseau.
Un pont filtrant a aussi un autre avantage : il s'interconnecte de façon totalement transparente sur votre réseau, vous n'avez absolument pas besoin de modifier la topologie de votre réseau (routage, passerelle,...) pour l'ajouter. Il se comporte en gros comme un simple cable réseau intelligent qui filtrerait le traffic qui le traverse.
Pré-requis
Tout d'abord vous devez avoir un ordinateur avec deux cartes réseaux pour pouvoir interconnecter /filtrer les deux réseaux. Le support du "pont" est intégré à partir du kernel 2.4. , mais vous devez prendre le dernier kernel à jour (2.4.19 lors de la rédaction de ce document) pour avoir le meilleur support du pont. Vous devez aussi appliquer un patch kernel, pour ajouter le support du pont à iptable (pour pouvoir filtrer les paquets qui vont traverser le pont):
bridge-nf-0.0.7-against-2.4.19.diff
Ceci est le patch pour le kernel 2.4.19. Si lors de la lecture de ce document, le dernier kernel n'est plus le 2.4.19, récupérez alors le patch pour la version du kernel actuelle que vous trouverez ici:
Site officiel "pont filtrant" pour Linux
Appliquez alors le patch à votre kernel, pour le 2.4.19 par exemple, allez dans le répertoire des sources du kernel et faites un :
patch -p1 < bridge-nf-0.0.7-against-2.4.19.diff
Recompilez alors votre kernel, en activant dans la partie Network Options :
Network Packet Filtering (remplace ipchains) (em module ou en natif)
Passez en module (ou en natif) toutes les options de :
IP: Netfilter Configuration
et activer aussi le support du pont :
[*] 802.1d Ethernet Bridging
A partir de ce moment, notre machine peut faire office de pont, et filtrer les paquets du pont.
Il vous faut aussi les utilitaires de configuration, c'est à dire les programmes pour configurer le pont lui-même, que vous téléchargez ici:
bridge-utils-0.9.6.tar.gz
Comme avec n'importe quelle source de programmes, vous "détarballez" et compilez le tout :
tar zxvf bridge-utils-0.9.6.tar.gz
cd bridge-utils
./configure
make
make install
Rappel : si votre distribution contient un paquetage pour bridge-utils, préférez utiliser ce paquetage plutôt que les sources. Certains puristes prétendrons qu'utiliser les sources c'est l'esprit Linux, mais ce sont surtout des problèmes de dépendances non gérées, des choix par forcément simple à faire sur l'utilisation de telle ou telle fonctionnalité du logiciel que l'on désire compiler.
Pour vérifier que votre distribution contient un paquetage pour bridge-utils, il faut utiliser l'outil de gestion de paquetage de celle-ci. Par exemple :
Votre distribution contient aussi presque surement un outil graphique pour obtenir cette information. Pour plus d'information sur ces questions, consulter cette documentation. |
Configuration du pont lui même
Comme nous l'avons dit plus haut, le pont en lui-même n'a pas besoin d'adresse IP (ni même d'adresse MAC) pour fonctionner. Donc dans un premier temps, nous enlevons toute adresse IP des deux cartes réseaux qui constituent notre pont, et les passons en mode "promisc" pour qu'elles puissent écouter tout le réseau et donc transférer les trames réseaux d'un réseau à l'autre.
ATTENTION Si vous etes en telnet ou ssh sur cette machine, la connexion va être coupée, faites donc ces manipulations en console sur la machine elle-même.
ifconfig eth0 0.0.0.0 promisc
ifconfig eth1 0.0.0.0 promisc
Maitenant nous mettons en place le pont lui-même, c'est-à-dire nous donnons un nom au bridge lui-même (mon-pont) et déclarons les interface réseaux qui vont servir au pont (eth0 et eth1):
brctl addbr mon-pont
brctl addif mon-pont eth0
brctl addif mon-pont eth1
Pour certains équipement actifs (switch, routeur, etc) le pont doit se "déclarer" pour que tout fonctionne bien. Si la connexion entre les deux réseaux ne fonctionne pas, essayez ces commandes (mais dans 90% des cas cela n'est pas nécessaire) :
brctl sethello mon-pont 1
brctl setfd mon-pont 4
Pour vérifier que tout marche, normalement toute machine du réseau1 doit pouvoir pinguer toutes les machines du réseau2 et inversement. Et si vous faites un "traceroute" d'une machine du réseau1 vers le réseau2 (ou inversement), vous ne verrez PAS le pont. Il se comporte là comme un simple "fil" reliant les deux réseaux.
Par contre, vous avez peut-être besoin d'accéder en réseau à la machine qui sert de pont (pour faire du ssh ou autre), il faut donc lui donner une adresse IP. Mais comment faire étant donné que les deux interfaces réseaux servent au pont ? Il y a deux solutions :
- Soit vous ajoutez une 3éme carte réseau a cette machine, que vous configurez normalement, avec une adresse IP etc....
- Soit vous configurez le pont lui-même AVEC une adresse Ip. Le pont se comporte donc exactement comme une interface réseau et pour lui affecter une adresse IP, on le fait de la même manière que pour une interface "normale", par exemple :
ifconfig mon-pont 192.168.1.50 netmask 255.255.255.0
Et si vous refaites des traceroute, vous ne le verrez toujours PAS sur le résultat du traceroute.
Placez toute ces commandes dans un fichier de démarrage de votre machine bien sur, pour ne pas avoir à tout retaper à chaque reboot.
Mise en place du Filtrage
Maitenant que notre pont est opérationnel, il ne reste plus qu'à lui appliquer les règles de filtrage que l'on souhaite. Comme le traffic réseau ne fait QUE le traverser, les règles de filtrage ne sont que des règles de forwarding bien sûr (pas de INPUT ni OUPUT). On applique les règles comme pour un firewall de type "gateway" sauf la chaîne "FORWARD".
Je vous donne ici un exemple de filtrage (à vous d'adapter, suivant votre réseau, vos applications - voir la rubrique iptable pour cela).
Appeler ce fichier rc.firewall par exemple et lancez-le au boot de la machine.
#!/bin/bash # Script Firewalling exemple PATH="/usr/sbin:$PATH" # On vide les chaines iptables -F #On efface toute les chaines utilisateurs iptables -X #Notre réseau que l'on sécurise: LANS="192.168.0.0/255.255.255.0" # Adresse de notre serveur web et ftp WEB="192.168.0.10" FTP="192.168.0.20" #On créé la chaine KEEP_STATE pour suivre l'état des connexions iptables -N KEEP_STATE iptables -F KEEP_STATE #On drop les paquets non valides iptables -A KEEP_STATE -m state --state INVALID -j DROP #On accepte les paquets provenant bien #d'une connexion et dont l'etat est correct iptables -A KEEP_STATE -m state --state RELATED,ESTABLISHED -j ACCEPT #On drop et log tout paquet dans un état incorect et #qui permet des scans/Denial of service iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH \ -m limit --limit 5/minute \ -j LOG --log-level notice --log-prefix "NMAP-XMAS: " iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN \ -m limit --limit 5/minute \ -j LOG --log-level notice --log-prefix "SYN/FIN: " iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST \ -m limit --limit 5/minute \ -j LOG --log-level notice --log-prefix "SYN/RST: " iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j DROP iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK \ -m limit --limit 5/minute \ -j LOG --log-level notice --log-prefix "RST/ACK: " iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -j DROP #On passe les paquets valides dans notre chaine KEEP_STATE iptables -A FORWARD -j KEEP_STATE #On permet le controle de "time exceeded" #et de "port not found" sur notre réseau iptables -A FORWARD -p udp -s $LANS --dport 11 -j ACCEPT iptables -A FORWARD -p udp -s $LANS --dport 3 -j ACCEPT #On permet le http sur notre serveur web iptables -A FORWARD -p tcp -d $WEB --dport 80 -j ACCEPT #On permet le Ftp sur notre serveur FTP iptables -A FORWARD -p tcp -d $FTP --dport 21 -j ACCEPT # Tout notre réseau a le droit de "sortir" vers l'internet iptables -A FORWARD -s $LANS -j ACCEPT # Tout ce qui n'est pas déclaré doit etre bloqué iptables -A FORWARD -j DROP
Copyright
Copyright © 01/11/2002, Tchesmeli serge
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. |