
                Linux Bridge+Firewall Mini-HOWTO version 1.2.0

Peter Breuer ( ptb@it.uc3m.es)
Adaptation franaise par Etienne BERNARD ( eb@via.ecp.fr)

   19 Dcembre 1997

1. Introduction

   Vous devriez lire l'original Bridging mini-HOWTO (NdT : ou en version
   franaise) par Chris Cole pour une vision diffrente sur le sujet.
   L'adresse email de Chris Cole est chris@polymer.uakron.edu. La version
   de cet HOWTO,  partir duquel ce document est construit est la version
   1.03, dat du 23 aot 1996.

2. Quoi, et pourquoi (et comment ?)

2.1 Quoi

   Un pont est un lment qui connecte intelligement des brins grce 
   deux cartes ethernet. Un _firewall_ est un lment isolant
   intelligent.

2.2 Pourquoi

   Si vous avez de nombreux ordinateur, vous pouvez dsirer installer un
   pont :

    1. pour conomiser le prix d'un nouveau _hub_ lorsqu'il se trouve que
       vous avez une carte ethernet libre ;
    2. pour viter d'avoir  apprendre l'_IP-forwarding_ et d'autres
       trucs alors que vous _avez_ deux cartes dans votre ordinateur ;
    3. pour viter des travaux de maintenance pour d'ventuels
       changements futurs !

   Le terme ``nombreux ordinateurs'' peut mme reprsenter seulement
   trois ordinateurs, si ceux-ci font du routage ou du pontage ou qu'ils
   changent de place dans la pice de temps en temps ! Vous pouvez mme
   vouloir un pont pour vous amuser  trouver  quoi cela sert. Je
   voulais un pont pour la raison 2.

   Si vous tes intress par le point 1, vous tes peu dans votre cas.
   Lisez le NET-2-HOWTO et le Serial-HOWTO pour de meilleurs astuces.

   Vous dsirez un _firewall_ si :

    1. vous essayez de protger votre rseau des accs extrieur, ou
    2. vous dsirez interdire l'accs au monde extrieur aux machines de
       votre rseau.

   Bizarrement, j'avais besoin du point 2 ici aussi. La politique de mon
   universit pour le moment est de ne pas jouer le rle de fournisseur
   d'accs  Internet pour les _undergraduates_.

2.3 Comment

   J'ai commenc par du pontage entre deux cartes rseau sur une machine
   jouant le rle de _firewall_, et j'ai fini par lancer le _firewall_
   sans avoir coup le pont. Cela a l'air de fonctionner, et c'est
   beaucoup plus flexible que chaque configuration isole. Je peux
   arrter le _firewall_ et continuer  faire fonctionner le pont ou
   arrter le pont lorsque je veux tre plus prudent.

   Je suppose que la partie ``pont'' du noyau se trouve juste au-dessus
   de la couche physique et que la partie _firewall_ se trouve dans une
   couche rseau suprieure, afin que les parties de pontage et de
   _firewalling_ agissent en fait comme si elles taient connectes en
   ``srie'' et non pas en ``parallle'' (aie !), selon le schma
   suivant :

-> Pont-entrant -> Firewall-entrant -> Noyau -> Firewall-sortant -> Pont-sortan
t ->

   Il n'y a pas d'autre faon d'expliquer comment une machine peut tre
   en mme temps ``conducteur'' et ``isolant''. Il existe quelques
   embuches, mais j'en parlerai plus tard. Schmatiquement, vous devez
   router les paquets que vous voulez filtrer. De toute faon, cela a
   l'air de fonctionner parfaitement pour moi, et voici comment...

3. PONT

3.1 Logiciel

   Rcuprez l' utilitaire de configuration du pont depuis la page
   personnelle d'Alan Cox. C'est la mme rfrence que dans le document
   de Chris. Je n'ai pas compris que c'tait un URL _ftp_ en non un URL
   _http_...

