ProxyARP Subnetting HOWTO
Bob Edwards, <
[email protected]>
Ao�t 1997
Ce HOWTO explique l'utilisation d'un sous-r�seau avec mandataire
(_p_r_o_x_y) ARP (protocole de r�solution d'adresse), pour rendre visible
un petit r�seau de machines comme si ces machines �taient reli�es
directement au r�seau principal. (traduction : Michel Billaud, <bil�
[email protected]>).
______________________________________________________________________
Table des mati�res
1. Introduction
2. Remerciements
3. Pourquoi utiliser un sous-r�seau avec mandataire ARP ?
4. Comment marche le mandatement ARP d'un sous-r�seau ?
5. Installation du mandataire ARP de sous-r�seau
6. Autres alternatives au mandatement ARP de sous-r�seau
7. Autres applications du mandatement ARP de sous-r�seau
8. Copyright
______________________________________________________________________
11.. IInnttrroodduuccttiioonn
Ce HOWTO explique l'utilisation d'un sous-r�seau avec mandataire
(_p_r_o_x_y) ARP (protocole de r�solution d'adresse), pour rendre visible
un petit r�seau de machines (nous l'appellerons _r_�_s_e_a_u _0 dans la
suite) comme si ces machines �taient reli�es directement au r�seau
principal (_r_�_s_e_a_u _1).
Ceci n'a de sens que si les machines sont reli�es par Ethernet ou
autres dispositifs de type _e_t_h_e_r (autrement dit �a ne convient pas
pour SLIP, PPP, CSLIP, etc.)
22.. RReemmeerrcciieemmeennttss
Ni ce document, ni mon impl�mentation du mandatement ARP, n'auraient
�t� possibles sans l'aide :
� d'Andrew Tridgell, qui a impl�ment� sous Linux les options de sous-
r�seau pour _a_r_p, et qui m'a aid� personnellement � le faire marcher
;
� du mini-HOWTO _P_r_o_x_y_-_A_R_P �crit par Al LongYear ;
� du mini-HOWTO _M_u_l_t_i_p_l_e_-_E_t_h_e_r_n_e_t de Don Becker ;
� du code source et de la page de manuel de la commande arp(8), de
Fred N. van Kempen et Bernd Eckenfels.
33.. PPoouurrqquuooii uuttiilliisseerr uunn ssoouuss--rr��sseeaauu aavveecc mmaannddaattaaiirree AARRPP ??
Les applications d'un sous-r�seau avec mandataire ARP sont assez
sp�cifiques.
Dans mon cas, j'avais une carte Ethernet sans-fil ISA 8 bits. Je
voulais utiliser cette carte pour raccorder un certain nombre de
machines. Apr�s avoir �crit un pilote (_d_r_i_v_e_r) pour cette carte ISA
(c'est le sujet d'un autre document), je pouvais l'utiliser dans une
machine Linux. � partir de l�, il �tait seulement n�cessaire d'ajouter
une seconde interface Ethernet � la machine Linux, et d'utiliser alors
un m�canisme quelconque pour interconnecter les deux r�seaux.
Dans la suite, j'appellerai _r_�_s_e_a_u _0 le r�seau local Ethernet reli� �
la machine Linux par une carte Ethernet (clone NE-2000) sur _e_t_h_0.
Le _r_�_s_e_a_u _1 est le r�seau principal connect� par la carte Ethernet
sans-fil sur _e_t_h_1. La _m_a_c_h_i_n_e _A est la machine Linux avec ses deux
interfaces. La _m_a_c_h_i_n_e _B est une station quelconque du r�seau 0, et la
_m_a_c_h_i_n_e _C est sur le r�seau 1.
Normalement, pour r�aliser l'interconnexion, on pourrait :
� utiliser le logiciel IP-Bridge (voir le _B_r_i_d_g_e _m_i_n_i_-_H_O_W_T_O) pour
r�aliser un pont entre les deux interfaces r�seau.
Malheureusement, la carte Ethernet sans-fil ne peut pas �tre mise
en mode ``promiscuous'' (autrement dit elle ne peut pas voir tous
les paquets circulant sur le r�seau 1). C'est principalement �
cause de la faible bande passante de la carte Ethernet sans-fil (2
Mbits/sec), ce qui implique que nous ne voulons pas supporter le
trafic qui n'est pas destin� � une autre machine sans-fil - dans
notre cas la machine A -, ou les diffusions g�n�rales (_b_r_o_a_d_c_a_s_t_s).
De plus, un pont charge assez lourdement le processeur.
� ou bien utiliser des sous-r�seaux et un routeur pour transmettre
les paquets entre les r�seaux (voir le _I_P_-_S_u_b_n_e_t_w_o_r_k_i_n_g _m_i_n_i_-
_H_O_W_T_O). C'est une solution d�pendante du protocole, b�n�ficiant du
fait que le noyau Linux sait g�rer les paquets IP (Internet
Protocol), mais demandant du logiciel suppl�mentaire pour router
d'autres protocoles (tels qu'AppleTalk). De plus, ceci n�cessite
d'allouer un nouveau num�ro de sous-r�seau IP, ce qui n'est pas
toujours possible.
Dans mon cas, il n'�tait pas possible d'obtenir un nouveau num�ro de
sous-r�seau, alors je voulais une solution qui permette aux machines
du r�seau 0 d'appara�tre comme si elles �taient sur le r�seau 1.
C'est � cela que sert le mandatement ARP. D'autres solutions sont
utilis�es pour connecter d'autres protocoles (non-IP), comme _n_e_t_a_t_a_l_k
pour le routage AppleTalk.
44.. CCoommmmeenntt mmaarrcchhee llee mmaannddaatteemmeenntt AARRPP dd''uunn ssoouuss--rr��sseeaauu ??
En fait, le mandatement ARP sert uniquement � faire passer les paquets
du r�seau 1 vers le r�seau 0. Pour faire passer les paquets dans
l'autre sens, on emploie le routage IP normal.
Dans mon cas, le r�seau 1 poss�de un masque de sous-r�seau � 8 bits
255.255.255.0. Pour le r�seau 0, j'ai choisi un masque � 4 bits
(255.255.255.240), qui permet d'avoir 14 noeuds IP sur le r�seau 0
(2^4 = 16, moins deux pour l'adresse de r�seau remplie de z�ros et
l'adresse de diffusion remplie de uns ). Remarquez que toute taille de
masque de sous-r�seau convient, jusqu'� la taille - non comprise - du
masque de l'autre r�seau (dans notre cas : 2, 3, 4, 5, 6 ou 7 bits -
pour un seul bit utilisez le mandatement ARP normal !).
Les num�ros IP (au total 16) du r�seau 0 apparaissent comme un sous-
ensemble du r�seau 1. Remarquez qu'il est tr�s important, dans ce cas,
de ne pas donner aux machines qui sont connect�es directement au
r�seau 1 un num�ro pris dans cet intervalle. Dans mon cas, j'ai
``r�serv�'' les num�ros IP du r�seau 1 qui se terminent par 64 � 79
pour le r�seau 0. Les num�ros IP qui se terminent par 64 et 79 ne
peuvent pas �tre attribu�s � des machines : 79 est l'adresse de
diffusion pour le r�seau 0.
La machine A a deux num�ros IP, l'un dans la plage d'adresses du
r�seau 0 pour sa vraie carte Ethernet (_e_t_h_0), l'autre dans la plage du
r�seau 1 (mais en dehors de la plage du r�seau 0) pour la carte
Ethernet sans-fil (_e_t_h_1).
Supposons que la machine C (du r�seau 1) veuille envoyer un paquet �
la machine B (du r�seau 0). Comme le num�ro IP de la machine B laisse
croire � la machine C que B est sur le m�me r�seau physique, la
machine C va utiliser le protocole de r�solution d'adresse ARP pour
envoyer un message de diffusion sur le r�seau 1, demandant � la
machine qui a le num�ro IP de B de r�pondre avec son adresse
mat�rielle (adresse Ethernet ou MAC). La machine B ne verra pas cette
requ�te, puisqu'en r�alit� elle n'est pas sur le r�seau 1, mais la
machine A, qui est sur les deux r�seaux, la verra.
La premi�re chose magique se produit maintenant, lorsque le code _a_r_p
du noyau de la machine Linux (configur�e en mandataire ARP avec sous-
r�seau) d�termine que la requ�te est arriv�e sur l'interface du r�seau
1 (_e_t_h_1), et que le num�ro IP � r�soudre est dans l'intervalle du
r�seau 0. La machine A envoie alors sa propre adresse mat�rielle
(adresse Ethernet) � la machine C dans un paquet de r�ponse ARP.
La machine C met alors � jour son cache ARP en y ajoutant une entr�e
pour la machine B, mais avec l'adresse mat�rielle (Ethernet) de la
machine A (la carte Ethernet sans-fil). La machine C peut alors
envoyer le paquet pour B � cette adresse mat�rielle (Ethernet), et la
machine A le re�oit.
La machine A remarque que l'adresse de destination IP n'est pas la
sienne, mais celle de B. Le code de routage du noyau Linux de la
machine A essaie alors de faire suivre ce paquet vers la machine B en
cherchant dans ses tables de routage pour savoir quelle interface
contient le num�ro de r�seau de B. Quoi qu'il en soit, le num�ro IP de
B est valide aussi bien pour le r�seau 0 (_e_t_h_0) que pour le r�seau 1
(_e_t_h_1).
C'est alors qu'un autre fait magique se produit : comme le masque de
sous-r�seau du r�seau 0 a plus de bits � 1 (il est plus sp�cifique)
que celui du r�seau 1, le code de routage du noyau Linux va associer
le num�ro IP de B � l'interface du r�seau 0, et ne va pas chercher �
voir si il correspond � l'interface du r�seau 1 (par laquelle le
paquet est arriv�).
Maintenant la machine A doit trouver la ``vraie'' adresse mat�rielle
(Ethernet) de la machine B (en supposant qu'elle ne l'a pas d�j� dans
le cache ARP). La machine A utilise une requ�te ARP, mais cette fois-
ci le code arp du noyau Linux voit que la requ�te ne vient pas de
l'interface du r�seau 1 (_e_t_h_1), et donc ne renvoie pas l'adresse du
mandataire ARP. � la place, il envoie la requ�te ARP sur l'interface
du r�seau 0 (_e_t_h_0), o� la machine B le verra et r�pondra en donnant sa
propre adresse mat�rielle (Ethernet). La machine A peut alors envoyer
le paquet (qui venait de C) vers la machine B.
La machine B re�oit le paquet de C (qui est pass� par A) et veut alors
envoyer une r�ponse. Cette fois, B remarque que C est sur un sous-
r�seau diff�rent (le masque de sous-r�seau 255.255.255.240 exclut
toutes les machines qui ne sont pas dans la plage d'adresses IP du
r�seau 0). La machine B est configur�e avec une route par d�faut vers
l'adresse IP de A sur le r�seau 0, et envoie le paquet � la machine A.
Cette fois-ci, le code de routage du noyau Linux de A trouve que
l'adresse IP de la destination (machine C) est sur le r�seau 1, et
envoie le paquet � la machine C par l'interface Ethernet _e_t_h_1.
Des choses du m�me genre (mais moins compliqu�es) se produisent pour
les paquets �mis (ou re�us) par la machine A en direction (ou
provenant) d'autres machines sur l'un ou l'autre des deux r�seaux.
De la m�me fa�on, il est �vident que si une autre machine D du r�seau
0 envoie une requ�te ARP concernant B sur le r�seau 0, la machine A
recevra cette requ�te sur son interface du r�seau 0 (_e_t_h_0) et
s'abstiendra d'y r�pondre, puisqu'elle n'est configur�e comme
mandataire que sur son interface du r�seau 1 (_e_t_h_1).
Remarquez aussi que les machines B, C (et D) n'ont de sp�cial �
faire, du point de vue IP. Dans mon cas, il y a un m�lange de SUN, de
MAC et de PC sous Windows 95 sur le r�seau 0, qui se connectent toutes
au reste du monde � travers la machine Linux A.
Pour finir, notez qu'une fois que les adresses mat�rielles (Ethernet)
ont �t� trouv�es par chacune des machines A, B, C (et D), elles sont
plac�es dans leur cache ARP, et que les paquets suivants sont
tranf�r�s sans surco�t d� � l'ARP. Normalement, les caches ARP
suppriment les informations au bout de 5 minutes d'inactivit�.
55.. IInnssttaallllaattiioonn dduu mmaannddaattaaiirree AARRPP ddee ssoouuss--rr��sseeaauu
J'ai install� le mandataire ARP du sous-r�seau sur un noyau Linux
version 2.0.30, mais il parait que le code fonctionne avec une
version 1.2.x.
La premi�re chose � noter est que le code ARP est en deux parties :
une partie dans le noyau, qui envoie et re�oit les requ�tes et les
r�ponses ARP et met � jour le cache ARP, etc. ; l'autre partie est
constitu�e de la commande arp(8) qui permet au super-utilisateur de
mettre � jour manuellement le cache ARP, et � tout le monde de le
consulter.
Le premier probl�me que j'ai eu �tait que la commande arp(8) de ma
distribution Slackware 3.1 �tait antique (dat�e de 1994 !) et ne
communiquait pas correctement du tout avec le code ARP du noyau (``arp
-a'' donnait un r�sultat �trange).
La commande arp(8) de ``net-tools-1.33a'', qui est disponible sur un
grand nombre de sites, en particulier (d'apr�s le README qui lui est
joint) ftp.linux.org.uk:/pub/linux/Networking/PROGRAMS/NetTools/,
fonctionne correctement, et contient de nouvelles pages de manuel
arp(8) qui expliquent les choses bien mieux que les anciennes.
Une fois muni d'une commande arp(8) d�cente, il ne me restait plus
qu'� modifier le seul fichier /etc/rc.d/rc.inet1 (pour la Slackware -
c'est probablement diff�rent pour d'autres distributions). Tout
d'abord, il nous faut changer l'adresse de diffusion, le num�ro de
r�seau, et le masque de _e_t_h_0 :
NETMASK=255.255.255.240 # pour la partie h�te sur 4 bits
NETWORK=x.y.z.64 # notre nouveau r�seau
# (remplacez x.y.z par votre r�seau)
BROADCAST=x.y.z.79 # pour moi.
Il faut ensuite ajouter une ligne pour configurer la seconde interface
Ethernet (apr�s les chargements de modules qui sont �ventuellement
n�cessaires pour lancer le pilote) :
/sbin/ifconfig eth1 _n_o_m___s_u_r___l_e___r_�_s_e_a_u___1 broadcast _x_._y_._z_._2_5_5 netmask
255.255.255.0
Puis nous ajoutons une route pour la nouvelle interface :
/sbin/route add -net _x_._y_._z_._0 netmask 255.255.255.0
Et vous aurez sans doute besoin de changer la passerelle par d�faut
pour utiliser celle du r�seau 1.
Arriv�s � ce point, nous pouvons ajouter la ligne pour le mandatement
ARP :
/sbin/arp -i eth1 -Ds ${NETWORK} eth1 netmask ${NETMASK} pub
Ceci demande � ARP d'ajouter au cache une entr�e statique (``s'') pour
le r�seau ${NETWORK}. Le ``-D'' dit d'utiliser la m�me adresse
mat�rielle que l'interface _e_t_h_1 (la seconde interface), ce qui nous
�vite d'avoir � chercher l'adresse mat�rielle de _e_t_h_1 et de la coder
directement dans la commande.
L'option netmask indique qu'il s'agit d'une entr�e ARP concernant un
_s_o_u_s_-_r_�_s_e_a_u, qui est constitu� des num�ros IP tels que
_n_u_m_�_r_o___i_p & ${NETMASK} == ${NETWORK} & ${NETMASK}
L'option pub demande de _p_u_b_l_i_e_r cette entr�e ARP, c'est-�-dire qu'il
s'agit d'_m_a_n_d_a_t_e_m_e_n_t, et qu'il faudra r�pondre au nom de ces num�ros
IP. L'option ``-i eth1'' pr�cise qu'il ne faudra r�pondre qu'aux
requ�tes ARP arrivant par l'interface _e_t_h_1.
Normalement, � ce point, si la machine est red�marr�e, tous les
machines du r�seau 0 sembleront �tre sur le r�seau 1. Vous pouvez
v�rifier que l'entr�e de mandatement ARP de sous-r�seau a �t� prise en
compte correctement sur la machine A. Sur ma machine (j'ai chang� les
noms pour prot�ger les innocents) c'est :
#/sbin/arp -an
Address HWtype HWaddress Flags Mask Iface
x.y.z.1 ether 00:00:0C:13:6F:17 C * eth1
x.y.z.65 ether 00:40:05:49:77:01 C * eth0
x.y.z.67 ether 08:00:20:0B:79:47 C * eth0
x.y.z.5 ether 00:00:3B:80:18:E5 C * eth1
x.y.z.64 ether 00:40:96:20:CD:D2 CMP 255.255.255.240 eth1
Vous pouvez aussi regarder le fichier /proc/net/arp, par exemple avec
cat(1).
La derni�re ligne est l'entr�e de mandatement pour le sous-r�seau. Les
indicateurs CMP r�v�lent qu'il s'agit d'une donn�e statique (entr�e
Manuellement) qui doit �tre Publi�e. Elle ne servira qu'� r�pondre
qu'aux requ�tes ARP qui arrivent par _e_t_h_1 et pour lesquelles le num�ro
IP, une fois masqu�, correspond au num�ro de r�seau (�galement
masqu�). Remarquez que la commande arp(8) a trouv� automatiquement
l'adresse mat�rielle de _e_t_h_1 et l'a employ�e comme adresse � utiliser
(� cause de l'option ``-Ds'').
De la m�me fa�on il est probablement prudent de v�rifier que la table
de routage a �t� remplie correctement. Voici la mienne (ici aussi, les
noms ont �t� chang�s pour prot�ger les innocents) :
#/bin/netstat -rn
Kernel routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
x.y.z.64 0.0.0.0 255.255.255.240 U 0 0 71 eth0
x.y.z.0 0.0.0.0 255.255.255.0 U 0 0 389 eth1
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 7 lo
0.0.0.0 x.y.z.1 0.0.0.0 UG 1 0 573 eth1
Vous pouvez aussi regarder le contenu du fichier /proc/net/route (par
exemple avec cat(1)).
Remarquez que la premi�re entr�e concerne un sous-ensemble de la
seconde, mais la table de routage les classe dans l'ordre des masques,
et donc l'entr�e _e_t_h_0 sera test�e avant celle de _e_t_h_1.
66.. AAuuttrreess aalltteerrnnaattiivveess aauu mmaannddaatteemmeenntt AARRPP ddee ssoouuss--rr��sseeaauu
Dans la m�me situation il y a d'autres possibilit�s que le mandatement
ARP de sous-r�seau et celles que j'ai d�j� mentionn�es (utilisation
d'un pont et routage direct) :
� ``_M_a_s_q_u_e_r_a_d_i_n_g _I_P'' (voir le _I_P_-_M_a_s_q_u_e_r_a_d_e _m_i_n_i_-_H_O_W_T_O), dans lequel
le r�seau 0 est ``cach�e'' du reste du monde derri�re la machine A.
Quand les machines du r�seau 0 tentent de se connecter �
l'ext�rieur � travers la machine A, celle-ci modifie l'adresse
d'origine et le num�ro de port des paquets pour qu'ils aient l'air
d'avoir �t� envoy�s par elle-m�me, plut�t que par la machine cach�e
du r�seau 0. C'est une solution �l�gante, bien qu'elle emp�che
toute machine du r�seau 1 d'�tablir une connexion vers une machine
du r�seau 0, puisque les machines du r�seau 0 n'existent pas en
dehors de celui-ci.
Ceci am�liore efficacement la s�curit� des machines du r�seau 0,
mais cela signifie aussi que les serveurs du r�seau 1 ne peuvent
pas v�rifier l'identit� des clients du r�seau 0 en se basant sur
leur num�ros IP (les serveurs NFS, par exemple, utilisent les noms
IP pour contr�ler l'acc�s aux syst�mes de fichiers).
� Une autre possibilit� serait un _t_u_n_n_e_l _I_P _s_u_r _I_P, ce qui n'est pas
support� par toutes les plateformes (comme les Macs et les machines
sous Windows), et je n'ai donc pas opt� pour cette solution.
� Utiliser le mandatement ARP sans sous-r�seau. C'est tout � fait
possible, cela signifie simplement qu'il faut cr�er une entr�e
individuelle pour chaque machine du r�seau 0, au lieu d'une seule
entr�e pour toutes les machines (pr�sentes et futures) du r�seau 0.
� Il se peut que l'_a_l_i_a_s_i_n_g _I_P puisse �tre utilis� ici (NdT:
francheement �a m'�tonnerait), mais je n'ai pas du tout explor�
cette voie.
77.. AAuuttrreess aapppplliiccaattiioonnss dduu mmaannddaatteemmeenntt AARRPP ddee ssoouuss--rr��sseeaauu
Je ne connais qu'une autre application du mandatement ARP de sous-
r�seau, ici � l'Australian National University (ANU). C'est celle pour
laquelle Andrew Tridgell a �crit, � l'origine, les extensions du
mandatement ARP pour les sous-r�seaux. Quoiqu'il en soit, Andrew
m'informe qu'il y a, de fait, plusieurs autres sites dans le monde qui
l'utilisent �galement (je n'ai aucun d�tail).
� l'ANU, l'autre application concerne un laboratoire d'enseignement
qui sert � apprendre aux �tudiants comment configurer des machines
pour utiliser TCP/IP, y compris pour configurer la passerelle. Le
r�seau utilis� est un r�seau de classe C, et Andrew avait besoin de le
d�couper en sous-r�seaux pour des raisons de s�curit�, de contr�le du
trafic et la raison p�dagogique mentionn�e plus haut. Il l'a fait en
utilisant le mandatement ARP, et a alors d�cid� qu'une seule entr�e
dans le cache ARP pour tout le sous-r�seau serait plus rapide et plus
propre qu'une pour chaque machine du sous-r�seau. Et voil�.
Mandatement ARP de sous-r�seau !
Les corrections et les suggestions sont les bienvenues !
88.. CCooppyyrriigghhtt
Copyright 1997 par Bob Edwards <
[email protected]>
T�l�phone : (+61) 2 6249 4090
Sauf mention contraire, les copyrights des documents ``_L_i_n_u_x _H_O_W_T_O''
sont d�tenus par leurs auteurs respectifs. Ces documents peuvent �tre
reproduits et distribu�s en tout ou partie, sur tout support physique
ou �lectronique, du moment que cette notice de copyright figure sur
toutes les copies. La redistribution commerciale est autoris�e et
encourag�e, cependant l'auteur souhaite en �tre averti. Toutes les
traductions, les travaux d�riv�s, ou ouvrages incorporant un _L_i_n_u_x
_H_O_W_T_O doivent �tre soumis � cette m�me notice de copyright.
Autrement dit, vous ne pouvez pas produire un travail d�riv� d'un
HOWTO en imposant des restrictions suppl�mentaires � sa diffusion. Des
d�rogations � cette r�gle peuvent �tre accord�es sous certaines
conditions, veuillez contacter le coordinateur des Linux HOWTO �
l'adresse indiqu�e ci-dessous. En r�sum�, nous souhaitons promouvoir
la diffusion de cette information par autant de canaux que possible,
tout en conservant le copyright sur les HOWTOs, et nous voudrions �tre
avertis de tout projet de redistribution de ces documents. Si vous
avez des questions, veuillez contacter Grek Hankins, coordinateur des
Linux HOWTOs, par courrier �lectronique � <
[email protected]>.