Page suivante Page précédente Table des matières

5. Installation du mandataire ARP de sous-réseau

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 eth0 :

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 nom_sur_le_réseau_1 broadcast x.y.z.255 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 eth1 (la seconde interface), ce qui nous évite d'avoir à chercher l'adresse matérielle de eth1 et de la coder directement dans la commande.

L'option netmask indique qu'il s'agit d'une entrée ARP concernant un sous-réseau, qui est constitué des numéros IP tels que

numéro_ip & ${NETMASK} == ${NETWORK} & ${NETMASK}
L'option pub demande de publier cette entrée ARP, c'est-à-dire qu'il s'agit d'mandatement, 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 eth1.

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 eth1 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 eth1 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 eth0 sera testée avant celle de eth1.


Page suivante Page précédente Table des matières