3.2 Lecture prliminaires

   Lisez le Multiple Ethernet HOWTO pour obtenir des conseils pour faire
   reconnatre et pour configurer plus d'une carte rseau.

   Vous pourrez trouver encore plus de dtails sur le type de commandes
   magiques  passer au _prompt_ se trouvent dans le Boot Prompt HOWTO.

   Pour complter vos lectures, lisez le NET-2 HOWTO. C'est un document
   plutt long, et vous devrez y piocher les dtails qui vous
   intressent.

3.3 Configuration de lancement

   Les lectures prcdentes vont vous indiquer ce dont vous avez besoin
   pour prparer le noyau  reconnatre un deuxime priphrique ethernet
   lors du dmarrage, en ajoutant la ligne suivante dans votre fichier
   /etc/lilo.conf, et en relanant lilo :

append = "ether=0,0,eth1"

   Notez le "eth1". "eth0" reprsente la premire carte. "eth1" est la
   seconde carte. Vous pouvez galement ajouter les paramtres de
   dmarrage  la ligne de commande que lilo vous offre. Pour trois
   cartes :

linux ether=0,0,eth1 ether=0,0,eth2

   J'utilise loadlin pour lancer mon noyau Linux depuis DOS :

loadlin.exe c:\vmlinuz root=/dev/hda3 ro ether=0,0,eth1 ether=0,0,eth2

   Notez que cette astuce oblige le noyau  dtecter les cartes au
   dmarrage. La dtection ne sera pas faite si vous chargez les
   gestionnaires de priphrique ethernet en _module_ (par scurit,
   puisque l'ordre de dtection ne peut tre dtermin), donc si vous
   utilisez des modules, vous aurez  ajouter l'IRQ approprie et le
   paramtre de port pour le gestionnaire de priphrique dans votre
   fichier /etc/conf.modules. Dans mon cas, j'ai les lignes :

alias eth0 3c509
alias eth1 de620
options 3c509 irq=5 io=0x210
options de620 irq=7 bnc=1

   Vous pouvez savoir si vous utilisez les modules en utilisant ``ps
   -aux'' pour voir si kerneld est lanc, et en vrifiant qu'il y a des
   fichiers .o dans un sous-rpertoire du rpertoire /lib/modules.
   Utilisez le nom de rpertoire que vous donne la commande uname -r. Si
   vous avez un kerneld lanc et/ou vous avez un fichier foo.o, ditez
   /etc/conf.modules et lisez avec soin la page de manuel de depmod.

   Notez galement que jusque rcemment (noyau 2.0.25), le _driver_ pour
   la carte _3c509_ ne pouvait pas tre utilis pour plus d'une carte
   s'il tait utilis en module. J'ai vu un _patch_ quelque part pour
   corriger cette limitation. Il devrait tre inclus dans le noyau 
   l'heure o vous lisez ces lignes.

3.4 Configuration du noyau

   Recompilez le noyau avec le _bridging_ :

CONFIG_BRIDGE=y

   J'ai galement compil mon noyau avec le _firewalling_,
   l'_IP-forwarding_ et l'_IP-masquerading_. C'est seulement si vous
   dsirez utiliser le _firewalling_ galement...

CONFIG_FIREWALL=y
CONFIG_NET_ALIAS=y
CONFIG_INET=y
CONFIG_IP_FORWARD=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_FIREWALL=y
CONFIG_IP_FIREWALL_VERBOSE=y
CONFIG_IP_MASQUERADE=y

   Vous aurez besoin en plus de la configuration rseau standard :

CONFIG_NET=y

   et je ne pense pas que vous deviez vous procupper des autres options
   rseau. Les options que je n'ai pas compil dans le noyau sont
   slectionnes en tant que modules afin que je puisse les ajouter
   ventuellement plus tard.

   Installez le nouveau noyau, relancez lilo et redmarrez sur le nouveau
   noyau. Rien ne devrait avoir chang pour l'instant !

3.5 Adresses rseau

   Chris dit qu'un pont ne doit pas avoir d'adresse IP mais ce n'est pas
   la configuration qui est prsent ici.

   Vous allez utiliser la machine pour vous connecter au rseau donc vous
   avez besoin d'une adresse et vous devez vous assurer que le device
   _loopback_ configur normalement afin que vos logiciels puisse
   communiquer avec ce  quoi ils s'attendent. Si _loopback_ est
   dsactiv, le _rsolveur de noms_ ou d'autres services ne
   fonctionneront pas. Voyez le NET-2-HOWTO, mais votre configuration
   standard devrait dj avoir fait cela :

ifconfig lo 127.0.0.1
route add -net 127.0.0.0

   Vous allez devoir donner des adresses  vos cartes rseau. J'ai chang
   le fichier /etc/rc.d/rc.inet1 de ma slackware (3.x) pour configurer
   deux cartes et vous devrez juste regarder votre fichier de
   configuration du rseau et doubler ou tripler le nombre d'instructions
   s'y trouvant. Supposons que vous ayez dj une adresse 

192.168.2.100

   (cette adresse fait partie des adresses rserves pour des rseaux
   privs, mais ne faites pas attention, cela ne cassera rien si vous
   utilisez cette adresse par erreur) alors vous avez probablement une
   ligne ressemblant 

ifconfig eth0 192.168.2.100 netmask 255.255.255.0 metric 1

   dans votre fichier de configuration. La premire chose que vous allez
   probablement vouloir faire est couper l'espace des adresses atteintes
   par cette carte en deux afin de pouvoir ventuellement faire un pont
   ou filtrer entre les deux moitis. Ajoutez donc une ligne qui rduit
   le masque de sous-rseau pour adresser un plus petit nombre de
   machines :

ifconfig eth0 netmask 255.255.255.128

   Essayez cette configuration. Cela restreint la carte  l'espace des
   adresses entre .0 et .127.

   A prsent, vous pouvez configurer votre deuxime carte dans la
   deuxime moiti de l'espace des adresses locales. Assurez vous que
   personne n'utilise l'adresse que vous allez prendre. Pour des raisons
   de symtrie, j'utiliserai ici 228=128+100. N'importe quelle adresse
   conviendra,  condition qu'elle ne se trouve pas dans le masque de
   l'autre carte. vitez les adresses spciales comme .0, .1, .128,
   etc...  moins que vous sachiez ce que vous faites.

ifconfig eth1 192.168.2.228 netmask 255.255.255.128 metric 1

   Cela restreint la deuxime carte aux adresses entre .128 et .255.

3.6 Routage rseau

   C'est ici que les dfauts de l'utilisation simultanne du pont et du
   firewall : vous ne pouvez pas filtrer des paquets qui ne sont pas
   routs. Pas de route, pas de firewall. Cette rgle est vrifie en
   tout cas dans les version 2.0.30 ou suivantes du noyau. Les filtres du
   firewall sont troitement lis au code source de l'IP-Forwarding.

   Cela ne signifie pas que vous ne pouvez pas utiliser le pont. Vous
   pouvez installer un pont entre deux cartes et filtrer  partir d'une
   troisime. Vous pouvez n'avoir que deux cartes et les faire filtrer
   une adresse IP externe, comme celle d'un routeur proche,  condition
   que le routeur reli  une seule carte.

   En d'autres termes, puisque je veux utiliser la machine comme
   firewall, je dois contrler avec prcision la destination physique de
   certains paquets.

   J'ai le petit rseau de machines sur un _hub_ connect  eth0, je
   configure donc un rseau de ce ct :

route add -net 192.168.2.128 netmask 255.255.255.128 dev eth0

   Remplacez le 128 par un 0 pour un rseau de classe C entier. Ici, je
   ne le fais pas puisque j'ai juste divis en deux l'espace d'adressage.
   Le "dev eth0" n'est pas ncessaire ici, puisque l'adresse de la carte
   fait partie de ce rseau, mais il peut tre ncessaire de l'crire
   chez vous. On pourrait dsirer plus d'une carte prenant ce sous rseau
   en charge (127 machines sur un segment, bravo !) mais ces cartes
   utiliseraient le mme masque de sous-rseau et seraient considres
   comme une seule par la partie routage du noyau.

   Sur l'autre carte, j'ai une ligne qui passe directement  travers un
   gros routeur, auquel je fais confiance.

                                             client 129
         __                                        |    __
client 1   \    .0                    .128         |   /   net 1
client 2 --- Hub - eth0 - Kernel - eth1 - Hub - Router --- net 2
client 3 __/       .100            .228         .2 |   \__ net 3
                                                   |
                                             client 254

   J'utilise une route fixe (c'est--dire "statique") depuis la carte
   vers ce routeur, puisque sinon il ferait partie du masque de
   sous-rseau de la premire carte et le noyau se tromperait sur la
   manire d'envoyer les paquets au routeur. Je veux filtrer ces paquets
   et c'est une raison de plus de les router explicitement.

