Mini How-To sur la configuration de l'aliasing IP sous Linux <author>Harish Pillay, <tt><htmlurl url="mailto:h.pillay@ieee.org" name="h.pillay@ieee.org"></tt><newline> Version Française par Laurent Caillat-Vallet, <tt><htmlurl url="mailto:caillat@univ.lyon1.fr" name="caillat@univ-lyon1.fr"></tt> <date>13 Janvier 1997 <abstract> C'est une recette de cuisine pour configurer et utiliser l'aliasing IP sous Linux. </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <sect>Synopsis <p> C'est une recette de cuisine sur la manière de configurer et d'utiliser l'aliasing IP sur une machine Linux. De plus, il y a des instructions pour configurer la machine pour recevoir du courrier électronique sur les numéros alias IP. <newline> <newline> (<tt>NDT: l'aliasing IP permet d'associer plusieurs adresses IP sur la même interface réseau.</tt>) <sect>Ma configuration <p> <itemize> <item> le dernier noyau (2.0.27 - depuis ftp.funet.fi:/pub/Linux/kernel/src/v2.0) cela fonctionne depuis les noyaux 1.3.7x. <item> Aliasing IP compilé en module chargeable. Vous auriez du indiquer à la commande "make config", pour compiler votre noyau, que vous voulez compiler l'option IP masquerade en <bf>(M)</bf>odule (<tt>NDT: c'est plutôt l'option IP Aliasing</tt>). Vérifiez dans le HOW-TO sur les modules (s'il existe), ou vérifiez dans le fichier /usr/src/linux/Documentation/modules.txt. <item> Je dois fournir 2 adresses IP en plus de celle qui m'est déjà attribuée. <item> Un adaptateur de poche D-Link DE620 (ce n'est pas important, cela fonctionne avec n'importe quel adaptateur réseau supporté par Linux). </itemize> <sect>Commandes <p> <itemize> <item> Premièrement, chargez le module IP alias (vous pouvez sauter cette étape si vous avez compilé ce module dans le noyau): <tscreen><verb> /sbin/insmod /lib/modules/`uname -r`/ipv4/ip_alias.o </verb></tscreen> <item> Deuxièmement, configurez les interfaces loopback, eth0 et tous les numéros IP, en commençant par le numéro IP principal pour l'interface eth0: <tscreen><verb> /sbin/ifconfig lo 127.0.0.1 /sbin/ifconfig eth0 up /sbin/ifconfig eth0 172.16.3.1 /sbin/ifconfig eth0:0 172.16.3.10 /sbin/ifconfig eth0:1 172.16.3.100 </verb></tscreen> 172.16.3.1 est le numéro IP principal, alors que .10 et .100 sont les aliases. La magie vient de <tt>eth0:x</tt>, ou x=0,1,3,...n pour les différents numéros IP. Le numéro IP principal n'a pas besoin d'alias. <newline> <newline> <item> Troisièmement, configurez les routes. D'abord la route pour l'interface loopback, puis le réseau, et finalement les numéros IP variés en commençant par celui par défaut (alloué originellement): <tscreen><verb> /sbin/route add -net 127.0.0.0 /sbin/route add -net 172.16.3.0 dev eth0 /sbin/route add -host 172.16.3.1 dev eth0 /sbin/route add -host 172.16.3.10 dev eth0:0 /sbin/route add -host 172.16.3.100 dev eth0:1 /sbin/route add default gw 172.16.3.200 </verb></tscreen> </itemize> C'est tout. Dans l'exemple ci-dessus, j'utilise les numéros IP privés (<tt>RFC 1918</tt>) dans un but d'illustration. Remplacez-les par vos propres numéros IP, officiels ou privés. L'exemple ne montre que 3 numéros IP. Le maximum est défini à 256 dans <tt>/usr/include/linux/net_alias.h</tt>. 256 numéros IP sur UNE carte, c'est beaucoup :-) ! Voila à quoi ressemble mon <tt>/sbin/ifconfig</tt>: <tscreen><verb> lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 RX packets:5088 errors:0 dropped:0 overruns:0 TX packets:5088 errors:0 dropped:0 overruns:0 eth0 Link encap:10Mbps Ethernet HWaddr 00:8E:B8:83:19:20 inet addr:172.16.3.1 Bcast:172.16.3.255 Mask:255.255.255.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:334036 errors:0 dropped:0 overruns:0 TX packets:11605 errors:0 dropped:0 overruns:0 Interrupt:7 Base address:0x378 eth0:0 Link encap:10Mbps Ethernet HWaddr 00:8E:B8:83:19:20 inet addr:172.16.3.10 Bcast:172.16.3.255 Mask:255.255.255.0 UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 TX packets:0 errors:0 dropped:0 overruns:0 eth0:1 Link encap:10Mbps Ethernet HWaddr 00:8E:B8:83:19:20 inet addr:172.16.3.100 Bcast:172.16.3.255 Mask:255.255.255.0 UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:1 errors:0 dropped:0 overruns:0 TX packets:0 errors:0 dropped:0 overruns:0 </verb></tscreen> Et <tt>/proc/net/aliases</tt>: <tscreen><verb> device family address eth0:0 2 172.16.3.10 eth0:1 2 172.16.3.100 </verb></tscreen> Et <tt>proc/net/alias_types</tt>: <tscreen><verb> type name n_attach 2 ip 2 </verb></tscreen> Bien sûr, les données de <tt>/proc/net</tt> ont été créées par la commande <tt>ifconfig</tt>, et non à la main! <sect>Questions <p> <sect1>Comment garder la configuration après un reboot? <p> Réponse: <itemize> <item> que vous utilisiez un init à la manière BSD ou à la manière SysV (RedHat par exemple), vous pouvez toujours inclure cela dans <tt>/etc/rc.d/rc.local</tt>. <item>Voici ce que j'ai dans mon système init SysV (RedHat 3.0.3 et 4.0): <itemize> <item> Mon <tt>/etc/rc.d/rc.local</tt>: (édité pour ne montrer que les parties intéressantes) <tscreen><verb> # configuration des interfaces avec IP alias echo "Configuration des aliases IP: 172.16.3.1, 172.16.3.10, 172.16.3.100..." /sbin/ifconfig lo 127.0.0.1 /sbin/ifconfig eth0 up /sbin/ifconfig eth0 172.16.3.1 /sbin/ifconfig eth0:0 172.16.3.10 /sbin/ifconfig eth0:1 172.16.3.100 # configuration des routes echo "Configuration des routes IP..." /sbin/route add -net 127.0.0.0 /sbin/route add -net 172.16.3.0 dev eth0 /sbin/route add -host 172.16.3.1 eth0 /sbin/route add -host 172.16.3.10 eth0:0 /sbin/route add -host 172.16.3.100 eth0:1 /sbin/route add default gw 172.16.3.200 # </verb></tscreen> </itemize> </itemize> <sect1>Comment configurer sendmail pour recevoir des mails sur plusieurs numéros IP? <p> Réponse: <itemize> <item> Créer (s'il n'existe pas déjà) un fichier appelé, par exemple, <tt>/etc/mes_noms.cw</tt>. Il ne doit pas forcémement s'appeler ainsi, ni se trouver dans le repertoire <tt>/etc</tt>. <item> Dans ce fichier, placer les noms officiels des numéros alias IP. Si ces numéros n'ont pas de nom dans un domaine, alors vous pouvez indiquer le numéro IP lui-même. <tscreen><verb> /etc/mes_noms.cw: ----------------- # /etc/mes_noms.cw - inclure ici tous les aliases pour votre machine # # est un commentaire domaine.un.net domaine.deux.com domaine.trois.org 4.5.6.7 </verb></tscreen> <item> Dans votre fichier <tt>sendmail.cf</tt>, à l'endroit où on définit une macro de classe fichier <tt>Fw</tt>, ajoutez: <tscreen><verb> . . . ################# # infos locales # ################# . . # fichier contenant les noms des hôtes pour lesquels on reçoit du courrier Fw/etc/mes_noms.cw . . . </verb></tscreen> <item> Cela devrait suffire. Testez votre nouvelle configuration en lançant <tt>sendmail</tt> en mode de test, par exemple: <tscreen><verb> ganymede$ /usr/lib/sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter < ruleset> < address> < 0 moi@4.5.6.7 rewrite: ruleset 0 input: moi @ 4 . 5 . 6 . 7 rewrite: ruleset 98 input: moi @ 4 . 5 . 6 . 7 rewrite: ruleset 98 returns: moi @ 4 . 5 . 6 . 7 rewrite: ruleset 97 input: moi @ 4 . 5 . 6 . 7 rewrite: ruleset 3 input: moi @ 4 . 5 . 6 . 7 rewrite: ruleset 96 input: moi < @ 4 . 5 . 6 . 7 > rewrite: ruleset 96 returns: moi < @ 4 . 5 . 6 . 7 . > rewrite: ruleset 3 returns: moi < @ 4 . 5 . 6 . 7 . > rewrite: ruleset 0 input: moi < @ 4 . 5 . 6 . 7 . > rewrite: ruleset 98 input: moi < @ 4 . 5 . 6 . 7 . > rewrite: ruleset 98 returns: moi < @ 4 . 5 . 6 . 7 . > rewrite: ruleset 0 returns: $# local $: moi rewrite: ruleset 97 returns: $# local $: moi rewrite: ruleset 0 returns: $# local $: moi < 0 moi@4.5.6.8 rewrite: ruleset 0 input: moi @ 4 . 5 . 6 . 8 rewrite: ruleset 98 input: moi @ 4 . 5 . 6 . 8 rewrite: ruleset 98 returns: moi @ 4 . 5 . 6 . 8 rewrite: ruleset 97 input: moi @ 4 . 5 . 6 . 8 rewrite: ruleset 3 input: moi @ 4 . 5 . 6 . 8 rewrite: ruleset 96 input: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 96 returns: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 3 returns: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 0 input: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 98 input: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 98 returns: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 95 input: < > moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 95 returns: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 0 returns: $# smtp $@ 4 . 5 . 6 . 8 $: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 97 returns: $# smtp $@ 4 . 5 . 6 . 8 $: moi < @ 4 . 5 . 6 . 8 > rewrite: ruleset 0 returns: $# smtp $@ 4 . 5 . 6 . 8 $: moi < @ 4 . 5 . 6 . 8 > > </verb></tscreen> Notez que lorsque j'ai testé <tt>moi@4.5.6.7</tt>, cela a envoyé le mail à la machine locale, alors que <tt>moi@4.5.6.8</tt> a été envoyé à l'agent de transport smtp. C'est la réponse correcte. <newline> <newline> <item>Tout est configuré maintenant. </itemize> <sect>Conclusion <p> J'espère que ce qui précède sera utile à quelqu'un. <newline> Merci à tous ceux qui ont superbement travaillé sur Linux et l'aliasing IP. <newline> Et particulièrement à Juan Jose Ciarlante pour avoir clarifié mes questions. Merci aussi à tous ceux qui ont remarqué mes fautes de frappe et m'ont fourni des suggestions! <newline> Si vous trouvez ce document utile, ou si vous avez des suggestions pour des améliorations, envoyez moi un courrier électronique à: <htmlurl url="mailto:h.pillay@ieee.org" name="h.pillay@ieee.org">. <newline> Amusez-vous bien. <newline> Des questions? envoyez moi un courrier électronique à <htmlurl url="mailto:h.pillay@ieee.org" name="h.pillay@ieee.org">. </article>