Outils pour utilisateurs

Outils du site


Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
999-archives:140-pppoe:060_details [le 20/06/2025 à 14:47] – supprimée - modification externe (Date inconnue) 127.0.0.1999-archives:140-pppoe:060_details [le 20/06/2025 à 14:47] (Version actuelle) – ↷ Page déplacée de 140pppoe:060_details à 999-archives:140-pppoe:060_details prof
Ligne 1: Ligne 1:
 +====== Les détails ======
  
 +
 +===== Mise en confiance =====
 +
 +Ce qui va suivre peut paraître quelque peu « indigeste ».  Il n'est donc peut-être pas inutile de donner quelques points de repères avant d'entamer cette descente aux enfers.
 +
 +Nous savons maintenant que le but ultime est d'exploiter les possibilités de PPP sur un réseau de nature Ethernet, parce que PPP offre quelques facilités aux fournisseurs de services, comme l'identification nominative des clients, principalement. C'est nécessaire lorsqu'il y a plusieurs fournisseurs d'accès qui cohabitent sur la même structure.
 +
 +Dans la page précédente, nous avons vu qu'une fois la connexion PPP établie, IP est transporté par PPP (oE), lui-même transporté par Ethernet.
 +
 +Nous devons donc nous attendre, lors de l'établissement de cette connexion, à observer comment PPPoE va s'y prendre pour mettre en place le lien PPP entre notre machine et celle de notre fournisseur de services. Nous nous arrêterons lorsque PPP sera établi, ça suffira. Le reste concernerait le protocole PPP lui-même, ce qui n'est pas l'objectif de cet exposé.
 +
 +  * Nous sommes sur un réseau Ethernet, donc en architecture de réseau, plusieurs hôtes sont présents sur ce réseau et parmi eux, il y a celui avec lequel il faut mettre en place le lien PPP. Il va donc falloir identifier  cet interlocuteur sur ce réseau. Le seul moyen connu au niveau Ethernet, c'est un « broadcast ARP » (Diffusion sur toutes les adresses MAC présentes). Une au moins des machines du fournisseur d'accès devrait répondre.\\  Une fois les deux interlocuteurs mutuellement reconnus, il n'y aura plus de broadcast ARP. Comme nous allons le voir, la reconnaissance mutuelle va aboutir à l'octroi d'un identifiant de session qui restera valide tout le temps de la session.\\
 +  * PPP, au moyen du sous-protocole LCP (Link Control Protocol, protocole spécialisé dans la négociation et la maintenance de la connexion PPP), va identifier le client (Nom d'utilisateur et mot de passe).\\
 +  * Si cette identification réussit, LCP va fournir au client les paramètres nécessaires pour le bon fonctionnement d'IP:
 +    * Adresse IP du client
 +    * Serveur DNS pour la résolution des noms
 +    * Passerelle par défaut. (Ici, cette passerelle est symbolique, puisque sur la connexion PPP, il n'y a que deux protagonistes : Vous et l'équipement de votre FAI à l'autre bout. C'est forcément lui la passerelle).
 +  * Si l'identification échoue, la ligne sera « raccrochée » (par analogie avec un modem RTC). Il faudra donc reprendre la connexion à son début.
 +
 +Voici donc en quelques mots, ce que nous devrions vérifier dans la suite immédiate. Accrochez-vous, on y va.
 +
 +===== RFC... =====
 +
 +==== Les « Request For Comment » sont une très grande chose : ====
 +
 +  - Elles décrivent généralement dans le détail les divers protocoles utilisés sur l'Internet (dont PPPoE, bien entendu) et toute personne mettant en œuvre un protocole de l'internet se doit de le faire en respectant les RFCs qui le décrivent, c'est l'assurance que ce protocole sera utilisable par tous.
 +  - Elles sont initialement rédigées en Anglais, par des spécialistes au langage particulièrement obscur.
 +  - A cause de toutes les propriétés citées plus haut, elles servent d'argument « massue » à ceux qui veulent à tout prix montrer qu'ils sont les plus compétents et qu'ils planent bien au dessus des foules ignares (Une réponse communément trouvée sur les newsgroups : « Va d'abord lire les RFC... »).
 +  - A cause du point 1 (le seul positif), elles sont tout de même d'une utilité inestimable.
 +
 +Par chance pour nous, plusieurs personnes se sont attelées à l'ingrate tâche de la traduction de ces RFCs. Toutes ne le sont pas encore, mais la RFC 2516, celle qui décrit le protocole PPPoE, [[http://abcdrfc.free.fr/rfc-vf/rfc2516.html|est traduite]].
 +
 +Lisez cette RFC, vous constaterez combien le point 2, même affranchi de la langue Anglaise, reste vérifié. Lisez la quand même si vous voulez vraiment connaître le détail de ce protocole.
 +
 +==== Pour vous aider un peu dans cette lecture... ====
 +
 +Voici la manipulation proposée:
 +
 +  * Une machine Linux Mandrake 8.1 ((oui, ça date un peu, mais ça reste vrai)) est connectée à une liaison Netissimo (France Télécom) via un modem Ethernet SpeedTouch Home (Alcatel).
 +  * Le client PPPoE utilisé est rp-pppoe.
 +  * Nous ouvrons une session PPPoE, un renifleur est à l'écoute, qui récupère tout ce qu'il se passe au niveau Ethernet.
 +  * Nous comparons ce que nous voyons avec ce qui est dit dans les RFC.
 +
 +=== Ce que disent les Textes ===
 +
 +<html><div class="encadre"></html>
 +**L'étape de découverte **
 +
 +l'étape de découverte s'effectue en quatre étapes. Quand elle s'achève, chaque vis à vis connaît le PPPOE SESSION_ID ainsi que les adresses Ethernet ; cela suffit pour définir une session PPPOE. Les étapes sont :
 +  * Emission d'un paquet broadcast d'initiation par l'hôte ;
 +  * Emission de paquets d'offres par un concentrateur d'accès ou plus ;
 +  * Emission d'un paquet de demande de session unicast par l'hôte ;
 +  * Et émission d'un paquet de confirmation par le concentrateur d'accès.
 +
 +Après avoir envoyé le paquet de confirmation et dès que l'hôte le reçoit, la connexion passe alors à l'étape suivante : la session PPP. 
 +Toutes les trames de découvertes Ethernet ont le champ ETHER_TYPE à 0x8863.
 +<html></div></html>
 +
 +=== Ce que nous pouvons observer ===
 +
 +== Etablissement de PPPoE ==
 +
 +Dans un premier temps, juste le résumé des trames qui passent:
 +
 +  No. Source             Destination        Protocol   Info
 +    3Com_50:f0:df      ff:ff:ff:ff:ff:ff  PPPoED     Active Discovery Initiation (PADI)
 +    Redback_00:4f:7d   3Com_50:f0:df      PPPoED     Active Discovery Offer (PADO)
 +    3Com_50:f0:df      Redback_00:4f:7d   PPPoED     Active Discovery Request (PADR)
 +    Redback_00:4f:7d   3Com_50:f0:df      PPPoED     Active Discovery Session-confirmation (PADS)
 +    Redback_00:4f:7d   3Com_50:f0:df      PPP LCP    PPP LCP Configuration Request
 +
 +Et voici, exprimée dans toute sa beauté, la magie des systèmes bien normalisés : Ca va se passer exactement comme c'est dit dans les textes.
 +
 +Exactement ? Voyons ça de plus près...
 +
 +<html><div class="encadre"></html>
 +**Le paquet PADI ( PPPoE Active Discovery Initiation) :**\\
 +Les hôtes envoient en broadcast un paquet PADI. Le champ CODE est mis à 0x09 et le champ SESSION_ID à 0x0000.
 +
 +Le paquet PADI doit contenir un TAG de type Service-Name, indiquant le service que l'hôte demande ainsi que d'autres numéros correspondant à d'autres types de TAG. Un paquet PADI entier (incluant l'en-tête PPPoE) ne doit pas dépasser 1484 octets afin de laisser la place suffisante pour qu'un agent relais puisse ajouter un TAG Relay-Session-Id.<html></div></html>
 +
 +>**__Note:__** A l'usage, j'ai pu constater que les rapports d'analyse de trames affichés « en français » peuvent induire en erreur. Ces rapports sont générés par le renifleur (sniffer), parce qu'il connaît par cœur le format des trames qu'il capture et qu'il les interprète de façon plus « lisible ». Dans la pratique, les données capturées ne sont rien de plus que la suite d'octets, ici surlignés.Dans la trame qui suit, il n'y en a que 32, qui génèrent 24 lignes « d'explications ».
 +
 +<html><pre class="code">
 +0000  <span class=hlw">ff ff ff ff ff ff</span> <span class="hlo">00 60 8c 50 f0 df</span> <span class="hlv">88 63</span> <span class="hlm">11</span> <span class="hly">09</span>   <span class="txtb">Ce sont les information effectivement capturées</span>
 +0010  00 00 00 0c <span class="hlg">01 01 00 00</span> <span class="hlb">01 03 00 04</span> <span class="hln">3d 53 00 00</span>   <span class="txtb">...............................................</span>
 +
 +Frame 4 (32 on wire, 32 captured)                       <span class="txtb">Ceci n'est que du calcul réalisé par le sniffer</span>
 +    Arrival Time: Dec  3, 2001 15:12:09.426679          <span class="txtb">ces informations ne correspondent à aucune donnée</span>
 +    Time delta from previous packet: 10.824602 seconds  <span class="txtb">écrite dans la trame</span>
 +    Time relative to first packet: 11.398184 seconds
 +    Frame Number: 4
 +    Packet Length: 32 bytes
 +    Capture Length: 32 bytes                            <span class="txtb">................................................</span>
 +Ethernet II                                             <span class="txtb">Les informations capturées commencent ici</span>
 +    Destination: ff:ff:ff:ff:ff:ff (ff:ff:ff:ff:ff:ff)  <span class="hlw">ff ff ff ff ff ff</span>
 +    <span class="txtb">*** La destination est bien un « broadcast »
 +        sur les adresses MAC</span>
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)           <span class="hlo">00 60 8c 50 f0 df</span>
 +    <span class="txtb">*** La source est l'adresse MAC
 +        de l'interface Ethernet
 +    *** connectée au modem ADSL</span>
 +    Type: PPPoE Discovery (0x8863)                      <span class="hlv">88 63</span>
 +    <span class="txtb">*** ETHER_TYPE est bien à 8863H</span>
 +PPP-over-Ethernet Discovery
 +    Version: 1
 +    Type: 1                                             <span class="hlm">11</span>
 +    Code: Active Discovery Initiation (PADI)            <span class="hly">09</span>
 +    <span class="txtb">*** C'est bien une trame PADI Le champ « code » est à 9</span>
 +    Session ID: 0000                                    00 00
 +    <span class="txtb">*** Le champ « Session_ID » est bien à 0</span>
 +    Payload Length: 12                                  00 0c
 +PPPoE Tags
 +    Tag: Service-Name                                   <span class="hlg">01 01 00 00</span>
 +    <span class="txtb">*** Le Tag « Service-Name, comme indiqué</span>
 +    Tag: Host-Uniq                                      <span class="hlb">01 03 00 04</span>
 +    <span class="txtb">*** Et un autre Tag: Host-Uniq</span>                      <span class="hln">3d 53 00 00</span>
 +        Binary Data: (4 bytes)
 +</pre></html>
 +
 +Remarquez la similitude avec ''DHCP discovery'' dans le prococole DHCP. Le client qui se « réveille » envoie un broadcast ARP pour trouver un interlocuteur qui devra lui indiquer ses paramètres de configuration.
 +
 +Le Tag « Host-Uniq » est décrit dans l'annexe A:
 +
 +<html><div class="encadre"></html>
 +**0x0103 Host-Uniq**\\
 +Ce Tag est utilisé par un hôte pour associer de façon unique la réponse d'un concentrateur d'accès (PADO ou PADS) à la requête d'un hôte particulier (PADI ou PADR). Sa valeur est une donnée binaire de n'importe quelle valeur et de n'importe quelle longueur, choisies par l'hôte. Cette valeur n'est pas interprétée par le concentrateur d'accès
 +
 +Un hôte PEUT inclure un Tag « Host-Uniq » dans un paquet PADI ou PADR. Si le concentrateur d'accès reçoit ce Tag, il DOIT inclure ce Tag sans le modifier dans la réponse PADO ou PADS associée.
 +<html></div></html>
 +
 +Ce Tag (0x0103) est suivi du nombre d'octets qu'il contient (0x0004) et des octets de données (0x3d530000). Nous devrions donc théoriquement retrouver ce Tag dans son intégralité dans la réponse PADO qui suit
 +
 +Il n'y a pas ici d'agent de relais. Pour l'instant, tout est donc bien conforme.
 +
 +>**__Note__**: Le « Payload » est assez difficile à bien traduire, peut-être par « Données utiles » (mais elles sont toutes utiles). Comme en mot-à-mot, ça donne : « la charge qui paye », nous dirons « charge utile ». En s'appuyant sur cette analyse de trames, on constate que le « payload length » n'est autre que le nombre d'octets qui suivent, ce qui sera confirmé dans la suite.\\  Ce payload contient des « tags », un peu plus facile à traduire...
 +
 +<html><div class="encadre"></html>
 +**Le paquet PADO (PPPoE Active Discovery Offer)**\\
 +Quand le concentrateur d'accès reçoit un PADI qu'il peut servir, il répond en envoyant un paquet PADO. l'adresse de destination est l'adresse unicast de l'hôte envoyé dans le PADI. Le champ CODE est fixé à 0x07 et le champ SESSION_ID à 0x0000.
 +
 +Le paquet PADO doit contenir un TAG AC-Name : c'est le nom du concentrateur d'accès, un TAG Service-Name identique à celui contenu dans le PADI. Les autres numéros correspondent aux autres services qui peuvent être offerts par le concentrateur d'accès. Si le concentrateur d'accès ne peut pas servir le PADI alors celui-ci ne répond pas avec un PADO.
 +<html></div></html>
 +
 +Le client qui a démarré sa connexion PPPoE vient d'essayer de découvrir un interlocuteur, le ou les interlocuteurs présents vont maintenant lui répondre.
 +
 +<html><pre class="code">
 +0000  <span class="hlw">00 60 8c 50 f0 df</span> <span class="hlo">00 02 3b 00 4f 7d</span> <span class="hlv">88 63</span> <span class="hlm">11</span> <span class="hly">07</span>
 +0010  00 00 00 2b <span class="hlg">01 01 00 00</span> <span class="hlb">01 03 00 04</span> <span class="hln">3d 53 00 00</span>
 +0020  <span class="bhlw">01 02 00 17</span> <span class="bhlo">36 32 30 33 32 30 33 30 31 30 38 33</span>
 +0030  <span class="bhlo">37 36 2d 42 53 4d 41 52 31 30 32</span> <span class="bhlv">01 01 00 00</span>
 +
 +Frame 5 (63 on wire, 63 captured)
 +    Arrival Time: Dec  3, 2001 15:12:09.479615
 +    Time delta from previous packet: 0.052936 seconds
 +    Time relative to first packet: 11.451120 seconds
 +    Frame Number: 5
 +    Packet Length: 63 bytes
 +    Capture Length: 63 bytes
 +Ethernet II
 +    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)    <span class="hlw">00 60 8c 50 f0 df</span>
 +    <span class="txtb">*** La destination est ici le client</span>
 +    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)      <span class="hlo">00 02 3b 00 4f 7d</span>
 +    <span class="txtb">*** Et la source, l'équipement
 +        du gestionnaire du réseau</span>
 +    Type: PPPoE Discovery (0x8863)                    <span class="hlv">88 63</span>
 +    <span class="txtb">*** C'est toujours un type « Discovery »</span>
 +PPP-over-Ethernet Discovery
 +    Version:                                        <span class="hlm">11</span>
 +    Type: 1
 +    Code: Active Discovery Offer (PADO)               <span class="hly">07</span>
 +    <span class="txtb">*** Mais ici, c'est un « Offer »</span>
 +    Session ID: 0000                                  00 00
 +    Payload Length: 43  00 2b                         00 2b
 +PPPoE Tags
 +    Tag: Service-Name                                 <span class="hlg">01 01 00 00</span>
 +    <span class="txtb">*** Nous retrouvons, comme prévu,
 +        le Tag « Host-Uniq »</span>
 +    Tag: Host-Uniq                                    <span class="hlb">01 03 00 04</span>
 +      Binary Data: (4 bytes)                          <span class="hln">3d 53 00 00</span>
 +    <span class="txtb">*** Le Tag « AC_NAME »...</span>
 +    Tag: AC-Name                                      <span class="bhlw">01 02 00 17</span>
 +    <span class="txtb">*** Et sa valeur (nom du concentrateur d'accès)</span>
 +      String Data: 62032030108376-BSMAR102            <span class="bhlo">36 32 30 33 32 30 33 30 31 30 38 33</span>
 +                                                      <span class="bhlo">37 36 2d 42 53 4d 41 52 31 30 32</span>
 +    Tag: Service-Name                                 <span class="bhlv">01 01 00 00</span>
 +</pre></html>
 +
 +Tout ceci devient monotone, il n'y a aucune surprise... Tant pis pour le « suspense », il n'y aura pas d'autres réponses PADO.  Nous allons donc maintenant retrouver l'hôte qui envoie un paquet  PADR (Session-Request).
 +
 +<html><div class="encadre"></html>
 +**Le paquet PADR (PPPoE Active Discovery Request)**\\ Puisque le PADI a été envoyé en broadcast l'hôte peut recevoir plusieurs PADO. L'hôte examine les paquets PADO reçus et en choisit un. Le choix peut être basé sur le nom du concentrateur d'accès ou sur les services offerts. L'hôte envoie alors un paquet PADR au concentrateur d'accès sélectionné. Le champ DESTINATION_ADDR est l'adresse Ethernet unicast du concentrateur d'accès qui a envoyé par le PADO. Le champ CODE est 0x19 et le champ SESSION_ID est à la valeur 0x0000.
 +
 +Le paquet PADR doit contenir exactement un TAG_TYPE contenant le nom du service que l'hôte demande ainsi que d'autres numéros d'autres types de TAG.
 +<html></div></html>
 +
 +<html><pre class="code">
 +0000  <span class="hlw">00 02 3b 00 4f 7d</span> <span class="hlo">00 60 8c 50 f0 df</span> <span class="hlv">88 63</span> <span class="hlm">11</span> <span class="hly">19</span>
 +0010  00 00 00 0c <span class="hlg">01 01 00 00</span> <span class="hlb">01 03 00 04</span> <span class="hln">3d 53 00 00</span>
 +
 +Frame 6 (32 on wire, 32 captured)
 +    Arrival Time: Dec  3, 2001 15:12:09.480206
 +    Time delta from previous packet: 0.000591 seconds
 +    Time relative to first packet: 11.451711 seconds
 +    Frame Number: 6
 +    Packet Length: 32 bytes
 +    Capture Length: 32 bytes
 +Ethernet II
 +    <span class="txtb">*** Vous avez compris maintenant le niveau Ethernet...</span>
 +    Destination: 00:02:3b:00:4f:7d (Redback_00:4f:7d)         <span class="hlw">00 02 3b 00 4f 7d</span>
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)                 <span class="hlo">00 60 8c 50 f0 df</span>
 +    Type: PPPoE Discovery (0x8863)                            <span class="hlv">88 63</span>
 +    <span class="txtb">*** Et je vous laisse faire la suite tout seuls...</span>
 +PPP-over-Ethernet Discovery
 +    Version: 1
 +    Type: 1                                                   <span class="hlm">11</span>
 +    Code: Active Discovery Request (PADR)                     <span class="hly">19</span>
 +    Session ID: 0000                                          00 00
 +    Payload Length: 12                                        00 0c
 +PPPoE Tags
 +    Tag: Service-Name                                         <span class="hlg">01 01 00 00</span>
 +    Tag: Host-Uniq                                            <span class="hlb">01 03 00 04</span>
 +      Binary Data: (4 bytes)                                  <span class="hln">3d 53 00 00</span>
 +</pre></html>
 +
 +Il n'y a pas de grosses différences avec le paquet PADI, si ce n'est que l'adresse du destinataire n'est plus une adresse de broadcast, mais celle du concentrateur d'accès, puisque maintenant, on la connaît.
 +
 +Finalement, le Concentrateur d'accès va confirmer cette connexion :
 +
 +<html><div class="encadre"></html>
 +**Le paquet PADS(PPPoE Active Discovery Session-confirmation)**\\ Quand le Concentrateur d'Accès reçoit un paquet PADR, il se prépare à commencer une session PPP. Il produit un SESSION_ID unique pour la session PPPOE et répond à l'hôte avec un paquet PADS. Le champ DESTINATION_ADDR est l'adresse Ethernet unicast de l'hôte qui a envoyé le PADR. Le champ CODE est mis à 0x65 et le SESSION_ID DOIT être mis à la valeur unique produite pour cette session PPPOE.
 +
 +Le paquet PADS contient exactement un TAG_TYPE contenant le nom du service sous lequel le concentrateur d'accès a accepté la session PPPoE et d'autres numéros pour d'autres types de TAG.
 +
 +Si le concentrateur d'accès n'accepte pas le service proposé dans le PADR, il doit répondre avec des PADS contenant TAG _TYPE Service-Name-Error (et d'autres numéros d'autres TAG). Dans ce cas le SESSION_ID DOIT être à la valeur 0x0000.
 +<html></div></html>
 +
 +<html><pre class="code">
 +0000  <span class="hlw">00 60 8c 50 f0 df</span> <span class="hlo">00 02 3b 00 4f 7d</span> <span class="hlv">88 63</span> <span class="hlm">11</span> <span class="hly">65</span>
 +0010  02 f4 00 2b <span class="hlg">01 01 00 00</span> <span class="hlb">01 03 00 04</span> <span class="hln">3d 53 00 00</span>
 +0020  <span class="bhlw">01 02 00 17</span> <span class="bhlo">36 32 30 33 32 30 33 30 31 30 38 33</span>
 +0030  <span class="bhlo">37 36 2d 42 53 4d 41 52 31 30 32</span>
 +
 +Frame 7 (60 on wire, 60 captured)
 +    Arrival Time: Dec  3, 2001 15:12:09.547915
 +    Time delta from previous packet: 0.067709 seconds
 +    Time relative to first packet: 11.519420 seconds
 +    Frame Number: 7
 +    Packet Length: 60 bytes
 +    Capture Length: 60 bytes
 +Ethernet II
 +    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)      <span class="hlw">00 60 8c 50 f0 df</span>
 +    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)        <span class="hlo">00 02 3b 00 4f 7d</span>
 +    Type: PPPoE Discovery (0x8863)                      <span class="hlv">88 63</span>
 +PPP-over-Ethernet Discovery
 +    Version: 1
 +    Type: 1                                             <span class="hlm">11</span>
 +    Code: Active Discovery Session-confirmation (PADS)  <span class="hly">65</span>
 +    <span class="txtb">*** Nous récupérons ici la Session-ID</span>
 +    Session ID: 02f4                                    02 f4
 +    Payload Length: 43                                  00 2b
 +PPPoE Tags
 +    Tag: Service-Name                                   <span class="hlg">01 01 00 00</span>
 +    Tag: Host-Uniq                                      <span class="hlb">01 03 00 04</span>
 +      Binary Data: (4 bytes)                            <span class="hln">3d 53 00 00</span>
 +    Tag: AC-Name                                        <span class="bhlw">01 02 00 17</span>
 +      String Data: 62032030108376-BSMAR102              <span class="bhlo">36 32 30 33 32 30 33 30 31 30 38 33</span>
 +                                                        <span class="bhlo">37 36 2d 42 53 4d 41 52 31 30 32</span>
 +</pre></html>
 +
 +Il n'y a pas eu de problèmes, la session est acceptée par les deux partenaires et elle aura l'identifiant 0x02f4. Nous retrouverons systématiquement cet identifiant dans tous les paquets qui suivront.
 +
 +C'est fini pour l'établissement de la session PPPoE. Comme vous avez pu le remarquer, c'est assez simple et il n'y a pas grand chose de fait. Tout de même, faisons un petit bilan:
 +
 +  * L'hôte client a cherché et trouvé un Concentrateur d'accès.
 +  * Le Concentrateur d'accès a délivré à l'hôte client:
 +    * Son adresse MAC (ici : 00:02:3b:00:4f:7d)
 +    * Un numéro de session PPPoE (ici : 0x02f4)
 +
 +== Etablissement de PPP ==
 +
 +Tout ceci est très bien, mais nous n'avons pas d'adresse IP, ni de passerelle, ni de DNS... Autant de choses nécessaires pour faire fonctionner correctement TCP/IP, sans oublier que, pour l'instant, nous ne sommes toujours pas authentifiés.
 +
 +Le reste va maintenant être négocié par le protocole PPP, de la même manière qu'avec une connexion « classique » par modem RTC.
 +
 +PPP est encore une autre affaire, qui dépasse le cadre de ce chapitre. Nous n'allons donc pas étudier par le détail les trames qui suivent. Nous allons tout de même regarder comment les informations qui nous manquent pour l'instant vont être récupérées. Si vous désirez absolument approfondir PPP, vous avez les [[http://abcdrfc.free.fr/rfc-vf/rfc1661.html|RFC 1661 traduites en français ici]].
 +
 +Voici le sommaire des trames qui nous intéressent :
 +
 +    Redback_00:4f:7d   3Com_50:f0:df      PPP LCP    PPP LCP Configuration Request
 +    3Com_50:f0:df      Redback_00:4f:7d   PPP LCP    PPP LCP Configuration Request
 +  10  3Com_50:f0:df      Redback_00:4f:7d   PPP LCP    PPP LCP Configuration Ack
 +  11  Redback_00:4f:7d   3Com_50:f0:df      PPP LCP    PPP LCP Configuration Ack
 +  12  3Com_50:f0:df      Redback_00:4f:7d   PPP LCP    PPP LCP Echo Request
 +  13  Redback_00:4f:7d   3Com_50:f0:df      0xc223     PPP Cryptographic Handshake Auth. Protocol (0xc223)
 +  14  3Com_50:f0:df      Redback_00:4f:7d   0xc223     PPP Cryptographic Handshake Auth. Protocol (0xc223)
 +  15  Redback_00:4f:7d   3Com_50:f0:df      PPP LCP    PPP LCP Echo Reply
 +  16  Redback_00:4f:7d   3Com_50:f0:df      0xc223     PPP Cryptographic Handshake Auth. Protocol (0xc223)
 +  17  Redback_00:4f:7d   3Com_50:f0:df      PPP LCP    PPP LCP Echo Request
 +  18  Redback_00:4f:7d   3Com_50:f0:df      PPP IPCP   PPP IPCP Configuration Request
 +  19  3Com_50:f0:df      Redback_00:4f:7d   PPP IPCP   PPP IPCP Configuration Request
 +  20  3Com_50:f0:df      Redback_00:4f:7d   PPP LCP    PPP LCP Echo Reply
 +  21  3Com_50:f0:df      Redback_00:4f:7d   PPP IPCP   PPP IPCP Configuration Ack
 +  22  Redback_00:4f:7d   3Com_50:f0:df      PPP IPCP   PPP IPCP Configuration Nak
 +  23  3Com_50:f0:df      Redback_00:4f:7d   PPP IPCP   PPP IPCP Configuration Request
 +  24  Redback_00:4f:7d   3Com_50:f0:df      PPP IPCP   PPP IPCP Configuration Ack
 +  25  Redback_00:4f:7d   3Com_50:f0:df      IP         Bogus IP header length (0, must be at least 20)
 +  26  Redback_00:4f:7d   3Com_50:f0:df      PPP LCP    PPP LCP Echo Request
 +  27  3Com_50:f0:df      Redback_00:4f:7d   PPP LCP    PPP LCP Echo Reply
 +
 +Nous n'allons pas les détailler, mais juste en extraire les points les plus importants. Déjà, nous allons sauter les LCP Echo request et reply, qui ne présentent pas un intérêt fondamental pour ce qui nous intéresse, si ce n'est qu'ils sont recommandés par les RFC.
 +
 +Le protocole LCP (Link Control Protocol) est transporté par PPP. Sa fonction, comme son nom l'indique, est de maintenir le bon état du lien PPP. En particulier, c'est lui qui va permettre de négocier au départ la configuration IP du client, ce que nous allons voir tout de suite.
 +
 +== Demande de configuration de la part du concentrateur d'accès ==
 +
 +<html><pre class="code">
 +Frame 8 (60 on wire, 60 captured)
 +...
 +Ethernet II                                         <span class="bhlg"><span class="txtb">Ethernet</span></span>
 +<span class="bhly">    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>  <span class="txtb">La cible est le client</span>
 +
 +<span class="bhly">    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)</span>    <span class="txtb">La source est le Concentrateur d'accès</span>
 +<span class="bhly">    Type: PPPoE Session (0x8864)</span>
 +PPP-over-Ethernet Session                           <span class="bhlg"><span class="txtb">PPPoE</span></span>
 +...
 +<span class="bhly">    Code: Session Data
 +    Session ID: 02f4</span>                                <span class="txtb">Le Session-ID qui a été négocié précédemment</span>
 +    Payload Length: 21
 +Point-to-Point Protocol                             <span class="bhlg"><span class="txtb">PPP</span></span>
 +    Protocol: Link Control Protocol (0xc021)
 +PPP Link Control Protocol                           <span class="bhlg"><span class="txtb">LCP</span></span>
 +<span class="bhly">    Code: Configuration Request (0x01)</span>
 +    Identifier: 0x6d
 +    Length: 19
 +    Options: (15 bytes)
 +<span class="bhlm">        MRU: 1492                                   <span class="txtb">Très important!!!, nous y reviendrons.</span></span>
 +L'identification va être cryptée**
 +<span class="bhly">        Authentication protocol: 5 bytes</span>            <span class="txtb">(Cryptographic Handshake Auth. Protocol)</span>
 +<span class="bhly">            Authentication protocol: CHAP (0xc223)</span>  <span class="txtb">Le « Nombre Magique » est sans intérêt pour nous</span>
 +            Data (1 byte)                           <span class="txtb">(voir RFC 1661)</span>
 +        Magic number: 0x2889d071
 +</pre></html>
 +
 +> //MRU: Maximum Receive Unit, taille maximale en octets d'un paquet acceptable en réception. C'est la valeur qui devra être adoptée pour le MTU (Maximum Transfert Unit) de l'interlocuteur.//
 +
 +== Demande de configuration de la part du client. ==
 +<html><pre class="code">
 +Frame 9 (36 on wire, 36 captured)                        <span class="txtb">Le client n'a pas grand chose à réclamer</span>
 +    ...                                                  <span class="txtb">pour la configuration...</span>
 +Ethernet II
 +<span class="bhly">    Destination: 00:02:3b:00:4f:7d (Redback_00:4f:7d)
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +<span class="bhly">    Code: Session Data
 +    Session ID: 02f4</span>
 +    Payload Length: 16
 +Point-to-Point Protocol
 +    Protocol: Link Control Protocol (0xc021)
 +PPP Link Control Protocol
 +<span class="bhly">    Code: Configuration Request (0x01)</span>
 +    Identifier: 0x01
 +    Length: 14
 +    Options: (10 bytes)
 +<span class="bhly">        MRU: 1492</span>                                        <span class="txtb">Le MRU, également à 1492.</span>
 +        Magic number: 0x694c9902
 +</pre</html>
 +
 +> //Mais pourquoi 1492 ? Une trame Ethernet ne doit pas dépasser 1500 Octets. Comme l'en-tête de PPPoE fait 6 octets et que le PPP_ID est de 2 octets, il ne reste que 1492 octets pour le PPP_MTU.//
 +
 +== Acquittement du client ==
 +<html><pre class="code">
 +Frame 10 (41 on wire, 41 captured)                     <span class="txtb">Le client est d'accord pour :</span>
 +    ...
 +Ethernet II
 +<span class="bhly">    Destination: 00:02:3b:00:4f:7d (Redback_00:4f:7d)
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 21
 +Point-to-Point Protocol
 +    Protocol: Link Control Protocol (0xc021)
 +PPP Link Control Protocol
 +<span class="bhly">    Code: Configuration Ack (0x02)</span>
 +    Identifier: 0x6d
 +    Length: 19
 +    Options: (15 bytes)
 +        MRU: 1492                                       <span class="txtb">Le MRU à 1492</span>
 +        Authentication protocol: 5 bytes
 +<span class="bhly">            Authentication protocol: CHAP (0xc223)</span>      <span class="txtb">le protocole CHAP pour l'authentification</span>
 +            Data (1 byte)
 +        Magic number: 0x2889d071                        <span class="txtb">Et le numéro magique</span>
 +</pre></html>
 +
 +== Acquittement du concentrateur d'accès ==
 +<html><pre class="code">
 +Frame 11 (60 on wire, 60 captured)                      <span class="txtb">Le concentrateur d'accès est d'accord pour:</span>
 +    ...
 +Ethernet II
 +<span class="bhly">    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)
 +    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 16
 +Point-to-Point Protocol
 +    Protocol: Link Control Protocol (0xc021)
 +PPP Link Control Protocol
 +<span class="bhly">    Code: Configuration Ack (0x02)</span>
 +    Identifier: 0x01
 +    Length: 14
 +    Options: (10 bytes)
 +        MRU: 1492                                       <span class="txtb">Le MRU à 1492</span>
 +        Magic number: 0x694c9902                        <span class="txtb">Et le numéro magique.</span>
 +</pre></html>
 +
 +== Authentification du Concentrateur ==
 +<html><pre class="code">
 +Frame 13 (60 on wire, 60 captured)                                       <span class="txtb">Le concentrateur envoie au client</span>
 +    ...                                                                  <span class="txtb">un paquet de données...</span>
 +Ethernet II
 +<span class="bhly">    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)
 +    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 31
 +Point-to-Point Protocol
 +<span class="bhly">    Protocol: Cryptographic Handshake Auth. Protocol (0xc223)</span>
 +Data (38 bytes)
 +
 +0000  00 60 8c 50 f0 df 00 02 3b 00 4f 7d 88 64 11 00   .`.P....;.O}.d..  <span class="txtb">Le détail de ce paquet pourrait être</span>
 +0010  02 f4 00 1f c2 23 01 01 00 1d 10 75 51 f4 58 40   .....#.....uQ.X@  <span class="txtb">décrit en étudiant le protocole CHAP...</span>
 +0020  38 9b 08 c2 8f 76 9f 8e 89 81 3c <span class="bhly">42 53 4d 41 52</span>   8....v....&lt;<span class="bhly">BSMAR</span>  <span class="txtb">Notez que le nom du concentrateur</span>
 +0030  <span class="bhly">31 30 32</span> 66 00 50 35 d1 cc 8f 00 00               <span class="bhly">102</span>f.P5.....      <span class="txtb">apparaît en clair</span>
 +</pre></html>
 +
 +== Authentification du client ==
 +<html><pre class="code">
 +Frame 14 (58 on wire, 58 captured)                                       <span class="txtb">Le client envoie au concentrateur</span>
 +    ...                                                                  <span class="txtb">un paquet de données...</span>
 +Ethernet II
 +<span class="bhly">    Destination: 00:02:3b:00:4f:7d (Redback_00:4f:7d)
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 38
 +Point-to-Point Protocol
 +    Protocol: Cryptographic Handshake Auth. Protocol (0xc223)
 +Data (36 bytes)
 +
 +0000  00 02 3b 00 4f 7d 00 60 8c 50 f0 df 88 64 11 00   ..;.O}.`.P...d.. <span class="txtb">Le détail de ce paquet pourrait être</span>
 +0010  02 f4 00 26 c2 23 02 01 00 24 10 38 af 00 96 c1   ...&amp;.#...$.8.... <span class="txtb">décrit en étudiant le protocole CHAP...</span>
 +0020  b0 95 b2 b2 ee 6f be bb d4 cd 5e <span class="bhly">66 74 69 2f xx</span>   .....o....^<span class="bhly">fti/x</span> <span class="txtb">Notez que le nom du client apparaît</span>
 +0030  <span class="bhly">xx xx xx xx xx xx 40 66 74 69</span>                     <span class="bhly">xxxxxx@fti</span>       <span class="txtb">également en clair</span>
 +                                                                         <span class="txtb">(les x, c'est de ma part).</span>
 +</pre></html>
 +
 +== Le verdict... ==
 +<html><pre class="code">
 +Frame 16 (61 on wire, 61 captured)
 +    ...
 +Ethernet II
 +<span class="bhly">    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)
 +    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 41
 +Point-to-Point Protocol
 +<span class="bhly">    Protocol: Cryptographic Handshake Auth. Protocol (0xc223)</span>
 +Data (39 bytes)
 +
 +0000  00 60 8c 50 f0 df 00 02 3b 00 4f 7d 88 64 11 00   .`.P....;.O}.d.. <span class="txtb">On ne sait pas exactement comment, mais...</span>
 +0010  02 f4 00 29 c2 23 03 01 00 27 <span class="bhly">43 48 41 50 20 61</span>   ...).#...'<span class="bhly">CHAP a</span> <span class="txtb">L'authentification a réussi.</span>
 +0020  <span class="bhly">75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 73 75</span>   <span class="bhly">uthentication su</span>
 +0030  <span class="bhly">63 63 65 73 73 2c 20 75 6e 69 74 20 39</span>            <span class="bhly">ccess, unit 9</span>
 +</pre></html>
 +
 +== Requête de configuration du concentrateur ==
 +<html><pre class="code">
 +Frame 18 (60 on wire, 60 captured)                 <span class="txtb">A vrai dire</span>
 +    ...                                            <span class="txtb">Ce n'est pas exactement une requête</span>
 +
 +Ethernet II
 +<span class="bhly">    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)</span> <span class="txtb">Le concentrateur n'a rien à demander</span>
 +<span class="bhly">    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 12
 +Point-to-Point Protocol
 +    Protocol: IP Control Protocol (0x8021)
 +PPP IP Control Protocol
 +<span class="bhly">    Code: Configuration Request (0x01)</span>             <span class="txtb">il annonce juste son IP</span>
 +    Identifier: 0x6e
 +    Length: 10
 +    Options: (6 bytes)
 +<span class="bhly">        IP address: 217.128.147.1</span>
 +</pre></html>
 +
 +== Requête de configuration du client ==
 +<html><pre class="code">
 +Frame 19 (44 on wire, 44 captured)                     <span class="txtb">Ici, c'est plus amusant.</span>
 +    ...                                                <span class="txtb">Le client propose une configuration</span>
 +Ethernet II
 +<span class="bhly">    Destination: 00:02:3b:00:4f:7d (Redback_00:4f:7d)
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 24
 +Point-to-Point Protocol
 +    Protocol: IP Control Protocol (0x8021)
 +PPP IP Control Protocol
 +<span class="bhly">    Code: Configuration Request (0x01)</span>
 +    Identifier: 0x01
 +    Length: 22
 +    Options: (18 bytes)
 +<span class="bhly">        IP address: 0.0.0.0</span>                            <span class="txtb">Comme il se réveille juste, il propose</span>
 +<span class="bhly">        Primary DNS server IP address: 0.0.0.0</span>         <span class="txtb">une configuration plutôt farfelue...</span>
 +<span class="bhly">        Secondary DNS server IP address: 0.0.0.0</span>
 +</pre></html>
 +
 +== Acquittement de la configuration du concentrateur ==
 +<html><pre class="code">
 +Frame 21 (32 on wire, 32 captured)
 +    ...
 +Ethernet II
 +<span class="bhly">    Destination: 00:02:3b:00:4f:7d (Redback_00:4f:7d)
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 12
 +Point-to-Point Protocol
 +    Protocol: IP Control Protocol (0x8021)
 +PPP IP Control Protocol
 +<span class="bhly">    Code: Configuration Ack (0x02)</span>                      <span class="txtb">Le client est d'accord...</span>
 +    Identifier: 0x6e
 +    Length: 10
 +    Options: (6 bytes)                                  <span class="txtb">Pour l'adresse IP du concentrateur</span>
 +<span class="bhly">        IP address: 217.128.147.1</span>                       <span class="txtb">(qui deviendra sa passerelle par défaut)</span>
 +</span></html>
 +
 +== Refus de la configuration du client ==
 +<html><pre class="code">
 +Frame 22 (60 on wire, 60 captured)                     <span class="txtb">On s'en souvient, le client avait</span>
 +    ...                                                <span class="txtb">proposé une configuration stupide.</span>
 +Ethernet II
 +<span class="bhly">    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>     <span class="txtb">En fait, elle ne l'était pas.</span>
 +<span class="bhly">    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)</span>       <span class="txtb">Ne connaissant pas sa configuration,</span>
 +    Type: PPPoE Session (0x8864)                       <span class="txtb">le client indique des adresses</span>
 +PPP-over-Ethernet Session                              <span class="txtb">toutes à zéro.</span>
 +    Version: 1
 +    Type: 1                                            <span class="txtb">C'est dans le but que le concentrateur</span>
 +    Code: Session Data                                 <span class="txtb">lui propose à la place des adresses</span>
 +    Session ID: 02f4                                   <span class="txtb">valides</span>
 +    Payload Length: 24
 +Point-to-Point Protocol
 +    Protocol: IP Control Protocol (0x8021)
 +PPP IP Control Protocol
 +<span class="bhlo">    Code: Configuration Nak (0x03)</span>
 +    Identifier: 0x01
 +    Length: 22
 +    Options: (18 bytes)
 +<span class="bhlo">        IP address: 217.128.147.4</span>                      <span class="txtb">Son IP</span>
 +<span class="bhlo">        Primary DNS server IP address: 193.252.19.3</span>    <span class="txtb">Et le (ici les) DNS.</span>
 +<span class="bhlo">        Secondary DNS server IP address: 193.252.19.4</span>
 +</pre></html>
 +
 +== Re-requête de configuration du client ==
 +<html><pre class="code">
 +Frame 23 (44 on wire, 44 captured)                     <span class="txtb">Un protocole, c'est parfois bête,</span>
 +    ...                                                <span class="txtb">mais toujours discipliné.</span>
 +Ethernet II
 +<span class="bhly">    Destination: 00:02:3b:00:4f:7d (Redback_00:4f:7d)
 +    Source: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 24
 +Point-to-Point Protocol
 +    Protocol: IP Control Protocol (0x8021)
 +PPP IP Control Protocol
 +<span class="bhly">    Code: Configuration Request (0x01)</span>
 +    Identifier: 0x02
 +    Length: 22                                        <span class="txtb">Le client refait une requête de configuration</span>
 +    Options: (18 bytes)                               <span class="txtb">cette fois-ci avec les adresses qui lui ont été</span>
 +<span class="bhly">        IP address: 217.128.147.4</span>                     <span class="txtb">« suggérées » par le concentrateur...</span>
 +<span class="bhly">        Primary DNS server IP address: 193.252.19.3</span>
 +<span class="bhly">        Secondary DNS server IP address: 193.252.19.4</span>
 +</pre></html>
 +
 +== Acquittement de la configuration du client ==
 +<html><pre class="code">
 +Frame 24 (60 on wire, 60 captured)                    <span class="txtb">Le concentrateur, sous peine de passer</span>
 +    ...                                               <span class="txtb">pour un fou,</span>
 +Ethernet II                                           <span class="txtb">ne pourra pas faire autrement (en principe)</span>
 +<span class="bhly">    Destination: 00:60:8c:50:f0:df (3Com_50:f0:df)</span>    <span class="txtb">que d'accepter cette configuration</span>
 +<span class="bhly">    Source: 00:02:3b:00:4f:7d (Redback_00:4f:7d)</span>      <span class="txtb">qu'il a proposé lui-même.</span>
 +    Type: PPPoE Session (0x8864)
 +PPP-over-Ethernet Session
 +    Version: 1
 +    Type: 1
 +    Code: Session Data
 +    Session ID: 02f4
 +    Payload Length: 24
 +Point-to-Point Protocol
 +    Protocol: IP Control Protocol (0x8021)
 +PPP IP Control Protocol
 +<span class="bhly">    Code: Configuration Ack (0x02)</span>                    <span class="txtb">Voilà qui est fait.</span>
 +    Identifier: 0x02
 +    Length: 22
 +    Options: (18 bytes)
 +<span class="bhly">        IP address: 217.128.147.4
 +        Primary DNS server IP address: 193.252.19.3
 +        Secondary DNS server IP address: 193.252.19.4</span>
 +</pre></html>
 +
 +Toute cette séquence n'aura duré que 3 secondes .
 +
 +  * Etablissement d'une session PPPoE entre le client et le concentrateur, avec établissement d'un identifiant de session.
 +  * Authentification du client de la part du concentrateur par LCP (sur PPP)
 +  * Obtention d'une configuration valide pour le client (Adresse IP, Adresses de DNS et Passerelle, la passerelle étant bien entendu le concentrateur lui-même).
 +
 +===== Conclusions =====
 +
 +J'espère que cet exposé vous aura éclairé sur le fonctionnement de ce protocole qui tend à devenir universel sur les connexions « haut débit ». Les points principaux à retenir me semble être les suivants:
 +
 +  * Etablissement d'une connexion PPP au dessus d'Ethernet avec obtention d'un identifiant de session.
 +  * Identification du client avec LCP, protocole de gestion et de maintenance d'une connexion PPP.
 +  * Obtention des paramètres de connexion IP par ce même protocole LCP.
 +  * Transport des datagrammes IP par PPP, lui même transporté par Ethernet.
Les détails: Dernière modification le: 01/01/1970 à 00:00 par