route add 192.168.2.2 dev eth1

   Je n'en ai pas besoin, puisque je n'ai pas d'autres machines dans
   cette moiti de l'espace d'adressage, mais je dclare un rseau sur la
   seconde carte. La sparation de mes interfaces rseau en deux groupes
   grce au routage me permettra ventuellement de faire du filtrage trs
   prcis, mais vous pouvez trs bien vous en sortir avec beaucoup moins
   de routage que cela.

route add -net 192.168.2.128 netmask 255.255.255.128 dev eth1

   J'ai galement besoin d'envoyez tous les paquets non-locaux au monde
   et je dis donc au noyau de les envoyer au gros routeur :

route add default gw 192.168.2.2

3.7 configuration de la carte

   Nous avions auparavant une configuration standard pour le rseau, mais
   comme nous faisons du _bridging_, nous devons couter sur chaque carte
   les paquets qui ne nous sont pas destins. Ceci doit aller dans le
   fichier de configuration rseau :

ifconfig promisc eth0
ifconfig promisc eth1

   La page de manuel indique d'utiliser allmulti=promisc, mais cela ne
   fonctionnait pas pour moi.

3.8 Routage additionnel

   J'ai remarqu une chose : j'ai d passer la seconde carte dans un mode
   lui permettant aux questions du gros routeur  propos des machines que
   je cache sur mon rseau local.

