            Coupe-feu pour connexion par modem avec FreeBSD

  Marc Silver

   <marcs@draenor.org>

   $FreeBSD:
   release/9.1.0/fr_FR.ISO8859-1/articles/dialup-firewall/article.sgml
   38826 2012-05-17 19:12:14Z hrs $

   Cet article expose comment mettre en place un coupe-feu utilisant
   une connexion PPP par modem avec FreeBSD et IPFW, et
   specifiquement l'utilisation de coupe-feux pour une connexion par
   modem avec adresse IP dynamique. Ce document ne couvre pas en
   premier lieu la configuration de votre connexion PPP.

   La redistribution du code source (SGML), modifie ou non, et
   compile (HTML, PostScript, etc.) est soumise aux conditions
   suivantes :

    1. Le copyright ci-dessus, la presente liste de conditions et
       l'avertissement qui la suit doivent figurer dans le code
       source.

    2. Le code source distribue sous forme compilee doit faire
       apparaitre le copyright ci-dessus, la presente liste de
       conditions et l'avertissement qui la suit.

   CE DOCUMENT EST FOURNI ``TEL QU'EN L'ETAT'' PAR LE PROJET DE
   DOCUMENTATION FRANC,AISE DE FreeBSD ET IL N'EST DONNE AUCUNE
   GARANTIE, IMPLICITE OU EXPLICITE, QUANT A SON UTILISATION
   COMMERCIALE, PROFESSIONNELLE OU AUTRE. LES COLLABORATEURS DU
   PROJET DE DOCUMENTATION FRANC,AISE DE FreeBSD NE PEUVENT EN AUCUN
   CAS ETRE TENUS POUR RESPONSABLES DE QUELQUE DOMMAGE OU PREJUDICE
   DIRECT, INDIRECT, SECONDAIRE OU ACCESSOIRE (Y COMPRIS LES PERTES
   FINANCIeRES DUES AU MANQUE A GAGNER, A L'INTERRUPTION D'ACTIVITES,
   OU LA PERTE D'INFORMATIONS ET AUTRES) DECOULANT DE L'UTILISATION
   DE LA DOCUMENTATION OU DE L'IMPOSSIBILITE D'UTILISER CELLE-CI, ET
   DONT L'UTILISATEUR ACCEPTE L'ENTIERE RESPONSABILITE.

   Version franc,aise de Marc Fonvieille <blackend@FreeBSD.org>.

     --------------------------------------------------------------

1. Preface

   Coupe-feu pour connexion par modem avec FreeBSD

   Ce document couvre le processus requis pour configurer un
   coupe-feu avec FreeBSD quand votre fournisseur d'acces vous
   assigne une adresse IP dynamique. Alors que de nombreux efforts
   ont ete faits afin de rendre ce document aussi instructif et
   correct que possible, vous etes encourages `a envoyer vos
   commentaires/suggestions `a l'adresse <marcs@draenor.org>.

     --------------------------------------------------------------

2. Options du noyau

   La premiere chose dont vous aurez besoin est de recompiler votre
   noyau. Si vous avez besoin de plus d'informations sur comment
   recompiler un noyau, alors le meilleur endroit pour commencer est
   la section de configuration du noyau du manuel. Vous devez
   rajouter les options suivantes dans le fichier de configuration de
   votre noyau:

   options IPFIREWALL

           Integre au noyau le code de filtrage de paquets.

   options IPFIREWALL_VERBOSE

           Envoie les paquets traces au systeme de traces.

   options IPFIREWALL_VERBOSE_LIMIT=100

           Limite le nombre de paquets similaires traces. Cela evite
           que votre fichier de traces soit submerge de nombreuses
           entrees repetees. 100 est une valeur raisonnable, mais
           vous pouvez l'ajuster en fonction de vos besoins.

   options IPDIVERT

           Autorise le detournement des sockets, cela sera explicite
           plus tard.

   Il y a d'autres elements optionnels que vous pouvez rajouter dans
   le noyau pour plus de securite. Ils ne sont pas requis pour avoir
   un filtrage de paquets qui fonctionne, mais il se peut que
   quelques utilisateurs un peu plus paranoiaques desirent les
   utiliser.

   options TCP_DROP_SYNFIN

           Cette option ignore les paquets TCP avec les indicateurs
           SYN et FIN actives. Cela empeche certains utilitaires tel
           que nmap etc. d'identifier la pile TCP/IP de la machine,
           mais cela rompt le support des extensions RFC1644. Cela
           n'est pas recommande si la machine heberge un serveur web.

   Ne pas redemarrer une fois que vous avez recompile le noyau. Avec
   un peu de chance, nous n'aurons besoin de redemarrer qu'une fois
   pour achever l'installation du coupe-feu.

     --------------------------------------------------------------

3. Modifier /etc/rc.conf pour charger le coupe-feu

   Nous avons maintenant besoin de quelques modifications de
   /etc/rc.conf afin de signaler notre coupe-feu. Ajoutez simplement
   les lignes suivantes:

 firewall_enable="YES"
 firewall_script="/etc/firewall/fwrules"
 natd_enable="YES"
 natd_interface="tun0"
 natd_flags="-dynamic"

   Pour plus d'informations sur la fonction de ces elements jetez un
   coup d'oeil `a /etc/defaults/rc.conf et lisez la page de manuel
   rc.conf(5).

     --------------------------------------------------------------

4. Desactiver la traduction d'adresse reseau de PPP

   Il se peut que vous utilisiez dej`a la traduction d'adresse reseau
   (NAT) integree `a PPP. Si c'est le cas alors vous aurez `a la
   desactiver, etant donne que nos exemples utilisent natd(8) pour
   faire la meme chose.

   Si vous avez dej`a un ensemble d'options pour demarrer
   automatiquement PPP, cela doit probablement ressembler `a ceci:

 ppp_enable="YES"
 ppp_mode="auto"
 ppp_nat="YES"
 ppp_profile="profile"

   Si c'est le cas, vous devrez specifiquement desactiver ppp_nat en
   vous assurant que vous avez bien la ligne ppp_nat="NO" dans
   /etc/rc.conf. Vous devrez egalement retirer les lignes nat enable
   yes ou alias enable yes de /etc/ppp/ppp.conf.

     --------------------------------------------------------------

5. Le jeu de regles pour le coupe-feu

   Nous avons presque termine. Tout ce qu'il reste `a faire est de
   definir les regles du coupe-feu et alors nous pourrons redemarrer,
   et notre coupe-feu devrait fonctionner. Je me suis rendu compte
   que chacun desirera quelque chose de legerement different quand il
   est question de son ensemble de regles. Ce que j'ai essaye de
   faire est d'ecrire un ensemble de regles qui conviendra `a la
   plupart des utilisateurs de modems. Vous pouvez bien evidement le
   modifier selon vos besoins en utilisant les regles suivantes comme
   fondation pour votre propre ensemble de regles. Tout d'abord
   commenc,ons avec les bases du filtrage ferme. Ce que vous voulez
   faire est de refuser tout par defaut et ensuite n'autoriser que
   les choses dont vous avez vraiment besoin. Les regles devraient
   etre ordonnees de fac,on `a autoriser tout d'abord puis ensuite
   refuser. Le principe est que vous ajoutiez les regles pour vos
   autorisations, et ensuite tout est refuse. :)

   Maintenant, creons le repertoire /etc/firewall. Allez dans ce
   repertoire et editez le fichier fwrules comme nous l'avons
   specifie dans rc.conf. S'il vous plait, notez que vous pouvez
   changer le nom de ce fichier pour celui que vous desirez. Ce guide
   donne juste un exemple de nom de fichier.

   Maintenant, jettons un coup d'oeil `a cet exemple de fichier de
   coupe-feu, qui est minutieusement commente.

 # Regles du coupe-feu
 # Ecrit par Marc Silver (marcs@draenor.org)
 # http://draenor.org/ipfw
 # Librement distribuable


 # Definie la commande du coupe-feu (comme dans /etc/rc.firewall)
 # pour une reference aisee. Facilite la lecture.
 fwcmd="/sbin/ipfw"

 # Vide les regles actuelles avant rechargement.
 $fwcmd -f flush

 # Detourne tous les paquets `a travers l'interface tunnel
 $fwcmd add divert natd all from any to any via tun0

 # Autorise toutes les donnees de ma carte reseau et de l'hote local.
 # Soyez sur de changer votre carte reseau (la mienne etait fxp0) avant
 # de redemarrer.  :)
 $fwcmd add allow ip from any to any via lo0
 $fwcmd add allow ip from any to any via fxp0

 # Autorise toute les connexions dont je suis l'initiateur.
 $fwcmd add allow tcp from any to any out xmit tun0 setup

 # Une fois les connexions etablies, les autorise `a rester ouvertes.
 $fwcmd add allow tcp from any to any via tun0 established

 # Tous le monde sur internet est autorise `a se connecter aux services
 # suivants sur la machine.  Cet exemple autorise specifiquement les
 # connexions `a ssh et apache.
 $fwcmd add allow tcp from any to any 80 setup
 $fwcmd add allow tcp from any to any 22 setup

 # Ceci envoie un RESET `a tous les paquets ident.
 $fwcmd add reset log tcp from any to any 113 in recv tun0

 # Autorise les requettes DNS sortantes SEULEMENT vers les serveurs
 # specifies.
 $fwcmd add allow udp from any to x.x.x.x 53 out xmit tun0

 # Autorise leur retour avec les reponses...  :)
 $fwcmd add allow udp from x.x.x.x 53 to any in recv tun0

 # Autorise l'ICMP (pour permettre `a ping et traceroute de fonctionner).
 # Vous pouvez peut-etre desirer desactiver ceci, mais je pense que cela
 # repond `a mes besoins de les conserver ainsi.
 $fwcmd add allow icmp from any to any

 # Bloque tout le reste.
 $fwcmd add deny log ip from any to any

   Vous disposez desormais d'un coupe-feu tout `a fait fonctionnel
   qui autorisera les connexions sur les ports 80 et 22 et tracera
   tout autre tentative de connexion. Maintenant, vous devriez etre
   en mesure de redemarrer sans risques et votre coupe-feu devrait se
   lancer sans problemes. Si vous trouvez une quelconque erreur ou
   experimentez des problemes, ou que vous avez des suggestions pour
   ameliorer ce document, s'il vous plait ecrivez-moi.

     --------------------------------------------------------------

6. Questions

   6.1. Pourquoi utilisez-vous natd(8) et ipfw(8) alors que vous
   pourriez utiliser les filtres integres `a ppp(8)?

   6.2. J'obtiens des messages du type "limit 100 reached on entry
   2800" et apres cela je ne vois plus jamais de refus dans mes
   traces. Mon coupe-feu fonctionne-t-il toujours?

   6.3. Si j'utilise des adresses privees en interne, comme dans la
   plage 192.168.0.0, pourrais-je ajouter une commande comme $fwcmd
   add deny all from any to 192.168.0.0:255.255.0.0 via tun0 aux
   regles du coupe-feu pour prevenir les tentatives externes de
   connexions vers les machines internes?

   6.4. Il doit y avoir quelque chose d'errone. J'ai suivi vos
   instructions `a la lettre et maintenant tout est bloque.

   6.1. Pourquoi utilisez-vous natd(8) et ipfw(8) alors que vous
   pourriez utiliser les filtres integres `a ppp(8)?

   Je serais honnete et dirais qu'il n'y a aucune raison definitive
   pour que j'utilise ipfw et natd plutot que les filtres integres `a
   ppp. D'apres les discussions que j'ai eu avec de nombreuses
   personnes le consensus semble etre qu'ipfw est certainement plus
   puissant et configurable que les filtres ppp, mais ce qu'il
   apporte dans la fonctionnalite il le perd en facilite
   d'utilisation. Une des raisons de mon utilisation est que je
   prefere que le filtrage de paquets soit fait au niveau du noyau
   plutot que par un programme utilisateur.

   6.2. J'obtiens des messages du type "limit 100 reached on entry
   2800" et apres cela je ne vois plus jamais de refus dans mes
   traces. Mon coupe-feu fonctionne-t-il toujours?

   Cela signifie simplement que le nombre maximal de traces pour la
   regle a ete atteint. La regle fonctionne toujours, mais elle
   n'enregistrera plus de trace jusqu'au moment ou vous
   reinitialiserez les compteurs de traces. Vous pouvez reinitialiser
   les compteurs de traces avec la commande ipfw resetlog.
   Alternativement, vous pouvez augmenter la limite de trace dans la
   configuration de votre noyau avec l'option
   IPFIREWALL_VERBOSE_LIMIT comme decrit precedemment. Vous pouvez
   egalement changer cette limite (sans recompiler votre noyau ou
   avoir `a redemarrer) en utilisant la valeur sysctl(8)
   net.inet.ip.fw.verbose_limit.

   6.3. Si j'utilise des adresses privees en interne, comme dans la
   plage 192.168.0.0, pourrais-je ajouter une commande comme $fwcmd
   add deny all from any to 192.168.0.0:255.255.0.0 via tun0 aux
   regles du coupe-feu pour prevenir les tentatives externes de
   connexions vers les machines internes?

   Une reponse simple est non. La raison de cela est que natd
   effectue la traduction d'adresse pour tout ce qui sera detourne `a
   travers le peripherique tun0. En ce qui concerne les paquets
   entrant, ces derniers ne parleront qu'`a l'adresse IP
   dynamiquement assignee et non pas au reseau interne. Notez que
   cependant vous pouvez ajouter une regle comme $fwcmd add deny all
   from 192.168.0.4:255.255.0.0 to any via tun0 qui limiterait un
   hote de votre reseau interne de sortir via le coupe-feu.

   6.4. Il doit y avoir quelque chose d'errone. J'ai suivi vos
   instructions `a la lettre et maintenant tout est bloque.

   Ce guide suppose que vous utilisez userland-ppp aussi le jeu de
   regle donne intervient sur l'interface tun0, qui correspond `a la
   premiere connexion etablie avec ppp(8) (a.k.a. user-ppp). Les
   connexions supplementaires utiliseront tun1, tun2 et ainsi de
   suite.

   Vous devriez egalement noter que pppd(8) utilise `a la place
   l'interface ppp0, donc si vous etablissez une connexion avec
   pppd(8) vous devez remplacer tun0 par ppp0. Une fac,on rapide
   d'editer les regles du coupe-feu pour refleter ce changement est
   presentee ci-dessous. Le jeu de regles original est sauvegarde
   sous fwrules_tun0.

             % cd /etc/firewall
             /etc/firewall% su
             Password:
             /etc/firewall# mv fwrules fwrules_tun0
             /etc/firewall# cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules
          

   Pour savoir si vous utilisez actuellement ppp(8) ou pppd(8) vous
   pouvez examiner la sortie d'ifconfig(8) une fois que la connexion
   est etablie. E.g., pour une connexion faite par pppd(8) vous
   verriez quelque chose comme ceci (on ne montre que les lignes
   importantes):

             % ifconfig
             (skipped...)
             ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xff000000
             (skipped...)
            

   D'autre part, pour une connexion faite avec ppp(8) (user-ppp) vous
   devriez voir quelque chose de similaire `a:

             % ifconfig
             (skipped...)
             ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
             (skipped...)
             tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524
                     (IPv6 stuff skipped...)
                     inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xffffff00
                     Opened by PID xxxxx
             (skipped...)

     --------------------------------------------------------------

        Ce document, ainsi que d'autres peut etre telecharge sur
                   ftp.FreeBSD.org/pub/FreeBSD/doc/.

Pour toutes questions `a propos de FreeBSD, lisez la documentation avant
                 de contacter <questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.
