<HTML> <HEAD> <TITLE>PONT</TITLE> </HEAD> <BODY> <A NAME="BRIDGING"></A> <H1>3. <A NAME="s3"></A>PONT</H1> <P> <A HREF="Bridge+Firewall.html#toc3">Contenu de cette section</A></P> <A NAME="Software"></A> <H2>3.1 <A NAME="ss3.1"></A> Logiciel</H2> <P>Récupérez l' <A HREF="ftp://shadow.cabi.net/pub/Linux/BRCFG.tgz">utilitaire de configuration du pont</A> depuis la page personnelle d'Alan Cox. C'est la même référence que dans le document de Chris. Je n'ai pas compris que c'était un URL <EM>ftp</EM> en non un URL <EM>http</EM>...</P> <P></P> <A NAME="Prior Reading"></A> <H2>3.2 <A NAME="ss3.2"></A> Lecture préliminaires</H2> <P>Lisez le <A HREF="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/mini/Multiple-Ethernet">Multiple Ethernet HOWTO</A> pour obtenir des conseils pour faire reconnaître et pour configurer plus d'une carte réseau.</P> <P></P> <P>Vous pourrez trouver encore plus de détails sur le type de commandes magiques à passer au <EM>prompt</EM> se trouvent dans le <A HREF="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/BootPrompt-HOWTO">Boot Prompt HOWTO</A> .</P> <P></P> <P>Pour compléter vos lectures, lisez le <A HREF="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/NET-2-HOWTO">NET-2 HOWTO</A> . C'est un document plutôt long, et vous devrez y piocher les détails qui vous intéressent.</P> <P></P> <A NAME="Boot configuration"></A> <H2>3.3 <A NAME="ss3.3"></A> Configuration de lancement</H2> <P>Les lectures précédentes vont vous indiquer ce dont vous avez besoin pour préparer le noyau à reconnaître un deuxième périphérique ethernet lors du démarrage, en ajoutant la ligne suivante dans votre fichier <CODE>/etc/lilo.conf</CODE>, et en relançant <CODE>lilo</CODE> :</P> <P> <BLOCKQUOTE><CODE> <PRE> append = 'ether=0,0,eth1' </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Notez le 'eth1'. 'eth0' représente la première carte. 'eth1' est la seconde carte. Vous pouvez également ajouter les paramètres de démarrage à la ligne de commande que <CODE>lilo</CODE> vous offre. Pour trois cartes :</P> <P> <BLOCKQUOTE><CODE> <PRE> linux ether=0,0,eth1 ether=0,0,eth2 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>J'utilise <CODE>loadlin</CODE> pour lancer mon noyau Linux depuis DOS : </P> <P> <BLOCKQUOTE><CODE> <PRE> loadlin.exe c:\vmlinuz root=/dev/hda3 ro ether=0,0,eth1 ether=0,0,eth2 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Notez que cette astuce oblige le noyau à détecter les cartes au démarrage. La détection ne sera pas faite si vous chargez les gestionnaires de périphérique ethernet en <B>module</B> (par sécurité, puisque l'ordre de détection ne peut être déterminé), donc si vous utilisez des modules, vous aurez à ajouter l'IRQ appropriée et le paramètre de port pour le gestionnaire de périphérique dans votre fichier <CODE>/etc/conf.modules</CODE>. Dans mon cas, j'ai les lignes :</P> <P> <BLOCKQUOTE><CODE> <PRE> alias eth0 3c509 alias eth1 de620 options 3c509 irq=5 io=0x210 options de620 irq=7 bnc=1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Vous pouvez savoir si vous utilisez les modules en utilisant ``ps -aux'' pour voir si <CODE>kerneld</CODE> est lancé, et en vérifiant qu'il y a des fichiers <CODE>.o</CODE> dans un sous-répertoire du répertoire <CODE>/lib/modules</CODE>. Utilisez le nom de répertoire que vous donne la commande <CODE>uname -r</CODE>. Si vous avez un <CODE>kerneld</CODE> lancé et/ou vous avez un fichier <CODE>foo.o</CODE>, éditez <CODE>/etc/conf.modules</CODE> et lisez avec soin la page de manuel de <CODE>depmod</CODE>.</P> <P></P> <P>Notez également que jusque récemment (noyau 2.0.25), le <EM>driver</EM> pour la carte <B>3c509</B> ne pouvait pas être utilisé pour plus d'une carte s'il était utilisé en module. J'ai vu un <EM>patch</EM> quelque part pour corriger cette limitation. Il devrait être inclus dans le noyau à l'heure où vous lisez ces lignes.</P> <P></P> <A NAME="Kernel configuration"></A> <H2>3.4 <A NAME="ss3.4"></A> Configuration du noyau</H2> <P>Recompilez le noyau avec le <EM>bridging</EM> :</P> <P> <BLOCKQUOTE><CODE> <PRE> CONFIG_BRIDGE=y </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>J'ai également compilé mon noyau avec le <EM>firewalling</EM>, l'<EM>IP-forwarding</EM> et l'<EM>IP-masquerading</EM>. C'est seulement si vous désirez utiliser le <EM>firewalling</EM> également...</P> <P> <BLOCKQUOTE><CODE> <PRE> 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 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Vous aurez besoin en plus de la configuration réseau standard :</P> <P> <BLOCKQUOTE><CODE> <PRE> CONFIG_NET=y </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>et je ne pense pas que vous deviez vous préocupper des autres options réseau. Les options que je n'ai pas compilé dans le noyau sont sélectionnées en tant que modules afin que je puisse les ajouter éventuellement plus tard.</P> <P></P> <P>Installez le nouveau noyau, relancez <CODE>lilo</CODE> et redémarrez sur le nouveau noyau. Rien ne devrait avoir changé pour l'instant !</P> <P></P> <A NAME="Network addresses"></A> <H2>3.5 <A NAME="ss3.5"></A> Adresses réseau</H2> <P>Chris dit qu'un pont ne doit pas avoir d'adresse IP mais ce n'est pas la configuration qui est présenté ici.</P> <P></P> <P>Vous allez utiliser la machine pour vous connecter au réseau donc vous avez besoin d'une adresse et vous devez vous assurer que le device <EM>loopback</EM> configuré normalement afin que vos logiciels puisse communiquer avec ce à quoi ils s'attendent. Si <EM>loopback</EM> est désactivé, le <EM>résolveur de noms</EM> ou d'autres services ne fonctionneront pas. Voyez le NET-2-HOWTO, mais votre configuration standard devrait déjà avoir fait cela :</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig lo 127.0.0.1 route add -net 127.0.0.0 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Vous allez devoir donner des adresses à vos cartes réseau. J'ai changé le fichier <CODE>/etc/rc.d/rc.inet1</CODE> de ma slackware (3.x) pour configurer deux cartes et vous devrez juste regarder votre fichier de configuration du réseau et doubler ou tripler le nombre d'instructions s'y trouvant. Supposons que vous ayez déjà une adresse à</P> <P> <BLOCKQUOTE><CODE> <PRE> 192.168.2.100 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>(cette adresse fait partie des adresses réservées pour des réseaux privés, mais ne faites pas attention, cela ne cassera rien si vous utilisez cette adresse par erreur) alors vous avez probablement une ligne ressemblant à</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig eth0 192.168.2.100 netmask 255.255.255.0 metric 1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>dans votre fichier de configuration. La première 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 moitiés. Ajoutez donc une ligne qui réduit le masque de sous-réseau pour adresser un plus petit nombre de machines :</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig eth0 netmask 255.255.255.128 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Essayez cette configuration. Cela restreint la carte à l'espace des adresses entre .0 et .127.</P> <P></P> <P>A présent, vous pouvez configurer votre deuxième carte dans la deuxième moitié de l'espace des adresses locales. Assurez vous que personne n'utilise l'adresse que vous allez prendre. Pour des raisons de symétrie, 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 spéciales comme .0, .1, .128, etc... à moins que vous sachiez ce que vous faites.</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig eth1 192.168.2.228 netmask 255.255.255.128 metric 1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Cela restreint la deuxième carte aux adresses entre .128 et .255. </P> <P></P> <A NAME="Network routing"></A> <H2>3.6 <A NAME="ss3.6"></A> Routage réseau</H2> <P>C'est ici que les défauts de l'utilisation simultannée du pont et du firewall : vous ne pouvez pas filtrer des paquets qui ne sont pas routés. Pas de route, pas de firewall. Cette règle est vérifiée en tout cas dans les version 2.0.30 ou suivantes du noyau. Les filtres du firewall sont étroitement liés au code source de l'IP-Forwarding.</P> <P></P> <P>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 troisième. 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.</P> <P></P> <P>En d'autres termes, puisque je veux utiliser la machine comme firewall, je dois contrôler avec précision la destination physique de certains paquets.</P> <P></P> <P>J'ai le petit réseau de machines sur un <EM>hub</EM> connecté à <CODE>eth0</CODE>, je configure donc un réseau de ce côté :</P> <P> <BLOCKQUOTE><CODE> <PRE> route add -net 192.168.2.128 netmask 255.255.255.128 dev eth0 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Remplacez le 128 par un 0 pour un réseau 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 nécessaire ici, puisque l'adresse de la carte fait partie de ce réseau, mais il peut être nécessaire de l'écrire chez vous. On pourrait désirer plus d'une carte prenant ce sous réseau en charge (127 machines sur un segment, bravo !) mais ces cartes utiliseraient le même masque de sous-réseau et seraient considérées comme une seule par la partie routage du noyau.</P> <P></P> <P>Sur l'autre carte, j'ai une ligne qui passe directement à travers un gros routeur, auquel je fais confiance.</P> <P> <PRE> 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 </PRE> </P> <P></P> <P>J'utilise une route fixe (c'est-à-dire 'statique') depuis la carte vers ce routeur, puisque sinon il ferait partie du masque de sous-réseau de la première carte et le noyau se tromperait sur la manière d'envoyer les paquets au routeur. Je veux filtrer ces paquets et c'est une raison de plus de les router explicitement.</P> <P> <BLOCKQUOTE><CODE> <PRE> route add 192.168.2.2 dev eth1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Je n'en ai pas besoin, puisque je n'ai pas d'autres machines dans cette moitié de l'espace d'adressage, mais je déclare un réseau sur la seconde carte. La séparation de mes interfaces réseau en deux groupes grâce au routage me permettra éventuellement de faire du filtrage très précis, mais vous pouvez très bien vous en sortir avec beaucoup moins de routage que cela.</P> <P> <BLOCKQUOTE><CODE> <PRE> route add -net 192.168.2.128 netmask 255.255.255.128 dev eth1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>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 :</P> <P> <BLOCKQUOTE><CODE> <PRE> route add default gw 192.168.2.2 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <A NAME="Card configuration"></A> <H2>3.7 <A NAME="ss3.7"></A> configuration de la carte</H2> <P>Nous avions auparavant une configuration standard pour le réseau, mais comme nous faisons du <EM>bridging</EM>, nous devons écouter sur chaque carte les paquets qui ne nous sont pas destinés. Ceci doit aller dans le fichier de configuration réseau :</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig promisc eth0 ifconfig promisc eth1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>La page de manuel indique d'utiliser <CODE>allmulti=promisc</CODE>, mais cela ne fonctionnait pas pour moi.</P> <P></P> <A NAME="Additional routing"></A> <H2>3.8 <A NAME="ss3.8"></A> Routage additionnel</H2> <P>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 réseau local.</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig arp eth1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Pour faire bonne mesure, j'ai effectué cette opération pour l'autre carte aussi.</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig arp eth0 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <A NAME="Bridge Configuration"></A> <H2>3.9 <A NAME="ss3.9"></A> Configuration du pont</H2> <P>Ajoutez la mise en route du pont dans votre fichier de configuration :</P> <P> <BLOCKQUOTE><CODE> <PRE> brcfg -enable </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>La configuration du pont mettra en route certains ports. Vous pouvez expérimenter l'allumage et l'extinction des ports un à la fois :</P> <P> <BLOCKQUOTE><CODE> <PRE> brcfg -port 0 -disable/-enable brcfg -port 1 -disable/-enable </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Vous pouvez obtenir un rapport sur l'état courant avec :</P> <P> <BLOCKQUOTE><CODE> <PRE> brcfg </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>sans aucun paramètres. Vous pourrez voir que le pont écoute, apprend, et effectue le <EM>forwarding</EM>. (Je ne comprends pas pourquoi le code répète la même adresse matérielle pour mes deux cartes, mais peu importe... le HOWTO de Chris affirme que c'est correct).</P> <P></P> <A NAME="Try it out"></A> <H2>3.10 <A NAME="ss3.10"></A> Essais</H2> <P>Si le réseau est encore en fonction, essayez votre script de configuration en vrai en arrêtant les deux cartes et en l'exécutant :</P> <P> <BLOCKQUOTE><CODE> <PRE> ifconfig eth0 down ifconfig eth1 down /etc/rc.d/rc.inet1 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>Avec un peu de chance, les divers systèmes tel <B>nfs</B>, <B>ypbind</B>, etc... ne s'en rendront pas compte. <I>N'essayez pas ceci si vous n'êtes pas derrière le clavier !</I></P> <P></P> <P>Si vous désirez être plus prudent que cela, vous devrez arrêter le plus de démons possible, et démonter les répertoires NFS. Le pire qu'il puisse vous arriver est d'avoir à rebooter en mode <EM>single-user</EM> (le paramètre '<B>single</B>' de <CODE>lilo</CODE> ou <CODE>loadlin</CODE>), et de restaurer les fichiers à leur valeur d'avant les modifications.</P> <P></P> <H2>3.11 <A NAME="ss3.11"></A> Vérifications</H2> <P>Vérifiez qu'il existe un trafic différent sur chaque interface :</P> <P> <BLOCKQUOTE><CODE> <PRE> tcpdump -i eth0 </PRE> (dans une fenêtre) <PRE> tcpdump -i eth1 </PRE> (dans une autre fenêtre) </CODE></BLOCKQUOTE> </P> <P></P> <P>Vous devriez être habitué à l'utilisation de <B>tcpdump</B> pour trouver des évènements qui ne devraient pas se passer, ou qui existent mais ne devraient pas.</P> <P></P> <P>Par exemple, recherchez les paquets qui ont traversé le pont vers la seconde carte depuis le réseau interne. Ici, je cherche les paquets venant de la machine avec l'adresse .22 :</P> <P> <BLOCKQUOTE><CODE> <PRE> tcpdump -i eth1 -e host 192.168.2.22 </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <P>A présent, envoyez un ping depuis l'hôte en .22 vers le routeur. Vous devriez voir le paquet affiché par tcpdump.</P> <P></P> <P>A présent, vous devriez avoir un pont, et qui possède également deux adresses réseau. Vérifiez que vous pouvez les <CODE>ping</CODE>er depuis l'extérieur de votre réseau local et depuis l'intérieur, que vous pouvez utiliser <CODE>telnet</CODE> et <CODE>ftp</CODE> depuis et vers l'intérieur du réseau.</P> <P></P> <HR> <P> Chapitre <A HREF="Bridge+Firewall-4.html">suivant</A>, Chapitre <A HREF="Bridge+Firewall-2.html">Précédent</A> <P> Table des matières de <A HREF="Bridge+Firewall.html#toc3">ce chapitre</A>, <A HREF="Bridge+Firewall.html#toc">Table des matières</A> générale</P> <P> <A HREF="Bridge+Firewall.html">Début</A> du document, <A HREF="#0"> Début de ce chapitre</A></P> </BODY> </HTML>