ifconfig arp eth1

   Pour faire bonne mesure, j'ai effectu cette opration pour l'autre
   carte aussi.

ifconfig arp eth0

3.9 Configuration du pont

   Ajoutez la mise en route du pont dans votre fichier de configuration :

brcfg -enable

   La configuration du pont mettra en route certains ports. Vous pouvez
   exprimenter l'allumage et l'extinction des ports un  la fois :

brcfg -port 0 -disable/-enable
brcfg -port 1 -disable/-enable

   Vous pouvez obtenir un rapport sur l'tat courant avec :

brcfg

   sans aucun paramtres. Vous pourrez voir que le pont coute, apprend,
   et effectue le _forwarding_. (Je ne comprends pas pourquoi le code
   rpte la mme adresse matrielle pour mes deux cartes, mais peu
   importe... le HOWTO de Chris affirme que c'est correct).

3.10 Essais

   Si le rseau est encore en fonction, essayez votre script de
   configuration en vrai en arrtant les deux cartes et en l'excutant :

ifconfig eth0 down
ifconfig eth1 down
/etc/rc.d/rc.inet1

   Avec un peu de chance, les divers systmes tel _nfs_, _ypbind_, etc...
   ne s'en rendront pas compte. _N'essayez pas ceci si vous n'tes pas
   derrire le clavier !_

   Si vous dsirez tre plus prudent que cela, vous devrez arrter le
   plus de dmons possible, et dmonter les rpertoires NFS. Le pire
   qu'il puisse vous arriver est d'avoir  rebooter en mode _single-user_
   (le paramtre "_single_" de lilo ou loadlin), et de restaurer les
   fichiers  leur valeur d'avant les modifications.

3.11 Vrifications

   Vrifiez qu'il existe un trafic diffrent sur chaque interface :

tcpdump -i eth0

     (dans une fentre)
tcpdump -i eth1

     (dans une autre fentre)

   Vous devriez tre habitu  l'utilisation de _tcpdump_ pour trouver
   des vnements qui ne devraient pas se passer, ou qui existent mais ne
   devraient pas.

   Par exemple, recherchez les paquets qui ont travers le pont vers la
   seconde carte depuis le rseau interne. Ici, je cherche les paquets
   venant de la machine avec l'adresse .22 :

tcpdump -i eth1 -e host 192.168.2.22

   A prsent, envoyez un ping depuis l'hte en .22 vers le routeur. Vous
   devriez voir le paquet affich par tcpdump.

   A prsent, vous devriez avoir un pont, et qui possde galement deux
   adresses rseau. Vrifiez que vous pouvez les pinger depuis
   l'extrieur de votre rseau local et depuis l'intrieur, que vous
   pouvez utiliser telnet et ftp depuis et vers l'intrieur du rseau.

4. FIREWALLING

4.1 Logiciel et lectures

   Vous devriez lire le Firewall-HOWTO.

   Il vous indiquera o trouver ipfwadm si vous ne l'avez pas dj. Vous
   pouvez galement rcuprer d'autres outils, mais seulement ipfwadm m'a
   t utile. C'est pratique et de bas niveau ! Vous pouvez voir
   exactement ce qu'il fait.

4.2 Vrifications prliminaires

   Vous avez compil l'IP-forwarding et le masquerading dans le noyau, et
   vous allez vrifier que le _firewall_ est dans son tat par dfaut (il
   accepte) grce  :

ipfwadm -I -l
ipfwadm -O -l
ipfwadm -F -l

   Ce qui, dans l'ordre, "affiche les rgles affectant la partie
   .."entrante ou sortante ou qui fait suivre (_masquerading_) ".. du
   _firewall_". L'option "-l" signifie "lister".

   Si vous avez compil l'IP accounting galement :

ipfwadm -A -l

   Vous devriez constater qu'aucune rgle n'est dfinir et que l'action
   par dfaut est d'accepter tous les paquets. Vous pouvez retourner 
   cet tat  tout moment, avec :

ipfwadm -I -f
ipfwadm -O -f
ipfwadm -F -f

   L'option "-f" signifie "flush" (en franais, "vider"). Vous pourriez
   en avoir besoin.

4.3 Rgle par dfaut

   Je veux interdire l'accs au monde entier depuis mon rseau interne,
   et rien d'autre, donc je vais donner comme dernire rgle (comme rgle
   par dfaut) une rgle indiquant d'ignorer les paquets venant du rseau
   interne et dirigs vers l'extrieur. Je place toutes les rgles (dans
   cet ordre) dans le fichier /etc/rc.d/rc.firewall que j'execute depuis
   /etc/rc.d/rc.local au dmarrage.

