1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
|
<?xml version="1.0" encoding="ISO8859-1" standalone="no"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V4.2-Based Extension//EN"
"../../../share/sgml/freebsd42.dtd" [
<!ENTITY % entities PUBLIC "-//FreeBSD//ENTITIES DocBook FreeBSD Entity Set//FR" "../../share/sgml/entities.ent">
%entities;
<!ENTITY % not.published "IGNORE">
]>
<!--
The FreeBSD Documentation Project
The FreeBSD French Documentation Project
$FreeBSD$
Original revision: n.nn
-->
<article lang="fr">
<articleinfo>
<title>Alias IP avec FreeBSD 2.x</title>
<authorgroup>
<author>
<firstname>Ben</firstname>
<surname>Black</surname>
</author>
</authorgroup>
<abstract>
<para><email>black@cypher.net</email></para>
&trans.a.haby;
</abstract>
<pubdate>$FreeBSD$</pubdate>
<releaseinfo>$FreeBSD$</releaseinfo>
</articleinfo>
<sect1>
<title>Introduction</title>
<para>Définir des <emphasis>alias IP</emphasis> consiste à affecter plus
d'une adresse IP à une interface réseau. Les alias IP sont typiquement
employés pour héberger des serveurs Web et FTP virtuels et pour
réorganiser ses serveurs sans avoir à mettre à jour d'autres machines
(ce dernier usage est particulièrement utile avec les serveurs de noms
de domaines). Voyez un alias IP comme un petit enfant perché sur le
dos de son interface parente (qui est l'adresse primaire de l'interface
physique).</para>
<para>Les alias IP <emphasis>n'ont rien à voir</emphasis> avec la notion
de <emphasis>multi-hébergement</emphasis> - “<foreignphrase>multi-homing</foreignphrase>”
(lorsqu'une machine dispose de plus d'une interface réseau active), sauf
au cas où une machine sur plusieurs réseaux fournit des services tels que
ceux listés plus haut. La confusion entre les deux notions est une erreur
propagée du monde Macintosh et vous seriez avisé de ne pas les suivre sur
ce point.</para>
<para>Il y a deux commandes essentielles à la mise en place d'alias IP sur
FreeBSD (et sur tous les autres systèmes Unix que j'aie jamais utilisés),
ce sont <command>ifconfig</command> et <command>route</command>.
L'utilisation correcte de ces commandes est décrite ci-dessous. Pour
connaître toutes les subtilités de leur emploi, reportez-vous aux pages de
manuel correspondantes. Il y a deux autres commandes utiles pour vérifier
que tout fonctionne comme il se doit et pour mettre les choses au point
si ce n'est pas le cas. <command>netstat</command> vous permet de
consulter la table de routage du noyau (entre autres choses utiles), et
ping est un appréciable petit outil pour tester l'accès à votre nouvel
alias (comme à toute autre adresse IP).</para>
<important>
<para>Vous <emphasis>devez</emphasis> être en session sous le compte
super-utilisateur <username>root</username> pour pouvoir exécuter la
plupart des commandes décrites dans ce qui suit.</para>
</important>
</sect1>
<sect1>
<title>Utiliser <command>ifconfig</command></title>
<para><citerefentry><refentrytitle>ifconfig</refentrytitle></citerefentry>
sert à configurer les différentes caractéristiques d'une interface réseau
(adresse, protocole, masque de réseau, etc.).
<citerefentry><refentrytitle>ifconfig</refentrytitle></citerefentry> nous
servira ici à ajouter (et parfois à supprimer) les adresses des alias des
interfaces.</para>
<para>Dans l'exemple ci-dessous, nous supposerons que notre machine n'a
qu'une seule interface Ethernet 3Com 3C509 (<devicename>ep0</devicename>)
d'adresse <hostid role="ipaddr">192.168.57.82</hostid> avec comme masque
de sous-réseau <hostid role="netmask">255.255.255.0</hostid>, en plus
de l'interface “en boucle” standard
<hostid role="ipaddr">127.0.0.1</hostid>. Vous devrez bien sûr remplacer
ces valeurs par l'adresse et le masque de sous-réseau de votre(vos)
interface(s). L'adresse et le masque de sous-réseau de l'interface
“en boucle” sont les mêmes sur toutes les machines.</para>
<para>Pour ajouter un alias à <devicename>ep0</devicename>, nous passons
simplement une commande du style:</para>
<informalexample>
<screen>&prompt.root; <userinput>ifconfig ep0 inet 192.168.57.10 netmask 255.255.255.255 alias</userinput></screen>
</informalexample>
<para>Ce qui dit à FreeBSD que nous définissons une adresse IP
(<literal>inet</literal>) pour la carte 3Com
(<devicename>ep0</devicename>) avec comme adresse
<hostid role="ipaddr">192.168.57.10</hostid>, comme masque de
sous-réseau (<literal>netmask</literal>)
<hostid role="netmask">255.255.255.255</hostid> (i.e., tous
les bits à 1) pour éviter que le système d'exploitation ne proteste qu'il
y a déjà une adresse affectée à cette interface, et que c'est un alias
pour cette interface (<literal>alias</literal>).</para>
<para>Vous pouvez aussi omettre le masque de sous-réseau (ou lui donner une
autre valeur). Jusqu'à FreeBSD 2.1.0 compris, il y a néanmoins un bogue
qui fait que les commandes <command>ifconfig alias</command> échouent à
la première tentative, mais réussissent à la seconde, si vous n'indiquez
pas <hostid role="netmask">255.255.255.255</hostid> comme masque de
sous-réseau. Si vous ne donnez pas ce masque de sous-réseau de
<hostid role="netmask">255.255.255.255</hostid>, vous devrez aussi ajouter
une route manuellement, comme décrit ci-dessous.</para>
<para>Pour supprimer l'alias, nous exécutons une commande très
similaire:</para>
<informalexample>
<screen>&prompt.root; <userinput>ifconfig ep0 inet 192.168.57.10 -alias</userinput></screen>
</informalexample>
<para>Il n'y a pas besoin de paramètres supplémentaires, tels que le masque
de sous-réseau, parce que l'alias est entièrement défini par l'adresse IP,
de sorte que FreeBSD peut supprimer toutes les ressources associées en se
basant sur cette adresse.</para>
</sect1>
<sect1>
<title>Utiliser <command>route</command></title>
<para><citerefentry><refentrytitle>route</refentrytitle></citerefentry> sert
à modifier à la main la table de routage du noyau. Pour nos besoins, une
fois que nous avons donné à FreeBSD l'alias pour l'interface, nous devons
définir une route IP vers cet alias. Si vous avez précisé le masque de
sous-réseau de <hostid role="netmask">255.255.255.255</hostid> avec la
commande précédente, vous pouvez vous dispenser de cette étape.</para>
<para>Pour ajouter une route vers notre nouvelle interface, nous
exécutons:</para>
<informalexample>
<screen>&prompt.root; <userinput>route add -host 192.168.57.10 127.0.0.1 0</userinput></screen>
</informalexample>
<para>Cela dit à FreeBSD que pour arriver à la machine
<hostid role="ipaddr">192.168.57.10</hostid>, les paquets doivent être
envoyés sur l'interface “en boucle”
(<hostid role="ipaddr">127.0.0.1</hostid> aussi appelée
<hostid role="hostname">localhost</hostid> et que la distance (décompte
de noeuds intermédiaires) est de <literal>0</literal>, ce qui signifie
que c'est la machine locale.</para>
<para>Pour supprimer cette route, nous exécutons:</para>
<informalexample>
<screen>&prompt.root; <userinput>route delete -host 192.168.57.10</userinput></screen>
</informalexample>
<para>De nouveau, comme la route est entièrement définie par les paramètres
indiqués, nous pouvons laisser de côté les autres données telles que
le masque de sous-réseau et la distance. Pour des informations complètes
sur la commande
<citerefentry><refentrytitle>route</refentrytitle></citerefentry>,
voyez les pages de manuel.</para>
</sect1>
<sect1>
<title>Tester notre travail</title>
<para>Maintenant que nous avons (espérons-le) un alias défini et accessible,
nous devons vérifier qu'il fonctionne correctement. Nous examinerons
d'abord la table de routage du noyau, pour vérifier que la route vers
l'alias est bien présente, puis nous utiliserons
<citerefentry><refentrytitle>ping</refentrytitle></citerefentry> pour
nous assurer que des paquets peuvent l'atteindre.</para>
<para>Pour voir la table de routage du noyau, sous forme numérique,
tapons:</para>
<informalexample>
<screen>&prompt.user; <userinput>netstat -nr</userinput></screen>
</informalexample>
<para>Dans notre exemple, voici à quoi ressemblerait le résultat:</para>
<programlisting>
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.57.1 UGSc 4 964 ep0
127.0.0.1 127.0.0.1 UH 1 39 lo0
192.168.57 link#2 UC 0 0
192.168.57.10/32 link#2 UC 0 0
192.168.57.82 127.0.0.1 UGHS 0 0 lo0
224/4 link#2 UCS 0 0
</programlisting>
<para>Nous y voyons la route par défaut, la route vers l'interface
“en boucle”, la route vers notre réseau local et une curieuse
route vers notre alias. Le <literal>/32</literal> qui suit l'adresse de
l'alias donne la longueur du masque de sous-réseau (le nombre de 1, en
partant de la gauche). Comme nous avons utilisé un masque de sous-réseau
de <hostid role="netmask">255.255.255.255</hostid>, la longueur de
celui-ci (le nombre de 1) est de 32.</para>
<para>Maintenant que nous avons vérifié que la route est bien dans la table
de routage du noyau, nous pouvons effectuer un contrôle rapide pour nous
assurer que cette route fonctionne bien. Exécutons une commande
<citerefentry><refentrytitle>ping</refentrytitle></citerefentry> comme
ci-dessous:</para>
<informalexample>
<screen>&prompt.user; <userinput>ping 192.168.57.10</userinput></screen>
</informalexample>
<para>Si tout va bien, voici ce que nous verrions:</para>
<programlisting>
PING 192.168.57.10 (192.168.57.10): 56 data bytes
64 bytes from 192.168.57.10: icmp_seq=0 ttl=255 time=0.313 ms
64 bytes from 192.168.57.10: icmp_seq=1 ttl=255 time=0.197 ms
64 bytes from 192.168.57.10: icmp_seq=2 ttl=255 time=0.190 ms
</programlisting>
<para>Appuyons simplement sur
<keycombo><keycap>Ctrl</keycap><keycap>C</keycap></keycombo> pour arrêter
<citerefentry><refentrytitle>ping</refentrytitle></citerefentry> si tout
paraît satisfaisant. Il nous “crachera” alors quelques
statistiques, que nous pouvons normalement ignorer. S'il n'y a pas de
retour ou s'il y a des messages d'erreur, quelque chose ne va pas.
Reprenez tout du début et lisez les pages de manuel (non, vraiment,
<emphasis>allez lire les pages de manuel</emphasis>), et, finalement,
posez vos questions sur la &a.questions;.</para>
</sect1>
<sect1>
<title>Tout mettre en place</title>
<para>Maintenant que nous avons compris comment utiliser les commandes
<citerefentry><refentrytitle>ifconfig</refentrytitle></citerefentry> et
<citerefentry><refentrytitle>route</refentrytitle></citerefentry> pour
ajouter et supprimer des alias IP, faisons en sorte que la machine
exécute les commandes voulues au démarrage de façon à ce que l'alias soit
toujours actif.</para>
<para>Vers la fin de notre fichier <filename>/etc/rc.local</filename>, nous
ajouterons la ligne:</para>
<programlisting>
ifconfig ep0 inet 192.168.57.10 netmask 255.255.255.255 alias
</programlisting>
<para>Si nous utilisons un autre masque de sous-réseau que
<hostid role="netmask">255.255.255.255</hostid>, nous devrons aussi
utiliser la commande
<citerefentry><refentrytitle>route</refentrytitle></citerefentry> comme
expliqué plus haut. Il est possible d'ajouter de cette façon autant
d'alias que l'on veut (en supposant que nous disposons de suffisamment
d'adresses allouées). Il suffit de mettre plusieurs commandes comme
la précédente dans <filename>/etc/rc.local</filename>, avec les adresses
appropriées. Il est même possible de définir comme alias des adresses
d'un autre réseau IP, si ce réseau est aussi routé sur nous. C'est une
situation différente de celle d'une machine avec plusieurs interfaces
<emphasis>physiques</emphasis> qui doivent <emphasis>toujours</emphasis>
avoir des adresses sur des réseaux IP différents.</para>
<para>Il y a un certains nombre de points à connaître lorsque l'on utilise
un grand nombre d'alias (plus de ~10), que je citerai.</para>
<para>Tout d'abord, il y a un bogue dans toutes les distributions de
<application>bind</application> (le serveur DNS
<application>named</application> fait partie de
<application>BIND</application>) qui empêche le démarrage correct de
<application>named</application> lorsqu'il y a plus de 64 alias sur
une interface. Il n'y a pas de palliatif particulièrement simple, je ne
les mentionnerai donc pas ici.</para>
<para>En second lieu, pour éviter de truffer votre fichier
<filename>/etc/rc.local</filename> de quantité
d'<citerefentry><refentrytitle>ifconfig</refentrytitle></citerefentry>, je
vous suggère d'utiliser un fichier à part dans <filename>/etc</filename>
pour les y mettre. Créez par exemple un fichier
<filename>ifconfig.ep0</filename> et mettez-y tous les
<literal>ifconfig alias</literal>. Puis dans
<filename>/etc/rc.local</filename>, ajoutez les lignes suivantes:</para>
<programlisting>
if [ -x /sbin/ifconfig ]; then
echo -n 'Adding local ifconfigs '
. /etc/ifconfig.ep0
echo ' done.'
fi
</programlisting>
<para>Ce fragment de procédure provient d'un fichier
<filename>/etc/rc.local</filename> fourni par Neil Fowler Wright
<email>neil@corpex.com</email>. Le bricoleur trouvera moyen d'y mettre
des boucles s'il y a plusieurs interfaces dont les alias sont définis
dans différents fichiers <filename>ifconfig.*</filename>.</para>
</sect1>
<sect1>
<title>Où trouver plus d'aide</title>
<para>M'envoyer directement un courrier électronique n'est probablement pas
le meilleur moyen d'obtenir de l'aide sur les problèmes d'alias IP. Je
suis assez occupé la plupart du temps, et ai tendance à devenir assez
rouspéteur. Néanmoins, les participants de la &a.questions; sont
amicaux et secourables et répondront à vos questions plus rapidement que
je ne le ferais.</para>
<para>Cette page a grandement bénéficié des suggestions de Neil Fowler
Wright, Paul DuBois, Gabe Schuyler, et de Brodie le chat.</para>
</sect1>
</article>
|