On Thu, 29 Nov 2001, Alexandre Galletet wrote:

> De plus mes piètres connaisances des réseaux ne me permettent pas
> de savoir pourquoi "c'est encore pire". Si tu pouvais détailler legèrement
> je t'en saurais reconnaissant.

L'acheminement de paquets IP sur un réseau Ethernet fonctionne comme suit
(en simplifié): 

   si l'adresse destination (p.ex. 192.168.1.10) est comprise dans le
   masque de sous-réseau de l'interface Ethernet considéré (p.ex.
   192.168.1.0/24, soit 192.168.1.0-192.168.1.255), le paquet est
   envoyé `sur le réseau Ethernet'

   sinon on utilise p.ex. la route par défaut: on envoie le paquet via
   une machine du réseau Ethernet (un routeur), donc reprendre au début
   mais avec l'adresse IP du routeur.

Maintenant, comment envoyer un paquet sur le réseau Ethernet ?  On
pourrait l'envoyer en broadcast Ethernet (à toutes les machines du réseau
Ethernet). Cela causerait une perte de performance pour toutes les
machines qui devraient prendre le paquet, voir qu'il n'est pas pour elles,
et le jeter (voire le re-router, voire générer un paquet ICMP de
redirection).

Le mieux est de l'envoyer à la bonne carte, via son adresse Ethernet (ou
adresse MAC). Cette adresse est fixée, par le fabricant, et est unique
pour toutes les cartes du monde (en général elle comporte 6 octets,
groupés en 6 blocs de 2 caractères hexadécimaux, soit p.ex.
00:C0:0C:03:6F:50, et le début indique en général le fabriquant, le reste
est un numéro de série p.ex.). Parfois on peut la modifier par logiciel,
mais cela est une autre histoire.

Mais comment savoir sur quel adresse Ethernet doit être acheminé un paquet
portant une adresse IP donnée ? On consulte la table arp (cf /usr/sbin/arp
-a). Si cette table ne contient pas l'entrée désirée, on:

   émet un paquet Ethernet sur l'adresse broadcast Ethernet `where-is'
   avec en question l'adresse IP demandée

   si une machine se reconnaît elle répond en broadcast avec `is-at' et
   comme le paquet contient en adresse source l'adresse MAC Ethernet le
   tour est joué, la table ARP de la machine initiante (voire de toutes
   les machines --- mais je ne crois pas que cela se fasse comme ça)
   peut être renseignée.

Au bout d'un certain temps, les entrées non manuelles ARP disparaissent: 
cela signifie que si l'on change la carte Ethernet d'un serveur NFS, il
faut attendre un certain temps pour que cela remarche depuis les clients
(Linux: très agressif, peut-être 20 secondes; Solaris: 5 minutes,
confgiurable). Ajoutons qu'une machine ne devrait jamais utiliser *sa*
table ARP pour répondre à des requêtes ne la concernant pas.

Revenons à nos moutons: la configuration d'adresse IP d'un boîtier
d'impression.

   Méthode 1 (correcte)
      Configuration matérielle de l'adresse IP (EPROM, panneau frontal)

   Méthode 2 (correcte)
      Demande en broadcast via DHCP ou BOOTP d'une adresse à un serveur
      DHCP/BOOTP (p.ex. Linux).

   Méthode 3 (incorrecte et farfelue)
      Allocation aléatoire d'une adresse dans le même domaine qu'un
      paquet vu précédemment, et tentative de ARP `where-is' pour voir
      si personne ne l'a.

         Méthode incorrecte car contient une fenêtre de vulnérabilité.
         En plus, le netmask sera probablement faux.

         Méthode apparemment utilisée par certaines versions de Windows 98
         lorsqu'un serveur DHCP ne répond pas (!).

   Méthode 4 (correcte, mais magouille)
      Le premier paquet IP reçu sur une adresse non broadcast est utilisé
      pour déterminer l'adresse IP (avec l'adresse destination).

         Principe: forcer l'adresse (ARP, IP) dans le cache ARP d'une des
                   machines Linux. Envoyer un paquet IP à l'adresse IP
                   (un ping suffit). Ensuite l'appareil répondra aux
                   ARP `where-is' des autres.

      N'est pas une méthode complètement stupide, mais bon. Je devine
      que c'est ce que le boîtier utilise.

   Méthode 5 (incorrecte, violation de protocole)
      La première réponse where-is reçue dont l'adresse Ethernet est la
      même que celle du boîtier informe de l'adresse IP à utiliser.

         Nécessite l'envoi d'un paquet ARP réponse sans question,
         violation du protocole qui nécessite probablement un accès
         raw socket sur le serveur.

Voilà. Il faut maintenant tcpdump-er pour voir ce qui se passe réellement :)

--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se désabonner aussi.

Répondre à