ipfwadm -I -a reject -S 192.168.2.0/255.255.255.128 -D 0.0.0.0/0.0.0.0

   Le "-S" reprsente l'adresse source/masque de sous-rseau. L'option
   "-D" est pour l'adresse destination/masque de sous-rseau.

   Ce format n'a plus le vent en poupe. ipfwadm est intelligent et
   connat des abrviations courantes. Vrifier les pages de manuel.

   Il peut tre plus pratique de placer certaines ou toutes les rgles
   sur la partie sortante du firewall en utilise "-O" au lieu de "-I",
   mais je supposerai que les rgles sont conues pour tre utilises sur
   la moiti entrante.

4.4 Accs par adresse

   Avant la rgle par dfaut, je dois placer des rgles qui servent
   d'exceptions pour cette interdiction gnrale des services extrieurs
   aux clients intrieurs.

   Je veux traiter les adresses des machines derrire le firewall de
   manire spciale. Je veux empcher aux gens de se loguer sur la
   machine qui sert de firewall  moins qu'elles aient une permission
   spciale, mais une fois connectes, elles devraient tre capables de
   parler au monde extrieur.

ipfwadm -I -i accept -S 192.168.2.100/255.255.255.255 \
 -D 0.0.0.0/0.0.0.0

   Je veux galement que les clients internes soient capables de parler 
   la machine faisant _firewall_. Peut-tre pourront-elles la persuader
   de les laisser sortir !

ipfwadm -I -i accept -S 192.168.2.0/255.255.255.128 \
 -D 192.168.2.100/255.255.255.255

   Vrifiez que vous pouvez joindre les machines  l'intrieur du
   firewall depuis l'extrieur par telnet, mais que vous ne pouvez pas
   sortir. Vous pouvez faire le premier pas, mais les clients ne peuvent
   pas vous envoyer de messages. Essayez galement rlogin et ping avec
   tcpdump lanc sur une carte ou l'autre. Vous devriez tre capable de
   comprendre ce que vous lirez.

4.5 Accs par protocole

   J'assouplis les rgles protocole par protocole. Je veux que les pings
   depuis l'extrieur vers l'intrieur obtiennent une rponse, par
   exemple, donc j'ai ajout la rgle :

ipfwadm -I -i accept -P icmp -S 192.168.2.0/255.255.255.128 \
 -D 0.0.0.0/0.0.0.0

   L'option "-P icmp" correspond au protocole tout entier.

   Avant que j'installe un _proxy ftp_, j'autorise galement les appels
   ftp sortants en relchant les restrictions sur un port donn. Ceci
   vise les ports 20, 21 et 115 sur les machines externes :

ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 \
 -D 0.0.0.0/0.0.0.0 20 21 115

   Je n'ai pas pu faire fonctionner sendmail entre les clients locaux
   sans serveur de noms. Au lieu d'installer un serveur de nom
   directement sur le _firewall_, j'ai juste autoris les requtes TCP de
   rsolution de nom visant le plus proche serveur de nom, et j'ai plac
   son adresse dans le fichier /etc/resolv.conf des clients. ("nameserver
   123.456.789.31" sur une ligne spare).

ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 \
 -D 123.456.789.31/255.255.255.255 54

   Vous pouvez trouver quel numro de port et protocole requiert un
   service grce  tcpdump. Utilisez ce service avec un ftp ou un telnet
   ou autre vers ou depuis une machine interne, et observez-le sur les
   ports d'entre et de sortie du _firewall_ avec tcpdump :

tcpdump -i eth1 -e host client04

   par exemple. Le fichier /etc/services/ est une importante source
   d'indices. Pour laisser ENTRER le telnet et le ftp depuis l'extrieur,
   vous devez autoriser un client local  envoyer des donnes vers
   l'extrieur sur un port donn. Je comprends pourquoi ceci est
   ncessaire pour le ftp (c'est le serveur qui tablit la connexion de
   donnes), mais je me demande pourquoi telnet en a galement besoin.

ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 ftp telnet \
 -D 0.0.0.0/0.0.0.0

   Il existe un problme particulier avec certains dmons qui cherchent
   le nom d'hte de la machine _firewall_ afin de dcider quelle est leur
   adresse rseau. J'ai eu des problmes avec rpc.yppasswdd. Il insiste
   sur des informations _broadcast_ qui indiquent qu'il se trouve en
   dehors du _firewall_ (sur la seconde carte). Cela signifie que les
   clients  l'intrieur ne peuvent pas le contacter.

   Au lieu de lancer l'IP aliasing ou de changer le code source du dmon,
   j'ai traduit le nom vers l'adresse de la carte du ct intrieur sur
   les clients, dans leur fichier /etc/hosts.

4.6 Vrifications

   Vous voudrez tester que vous pouvez toujours utiliser telnet, rlogin
   et ping depuis l'extrieur. Depuis l'intrieur, vous devriez tre
   capable d'utiliser ping vers la sortie. Vous devriez galement tre
   capables d'utiliser le telnet vers la machine _firewall_ depuis
   l'intrieur, et cette dernire manipulation devrait vous permettre
   d'accder au reste.

   Et voil. A prsent, vous voulez probablement apprendre _rpc_/_Y_ellow
   _P_ages et leur interaction avec le fichier de mots de passe. Le
   rseau derrire le firewall devrait vouloir empcher aux utilisateurs
   non privilgis de se logguer sur le _firewall_, et donc de sortir.
   C'est trait dans un autre HOWTO !
