<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
     "dtd/xml/4.3/docbookx.dtd"[
<!ENTITY % afnic_custom SYSTEM "../lib/afnic-docbook.inc">
%afnic_custom;
<!ENTITY rappel_ip SYSTEM "rappel-ip.db">
<!ENTITY rappel_routage SYSTEM "rappel-routage.db">
<!ENTITY si_marche_pas SYSTEM "si-marche-pas.db">
<!ENTITY routeur SYSTEM "routeur.db">
<!ENTITY bgparticle SYSTEM "bgp.db" NDATA SGML> 
<!ENTITY rid "<foreignphrase>Router ID</foreignphrase>">
]>
<article lang="fr">
  <articleinfo>
    <author>
      <firstname>Stéphane</firstname>
      <surname>Bortzmeyer</surname>
      <affiliation>
	<orgname>AFNIC</orgname>
	<address>
	  <street>Immeuble International</street>
	  <postcode>78181</postcode>
	  <city>Saint-Quentin-en-Yvelines</city>
	  <country>France</country>
	  <email>bortzmeyer@nic.fr</email>
	</address>
      </affiliation>
    </author>
    <abstract>
<para>Ce document explique la conception et la configuration d'un
      réseau TCP/IP utilisant le routage dynamique, en l'occurrence avec
      le protocole OSPF. </para>
<para>Il se veut pratique : l'accent est mis sur une configuration
      simple qui devrait couvrir la plupart des cas. Il ne remplace
      donc pas un cours complet sur OSPF.</para>
    </abstract>
    <date>$Date: 2008/02/12 11:26:38 $</date>
    <copyright>
      <year>2003-2005</year>
      <holder>AFNIC</holder>
    </copyright>
    <releaseinfo>$Id: ospf-partial.db,v 1.2 2008/02/12 11:26:38 bortzmeyer Exp $</releaseinfo>
    <legalnotice>
      <para>Ce document est fourni pour vous permettre de comprendre et de
      configurer OSPF. Le ou les auteurs ne sont évidemment pas
      responsables des dégâts que vous causerez à votre réseau.</para>
<para>Ce document est distribué sous les termes de la <ulink
      url="http://www.gnu.org/licenses/licenses.html#FDL">GNU Free
      Documentation License</ulink>. Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.2
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.</para>
    </legalnotice>
    <title>Routage dynamique avec OSPF</title>
    <othercredit>
      <affiliation>
	<orgname>Gitoyen</orgname>
	<address><authorblurb>
	    <para>Une grande partie de ce cours a pu être faite grâce
	à l'expérience acquise en concevant et en déployant le réseau
	de l'opérateur Internet <ulink url="http://www.gitoyen.net/">Gitoyen</ulink>.</para>
	  </authorblurb>
</address>
      </affiliation>
    </othercredit>
    <modespec id="linktobgp" xreflabel="BGP, %t">http://www.nic.fr/formation/supports/formation-routagedyn/bgp/</modespec>
  </articleinfo>

  <section>
    <title>Introduction</title>
<section><title>Dois-je vraiment faire du routage dynamique ?</title>
<para>D'abord, il faut rappeler que le routage dynamique n'est pas
      toujours nécessaire, ni même utile. Si votre réseau est simple
      et de petite taille, un routage statique (des routes indiquées
      manuellement dans les routeurs) suffit très largement. </para>
<para>Dans ce
	cas là, si votre routeur est une machine Unix, vous n'avez
	aucun besoin de routed ou de Quagga. Ces logiciels ne servent
	qu'au routage dynamique. Le routage proprement dit (
	<foreignphrase>forwarding</foreignphrase>, par opposition à
	<foreignphrase>routing</foreignphrase> qui désigne la
	construction des tables de routage dynamiquement) est effectué par le
  noyau Unix.</para>
      <para>Même si vous avez de nombreux routeurs, si l'architecture
	du réseau est très simple, il peut être plus avantageux de
	faire du routage statique en utilisant un outil de génération
	des configurations comme <link linkend="tools">Rancid</link>, pour éviter de tout faire à la main.</para>
	<para>D'une manière générale, le routage dynamique est :
	<itemizedlist>
	  <listitem><para>Nécessaire, si vous avez plusieurs chemins
	  entre deux points et si vous voulez de la redondance
	  automatique en cas de défaillance d'un lien.</para>
	  </listitem>
<listitem><para>Utile si vous avez plus de quatre ou cinq routeurs et
	      qu'ils sont de marque différente, rendant difficile une
	      gestion centralisée de leur configuration.</para>
	  </listitem>
	</itemizedlist></para>
</section>
<section><title>Et quel protocole dois-je utiliser ?</title>
<para>Pendant un certain temps, plusieurs protocoles ont coexisté pour
      le routage à l'intérieur d'une organisation (entreprise,
      Université, etc<footnote><para>Ces protocoles se nomment les IGP
	  <foreignphrase>Interior Routing Protocol</foreignphrase>. Il
	  existe une autre famille, les EGP <foreignphrase>Exterior
	    Gateway Protocol</foreignphrase> dont <olink targetdocent="bgparticle" linkmode="linktobgp">BGP</olink> est quasiment le
	  seul membre. Ces EGP sont réservés aux opérateurs Internet.</para></footnote>). RIP et IGRP/EIGRP ont eu leur
      partisans. Aujourd'hui, seul OSPF reste en lice. </para>
<para>RIP souffrait de plusieurs limitations : convergence trop lente
	en cas de reconfiguration du réseau, limitation à quinze
	sauts, pas de <link linkend="hierarchical">routage
	  hiérarchique</link>. </para><para>À noter qu'il existe deux
	versions<footnote><para>Trois avec celle pour IPv6, RIPng.</para>
	</footnote> de RIP : RIPv1 n'accepte pas certains adressages
	(par exemple il oblige tous les sous-réseaux à avoir la même
	longueur de préfixe) mais il est très répandu et, pendant
	longtemps, il avait des partisans qui mettaient en avant sa
	disponibilité sur toutes les plate-formes. RIPv2 supprime cet
	inconvénient mais il n'a pas atteint la même ubiquité.</para>
<para>IGRP/EIGRP est un protocole spécifique à Cisco et ne doit donc
	pas être utilisé.</para>
<para>Pour un réseau
      nouveau, je ne pense pas qu'il y aie d'autres choix
      sérieux. OSPF est désormais mis en oeuvre sur toutes les
	plateformes.</para>
  </section>
&rappel_ip;
&rappel_routage;
&si_marche_pas;
<section><title>OSPF en quelques mots</title>
<para>Nous allons d'abord faire de l'OSPF avec une seule zone
	(<foreignphrase>area</foreignphrase>). Ce cas correspond à la
	grande majorité des utilisations, seules les grosses et
	complexes organisations ont vraiment besoin de routage en
	plusieurs zones (<xref linkend="hierarchical"/>).</para>
<para id="as">Vous avez donc un AS (<foreignphrase>Autonomous
	  System</foreignphrase>), c'est à dire une entité
	administrative unique (notez bien que la définition d'un AS
	n'est pas technique. En pratique, un AS est un système où une
	seule personne ou bien une seule équipe peut décider et que
	cette décision soit ensuite appliquée dans tout l'AS). Il
	existe deux sortes de routeurs dans votre unique zone (<phrase
	  id="backbone_area">qui
	porte le numéro 0, on l'appelle aussi <foreignphrase>backbone
	  area</foreignphrase></phrase>). Les ASBR (<foreignphrase>Autonomous
	  System Border Router</foreignphrase>) qui sont connectés à votre AS et à
	  l'extérieur (typiquement à un ou plusieurs fournisseurs
	  d'accès). Et les autres routeurs qui ne sont connectés qu'à
	  des liens internes.</para>
<para>Chaque routeur a une ou plusieurs interfaces sur lesquelles il
	fait tourner OSPF. La configuration consiste donc à déclarer
	sur chaque routeur quelles interfaces sont
	activées<footnote><para>Sur certains routeurs, cela
	    suffit. Sur d'autres, il faut indiquer les réseaux IP
	    actifs en OSPF.</para>
	</footnote>. Sur le ou
      les ASBR, il faut en outre indiquer quelle(s) routes externes
	sont redistribuées dans l'AS. Dans le cas le plus courant, on
	ne redistribue que la route par défaut.</para>
<para>Il existe plusieurs types de réseaux : en gros, vous risquez
	surtout de rencontrer des réseaux à diffusion
	(<foreignphrase>broadcast networks</foreignphrase>) comme
	Ethernet et des réseaux point à point
	(<foreignphrase>point-to-point networks</foreignphrase>) comme
	ceux réalisés avec le protocole PPP, par exemple sur une ligne
	téléphonique avec modem ou bien sur une ligne spécialisée
	numérique.</para>
<para>Sur les réseaux à diffusion, les routeurs OSPF du même segment
	sont dits voisins
	(<foreignphrase>neighbor</foreignphrase>). Sur chaque segment,
	les routeurs élisent un routeur (DR,
	<foreignphrase>Designated Router</foreignphrase>) qui va se
	charger de collecter toutes les informations et de les
	redistribuer. <important><para>Le routeur élu n'a un rôle
	    privilégié que pour la diffusion des informations OSPF. Pour le
	    routage proprement dit
	    (<foreignphrase>forwarding</foreignphrase>), il ne fait
	    rien de plus que les autres.</para>
	</important>Un routeur de secours (BDR,
	<foreignphrase>Backup Designated Router</foreignphrase>) est
	également élu et se tient prêt à le remplacer. Les autres
	routeurs sont dits jointifs
	(<foreignphrase>adjacent</foreignphrase>) de ces deux routeurs élus.</para>
<para>Bien sûr, OSPF est plus riche que cela, et permet beaucoup de
	réglages. Néanmoins, si vous avez déjà consulté un guide sur
	OSPF et que vous avez été effrayés par la quantité d'options,
	ne vous inquiétez pas : la plupart des configurations d'OSPF
	sont beaucoup plus simples.</para>
  </section>
<section><title>Quel matériel et logiciel choisir ?</title>
<para>Comme indiqué, OSPF tourne aujourd'hui sur tous les routeurs :
	machines Unix, routeurs dédiés dans une petite boite
	(<foreignphrase>appliances</foreignphrase>) et la plupart des
	 commutateurs(<foreignphrase>switches</foreignphrase>) de
	 milieu et de haut de gamme, qui ont également des fonctions de
	 routage (les commerciaux parlent parfois de
	 <foreignphrase>switches de niveau 3</foreignphrase>).</para>
 <para>L'inclinaison personnelle de l'auteur le porte vers les
	 <ulink url="http://www.april.org/">logiciels libres</ulink>
	 donc la majorité des exemples concerneront le couple
	 Unix+<ulink url="http://www.zebra.org/">Zebra</ulink> avec lequel l'auteur a le plus d'expérience. (Zebra a désormais un
successeur, <ulink url="http://www.quagga.net/">Quagga</ulink>, Zebra
ne semblant plus maintenu.) Ce
	 couple permet de faire du routage dynamique avec un simple PC,
	 et un Unix libre comme <ulink
	   url="http://www.debian.org/">Debian</ulink> ou bien <ulink url="http://www.freebsd.org/">FreeBSD</ulink>.</para>
 <para id="ios">Le système le plus utilisé pour les routeurs OSPF est
	 sans doute <ulink url="http://www.cisco.com/en/US/products/sw/iosswrel/index.html">IOS (Internetwork Operating System)</ulink> de Cisco. Les
	 commandes sont très proches de celles de Zebra. Beaucoup
	 d'autres routeurs (HP Procurve, Foundry) ont un jeu de
	 commandes très proche de celui d'IOS.</para>
   </section>
 &routeur;
   </section>

 <section id="premier-reseau"><title>Premier réseau et première configuration</title>

 <section id="unezone"><title>Une zone, aucune route externe</title>
 <para>Commençons par un réseau très simple, tellement simple qu'il
       n'aurait aucun besoin d'OSPF dans la réalité. Tous les réseaux
       sont des Ethernet, donc à diffusion, et il n'y a que trois
       routeurs, dont un seul a deux interfaces. Une seule zone est
       présente, la <link linkend="backbone_area">zéro</link>.</para>
 <figure float="0">
       <title>Réseau simple</title>
       <mediaobject>
	 <imageobject>
	   <imagedata fileref="reseau-simple.pdf" format="EPS"/>
	 </imageobject>
	 <imageobject>
	   <imagedata fileref="reseau-simple.png" format="PNG"/>
	 </imageobject>
	 <textobject>
	   <phrase>Schéma du réseau avec les trois routeurs</phrase>
	 </textobject>
	 <caption>
	   <para>Dans chaque routeur, son <foreignphrase>router
	   ID</foreignphrase>. Les liens sont tous des Ethernet.
	   </para>
	 </caption>
       </mediaobject>
      </figure>
 <para>La configuration d'un routeur à une seule interface est
       triviale. Ici, le routeur <link linkend="rachel">rachel</link>, qui utilise Quagga :</para>
     <programlisting>
       hostname rachel 
       router ospf
	   ospf router-id 192.134.7.241<co id="explicitrid"/>
	   network 192.134.7.0/24 area 0<co id="networkmatch"/>
	 </programlisting>
 <calloutlist>
 <callout arearefs="explicitrid"><para>Il n'est pas
       nécessaire de spécifier un <foreignphrase>router
       ID</foreignphrase>. Le routeur en choisit un
       automatiquement parmi les adresses IP de la machine. Mais le
       choisir explicitement comme étant l'adresse "principale" de la
       machine aidera au déboguage, par exemple lors d'un <command>show
       ip ospf neighbor</command>.</para>
	 </callout>
	 <callout arearefs="networkmatch">
 <para>On note que le préfixe est plus général (plus court) que la
	     vraie adresse. Cela n'est pas un problème, Quagga (ou IOS)
	     n'annoncent que les routes réellement existantes. Voir
	     aussi <xref linkend="anneau"/>.</para>
	 </callout>
       </calloutlist>
 <para>Et c'est tout ! rachel est désormais routeur OSPF et annonce son
       unique réseau. Les voisins sont trouvés automatiquement.</para>
<warning><para>Certains systèmes (IOS) tendent à faire de l'OSPF sur
       toutes les interfaces. Il peut donc être prudent d'ajouter
       <command>passive-interface <replaceable>Serial
       0</replaceable></command> (dans la section <command>router
       ospf</command>) pour chaque interface où vous ne
       voulez <emphasis>pas</emphasis> faire d'OSPF.</para>
      </warning>
 <para>Le routeur laperouse a une configuration quasi-identique. <link linkend="requin">requin</link>
       est plus intéressant car il est connecté à deux réseaux :</para>
     <programlisting>
 hostname requin
 router ospf
  ospf router-id 192.134.7.245
  network 10.4.200.0/24 area 0
  network 192.134.7.0/24 area 0
 </programlisting>
 <para>requin et rachel sont voisins, ainsi que requin et
       laperouse. Les routes sont échangées. On peut le voir avec la
       console OSPF de Quagga:</para>
 <programlisting>
<prompt>rachel></prompt> <command>show ip ospf neighbor</command>

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqstL DBsmL
 192.134.7.245     1   Full/DR<co id="dr"/> 00:00:34    192.134.7.245   epic0:192.134.7.241     0     0     0
       </programlisting>
 <calloutlist>
 <callout arearefs="dr">
 <para>192.134.7.245, c'est-à-dire requin est routeur élu (DR) et il est adjacent (<foreignphrase>full</foreignphrase>)</para>
	 </callout>
       </calloutlist>
 <para>Les routes reçues sur
	 rachel sont :</para>
     <programlisting>
<prompt>rachel&gt;</prompt> <command>show ip ospf route</command>
 ============ OSPF network routing table ============
 N    10.4.200.0/25         [20] area: 0.0.0.0
			    via 192.134.7.245, epic0
 N    192.134.7.240/28      [10] area: 0.0.0.0
			    directly attached to epic0
 </programlisting>
 <para>Sur requin, on voit deux voisins, un sur chaque
       interface. requin est routeur élu sur le réseau de son interface eth0
       mais seulement routeur de secours sur le réseau de eth1
       (laperouse est le routeur élu).</para>
     <programlisting>
<prompt>requin&gt;</prompt> <command>show ip ospf neighbor</command>

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqstL DBsmL
 192.134.7.241     1   Full/Backup    00:00:36    192.134.7.241   eth0:192.134.7.245     0     0     0
 10.4.100.2        1   Full/DR         00:00:40    10.4.200.2      eth1:10.4.200.1     0     0     0
 </programlisting>
   </section>

 <section id="unezone-uneexterne"><title>Une zone, et une route externe</title>
 <para>Maintenant, ajoutons un lien vers l'extérieur en supposant que
	 requin est connecté à l'Internet. Nous ne faisons pas d'OSPF
	 avec notre fournisseur d'accès, la route par défaut vers
	 celui-ci va être marquée comme externe à l'<link linkend="as">AS</link>.</para>
 <figure float="0">
       <title>Réseau avec une route externe</title>
       <mediaobject>
	 <imageobject>
	   <imagedata fileref="reseau-defaut.pdf" format="EPS"/>
	 </imageobject>
	 <imageobject>
	   <imagedata fileref="reseau-defaut.png" format="PNG"/>
	 </imageobject>
	 <textobject>
	   <phrase>Schéma du réseau avec les trois routeurs et la
	   liaison Internet</phrase>
	 </textobject>
	 <caption>
	   <para>Dans chaque routeur, son <foreignphrase>router
	   ID</foreignphrase>. ppp0 est une interface PPP vers le
	   fournisseur d'accès.
	   </para>
	 </caption>
       </mediaobject>
      </figure>
 <para>La configuration de requin devient :</para>
       <programlisting>
 router ospf
  ospf router-id 192.134.7.245
  redistribute static
  network 10.4.200.0/24 area 0
  network 192.134.7.0/24 area 0
  default-information originate
 </programlisting>
 <para>Deux nouvelles commandes ont été
	 utilisées. <command>default-information originate</command>
	 indique à OSPF d'accepter de diffuser une route par défaut (ce
	 qu'OSPF ne fait pas normalement) et <command>redistribute
	 static</command> indique de redistribuer dans OSPF toutes les
	 routes statiques (ici, il n'y en a qu'une).</para>
 <para>Sur le routeur laperouse (qui n'a pas changé de configuration),
	 on peut voir désormais la route par défaut :</para>
       <programlisting>
 laperouse> show ip ospf route 
 ============ OSPF network routing table ============
 N    10.4.200.0/25         [1] area: (0.0.0.0)
			    directly attached to eth0
 N    192.134.7.240/28      [11] area: (0.0.0.0)
			    via 10.4.200.1, eth0

 ============ OSPF router routing table =============
 R    192.134.7.245         [1] area: (0.0.0.0), ASBR
			    via 10.4.200.1, eth0

 ============ OSPF external routing table ===========
 N E2 0.0.0.0/0             [11/10] tag: 0
			    via 10.4.200.1, eth0
 </programlisting>
 <para>requin (192.134.7.245) y est marqué comme ASBR
	 (<foreignphrase>Autonomous System Boundary
	 Router</foreignphrase>) car il est situé aux limites de l'AS
	 puisqu'il injecte une route externe, qui apparait comme de
	 type E2 (externes 2, il existe aussi des externes
	 1<footnote><para>La différence entre les deux est subtiles :
	 les externes 2 ont toujours un coût supérieur à n'importe
	 quelle route interne et les externes 1 ont un coût qui est
	 comparable aux routes internes. Les externes de type 1
	 supposent donc qu'on aie assez d'informations sur les routes
	 externes, ce qui est rare.</para><para>C'est
	 l'administrateur système qui configure ce type, avec
	 <command>redistribute <replaceable>something</replaceable> metric-type <replaceable>2</replaceable></command>.</para>
	</footnote>).</para>
 <para>Entre crochets, vous voyez le coût de chaque route. OSPF permet
	 d'affecter un coût à chaque interface, pour décourager
	 l'utilisation de liens lents, qui ne sont bons qu'à servir de
	 secours. Notre routeur a mis un coût de 10 par défaut et les
	 liens directement connectés ont un coût de 1. C'est pourquoi
	 192.134.7.240/28 a un coût cumulé de 10+1 = 11.</para>
   </section>

 <section><title>Une zone et IPv6</title>
 <para>En dotant les machines présentées en <xref
	   linkend="unezone"/> d'adresses IPv6, nous pouvons
       faire tourner la version 3 du protocole OSPF.</para>
 <figure float="0">
       <title>Réseau simple en IPv6</title>
       <mediaobject>
	 <imageobject>
	   <imagedata fileref="reseau-simplev6.pdf" format="EPS"/>
	 </imageobject>
	 <imageobject>
	   <imagedata fileref="reseau-simplev6.png" format="PNG"/>
	 </imageobject>
	 <textobject>
	   <phrase>Schéma du réseau avec les trois routeurs</phrase>
	 </textobject>
	 <caption>
	   <para>Dans chaque routeur, son <foreignphrase>router
	   ID</foreignphrase> qui a la forme d'une adresse IPv4. Les liens sont tous des Ethernet.
	   </para>
	 </caption>
       </mediaobject>
      </figure>
 <para>Sur Quagga, la configuration est plus simple : on peut utiliser
	 les interfaces et pas seulement les réseaux :</para>
 <programlisting>
 router ospf6
  router-id 192.134.7.245<co id="ridv6"/>
  interface eth0 area 0.0.0.0
  interface eth1 area 0.0.0.0
       </programlisting>
 <calloutlist>
 <callout arearefs="ridv6">
 <para>Le <foreignphrase>router
  ID</foreignphrase> est sur 32 bits, et affiché comme une adresse IPv4.</para>
	 </callout>
       </calloutlist>
 <para>On a des adjacences en IPv6 :
 <programlisting>
	 <prompt>requin# </prompt><command>show ipv6 ospf6 neighbor</command>
 RouterID         State/Duration    DR              BDR             I/F[State]
 192.134.7.241<co id="rid-ipv6"/>     Full/00:01:42    192.134.7.245   192.134.7.241   eth0[DR]
 10.4.200.2        Full/00:00:01    0.0.0.0         0.0.0.0         eth1[DR]
       </programlisting>
	<calloutlist>
	  <callout arearefs="rid-ipv6">
	    <para>Il s'agit bien d'un &rid; et pas d'une adresse
	    IP. Les &rid; ont la forme d'une adresse IPv4 (ils sont
	    stockés sur 32 bits) mais ne sont pas des adresses.</para>
	<para>De la
	    même façon, les routeurs élus sont identifiés par leur &rid;.</para>
	  </callout>
	</calloutlist>
 et des routes, vers des adresses <foreignphrase>link-local</foreignphrase> :
 <programlisting>
 <prompt>rachel#</prompt> <command>show ipv6 ospf6 route</command>

       Destination                    Gateway                      I/F
 ---------------------------
 *N Ia 2001:660:3003:3::/64           ::                         epic0 00:02:01
 *N Ia fec0:baba::/64                 fe80::206:5bff:fef1:529a   epic0 00:02:01
 ...
	 </programlisting>
 et ces routes se retrouvent dans la table de routage, avec une
	 destination qui est une adresse <foreignphrase>link
	 local</foreignphrase>. traceroute permet de voir leur
	 utilisation :
 <programlisting>
 <prompt>% </prompt><command>traceroute6 -n fec0:baba::1 </command>
 traceroute6 to fec0:baba::1 (fec0:baba::1) from 2001:660:3003:3:2e0:29ff:fe21:130, 30 hops max, 12 byte packets
  1  2001:660:3003:3:206:5bff:fef1:529a  0.372 ms  0.381 ms  0.345 ms
  2  fec0:baba::1  1.517 ms  0.813 ms  0.779 ms
	 </programlisting>
</para>
     </section>

 <section id="unezone-ptp"><title>Une zone, et un lien série</title>
 <para>Maintenant, ajoutons un lien série (point à point) entre rachel
	 et laperouse en utilisant le protocole PPP. Bien que ce lien
	 soit très lent (115 kb/s au lieu des 100 Mbs d'Ethernet), il a
       l'avantage de fournir un secours si requin tombe en panne. Cette
       fois, enfin, OSPF va réellement servir à quelque chose.</para>
 <figure float="0">
       <title>Réseau avec une ligne spécialisée</title>
       <mediaobject>
	 <imageobject>
	   <imagedata fileref="reseau-ls.pdf" format="EPS"/>
	 </imageobject>
	 <imageobject>
	   <imagedata fileref="reseau-ls.png" format="PNG"/>
	 </imageobject>
	 <textobject>
	   <phrase>Schéma du réseau avec les trois routeurs et la
	   ligne série</phrase>
	 </textobject>
	 <caption>
	   <para>Dans chaque routeur, son <foreignphrase>router
	   ID</foreignphrase>. La "ligne spécialisée" est un câble
	   zéro-modem exploité en PPP.
	   </para>
	 </caption>
       </mediaobject>
      </figure>
 <para>La configuration de requin ne change pas. Celle de rachel devient :</para>
       <programlisting>
 interface ppp0
  ! Ligne lente, son usage est découragé
  ip ospf cost 10000
 router ospf
  ospf router-id 192.134.7.241
  network 172.22.131.65/32 area 0
  network 192.134.7.0/24 area 0
       </programlisting>
 <para>Vous avez noté ? Zebra exige que vous mettiez l'adresse de la
	 machine <emphasis>distante</emphasis> dans une directive
	 <command>network</command> avec un masque de
	 /32. <link linkend="ios">IOS</link> fait
	 cela beaucoup mieux. Un <command>network 172.22.131.0/24 area
	 0</command><footnote><para><link linkend="quagga">Quagga</link> a
	 été corrigée en ce sens et se configure comme IOS.</para>
	 </footnote>aurait suffi<footnote><para>Les érudits noteront
	 que ce comportement bizarre de Zebra est la transcription
	 (trop) directe de la section 12.4.1 "Router-LSAs" du <link linkend="RFC2328">RFC
	 2328</link> qui spécifie qu'un routeur OSPF annonce, en
	 point-à-point, l'adresse de son voisin. Le <link
	 linkend="moy">livre de Moy</link> contient une discussion de
	 ce problème (<foreignphrase>Chapter 8, "Why is the representation of 
 point-to-point links in OSPF so strange ?"</foreignphrase>).</para>
	 </footnote>.</para>
 <para>Le voisin apparait sur le lien PPP. On notera que c'est son
	 <foreignphrase>router ID</foreignphrase> qui est affiché, pas
	 son adresse IP sur le lien PPP :</para>
 <programlisting>
 <prompt>laperouse></prompt> <command>show ip ospf neighbor </command>

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqstL DBsmL
 192.134.7.245     1   Full/Backup     00:00:37    10.4.200.1      eth0:10.4.200.2     0     0     0
 192.134.7.241     1   Full/DROther<co id="state-on-ptp"/>  00:00:32    172.22.131.64   ppp0:172.22.131.65     0     0     0
       </programlisting>
 <calloutlist>
 <callout arearefs="state-on-ptp">
 <para>Sur un réseau
	     point-à-point, les voisins sont toujours adjacents
	     (<foreignphrase>full</foreignphrase>). Le statut (ici
	     DROther) n'a donc pas d'importance : IOS ne l'affiche
	     d'ailleurs pas.</para>
	 </callout>
       </calloutlist>
 <para>La table de routage de laperouse, si on débranche requin, montre
       un passage par le lien PPP :</para>
 <programlisting>
 <prompt>laperouse:~ % </prompt> <command>route -n</command>
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 ...
 192.134.7.240   172.22.131.64   255.255.255.240 UG    10010  0        0 ppp0
 10.4.200.0      0.0.0.0         255.255.255.128 U     0      0        0 eth0
 0.0.0.0         172.22.131.64   0.0.0.0         UG    10010  0        0 ppp0
       </programlisting>
 <para>Si on rebranche requin, la route vers 192.134.7.240 passe à
	 nouveau par l'Ethernet, dont le coût OSPF est plus faible :</para>
 <programlisting>
 <prompt>laperouse:~ % </prompt> <command>route -n</command>
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 ...
 192.134.7.240   10.4.200.1      255.255.255.240 UG    110    0        0 eth0
 10.4.200.0      0.0.0.0         255.255.255.128 U     0      0        0 eth0
 0.0.0.0         10.4.200.1      0.0.0.0         UG    110    0        0 eth0
	 </programlisting>
   </section>

 <section id="anneau"><title>Une zone, et un anneau</title>
 <para>Tous les réseaux n'ont pas forcément ces complications. Dans
	 l'exemple suivant, nous connectons les quatre sites d'un
	 campus (A, B, C et D) en anneau. Cela permettra à la connectivité de survivre
	 à la coupure de n'importe lequel des quatre liens.</para>
 <figure float="0">
       <title>Réseau en anneau</title>
       <mediaobject>
	 <imageobject>
	   <imagedata fileref="reseau-quatre.pdf" format="EPS"/>
	 </imageobject>
	 <imageobject>
	   <imagedata fileref="reseau-quatre.png" format="PNG"/>
	 </imageobject>
	 <textobject>
	   <phrase>Schéma du réseau avec les quatre sites (un routeur chacun)</phrase>
	 </textobject>
	 <caption>
	   <para>Dans chaque routeur, son <foreignphrase>router
	   ID</foreignphrase>. Les liens entre sites sont des Ethernet.
	   </para>
	 </caption>
       </mediaobject>
      </figure>
 <para>Comme nous prenons toutes les adresses dans le même préfixe,
	 (192.168.0.0/16) et qu'il n'y a qu'une seule zone, les routeurs
	 ont quasiment tous la même configuration.</para>
 <programlisting>
 hostname rta
 router ospf
    network 192.168.0.0/16 area 0
       </programlisting>
   </section>
   </section>

 <section id="debug"><title>Déboguage</title>

 <para>Si les choses ne marchent pas comme attendu, il faut procéder
       avec méthode. Si vous envisagez de demander sur une liste de
       diffusion
       <footnote>
 <para>Une très bonne idée : je suis toujours stupéfait que tant de
	   responsables réseau passent des semaines à chercher seuls
	   alors que la compétence de dizaines d'autres ingénieurs
	   expérimentés est à leur disposition
	   gratuitement.</para><para>Demander de l'aide à des égaux (pas à un enseignant ou à un
	   consultant payé pour cela) sur une liste publique ou même semi-publique est
	   une compétence nécessaire et qui ne s'apprend pas dans les
	   écoles, malheureusement.</para>
       </footnote>, il va falloir pouvoir donner toute l'information
	   issue de ce processus de déboguage. </para>
 <section>
 <title>Tester la connectivité de base</title>
 <para>D'abord, il va falloir tester la connectivité de base de vos
	 routeurs. Si deux routeurs du même réseau ne peuvent pas se
	 pinguer, OSPF ne marchera certainement pas<footnote><para>Il y
	   a une exception : en présence de filtres (comme les ACL
	     d'IOS ou bien le Netfilter de Linux), certains protocoles
	     marchent et d'autres pas. Compte tenu de la complexité
	     supplémentaire que cela entraîne, je recommande de faire
	     vos premiers essais OSPF sur une machine sans
	     filtres.</para>
	 </footnote></para>
 <para>Si ping échoue (naturellement, vous testez ping avec une adresse
	     IP comme argument, pas un nom, pour ne pas dépendre du
	     DNS), entamez la procédure de déboguage classique en cas
	     de routage statique.</para>
 <para>Une fois que ping entre routeurs voisins fonctionne, vous pouvez
	     regarder la table de routage. traceroute vous montrera le
	     chemin pris par les paquets<footnote><para>Rappelez-vous
		 toujours que traceroute ne montre que le chemin
		 aller. Si vous avez plusieurs routes possibles, rien
		 ne garantit que le chemin retour soit identique.</para>
	     </footnote>. Les commandes <command>route -n</command> sur
	     Linux, <command>route -n show</command> sur NetBSD ou
	     encore <command>show ip route</command> sur IOS vous
	     montreront la table de routage (FIB,
	     <foreignphrase>Forwarding Information
	       Base</foreignphrase>) utilisée par le routeur.</para>
     </section>
 <section><title>Tester les problèmes spécifiquement OSPF</title>
 <para>La première chose à tester est la formation des
	 adjacences. <command>show ip ospf neighbor</command> sur
	 Quagga et IOS vous montrera les voisins et leur état. Ils
	 doivent tous être dans l'état FULL (adjacent) ou bien 2WAY
	 (simples voisins, vous verrez cet état si vous avez au moins
	 trois routeurs sur un réseau à diffusion). Voici un exemple
	 :</para>
 <programlisting>
 <prompt>rachel> </prompt><command>show ip ospf neighbor </command>

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqstL DBsmL
 192.134.7.245     1   Full/Backup     00:00:34    192.134.7.245   epic0:192.134.7.241     0     0     0
 10.200.3.1        1   2-Way/DROther   00:00:33    192.134.7.246   epic0:192.134.7.241     0     0     0
 192.134.7.248     1   Full/DR         00:00:34    192.134.7.248   epic0:192.134.7.241     0     0     0
       </programlisting>
 <para>Vous noterez que Neighbor montre le <foreignphrase>router
	   ID</foreignphrase> et pas l'adresse IP. </para>
 <para>Voici maintenant un cas où un routeur ne peut devenir adjacent
	   :</para>
 <programlisting>
 ludwigV> show ip ospf neighbor 

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqstL DBsmL
       </programlisting>
 <para>Rien n'apparait alors qu'une autre machine est sur le réseau et
	 qu'elle est pinguable. L'examen du journal de
	 Quagga<footnote><para>L'endroit exact où se trouve ce journal
	 dépend de votre configuration. C'est souvent
	 <filename>/var/log/zebra/ospfd.log</filename>. Je rappelle que
	 <command>tail -f</command> est la façon la plus pratique de
	 lire un fichier journal.</para>
	 </footnote>
  nous donne
	 la cause : 
	 <computeroutput>OSPF: Packet 172.19.1.6 [Hello:RECV]:
	 HelloInterval mismatch</computeroutput>. Un réglage
	 (l'intervalle entre deux messages de bienvenue - Hello - sur
	 le câble) est incohérent entre les deux machines.</para>
 <para>D'une manière générale, il faut s'assurer que les réglages
	 sont les mêmes sur tous les routeurs du réseau. C'est
	 d'autant moins facile que tous les modèles n'ont pas forcément
	 les mêmes valeurs par défaut<footnote><para>Vous pouvez voir
	 les valeurs actuelles avec <command>show ip ospf interface
	 <replaceable>nom-interface</replaceable></command> sur Quagga
	 et IOS.</para>
	 </footnote>. Veillez donc à :
	 <itemizedlist>
	   <listitem>
 <para>MTU (<foreignphrase>Maximum Transfer Unit</foreignphrase>,
	       affichée par <command>ifconfig</command> sur
	       Unix).<footnote><para>Cette question est discutée en
	       détail (surtout pour IOS) <ulink url="http://www.cisco.com/en/US/tech/tk648/tk365/technologies_tech_note09186a0080093f0d.shtml">chez Cisco</ulink>.</para>
	       </footnote></para>
	   </listitem>
	   <listitem>
	     <para>Intervalles pour Hello et Dead.</para>
	   </listitem>
	 </itemizedlist></para>
 <para>Outre les mécanismes de déboguage des routeurs (journal de
	 Quagga, commandes <command>debug ?</command> d'IOS), les
	 traditionnels outils de déboguage réseau comme tcpdump et
	 ethereal sont souvent très précieux. tcpdump est disponible
	 partout et permet de voir facilement si des paquets OSPF
	 circulent :
 <programlisting>
 <prompt>% </prompt> <command>sudo tcpdump -i <replaceable>eth1</replaceable> -n proto ospf</command>
 tcpdump: listening on eth1
 22:03:52.898542 172.19.1.6 > 224.0.0.5: OSPFv2-hello 48: backbone dr 172.19.1.6 bdr 172.19.1.8 [ttl 1]
 22:03:57.218574 172.19.1.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.19.1.6 backbone dr 172.19.1.1 [ttl 1]
 22:03:58.205449 172.19.1.8 > 224.0.0.5: OSPFv2-hello 52: backbone dr 172.19.1.6 bdr 172.19.1.8 [ttl 1]
 22:04:02.898652 172.19.1.6 > 224.0.0.5: OSPFv2-hello 48: backbone dr 172.19.1.6 bdr 172.19.1.8 [ttl 1]
 22:04:03.906988 172.19.1.7 > 224.0.0.5: OSPFv2-hello 48: backbone dr 172.19.1.7 [ttl 1]
 22:04:03.910303 172.19.1.6 > 224.0.0.6: OSPFv2-ls_upd 60: backbone [ttl 1]
 22:04:03.910479 172.19.1.6 > 224.0.0.6: OSPFv2-ls_upd 112: backbone [ttl 1]
 22:04:03.919802 172.19.1.7 > 224.0.0.5: OSPFv2-ls_upd 64: backbone [ttl 1]
 22:04:03.920019 172.19.1.8 > 224.0.0.5: OSPFv2-ls_ack 64: backbone [ttl 1]
	 </programlisting>
 Ici, on a vu 172.19.1.1, 172.19.1.6 et 172.19.1.8 qui envoyaient
	 régulièrement des messages Hello pour maintenir les
	 adjacences. 172.19.1.7 vient de démarrer et, après les
	 échanges d'Hello, met à jour sa base de données (ls_upd :
	 <foreignphrase>Link State Update</foreignphrase>). Les
	 routeurs OSPF, sur un réseau à diffusion, écrivent sur des
	 adresses <foreignphrase>multicast</foreignphrase>, comme 224.0.0.5.</para>
 <para>ethereal (logiciel graphique très agréable) ou tethereal (en
	 mode texte) permettent quant à eux une analyse en profondeur du contenu
	 des paquets OSPF. Voici un exemple d'utilisation de tethereal
	 pour afficher pendant trente secondes les paquets OSPF sur
	 eth 1 :
<programlisting>
<prompt>% </prompt><command>sudo tethereal -n -i eth1 -a duration:30 -V -f 'proto ospf'</command>
Internet Protocol, Src Addr: 194.68.129.103 (194.68.129.103), Dst Addr: 224.0.0.5 (224.0.0.5)
    Version: 4
...
Open Shortest Path First
    OSPF Header
        OSPF Version: 2
        Message Type: Hello Packet (1)
        Packet Length: 48
        Source OSPF Router: 193.51.206.210 (193.51.206.210)
        Area ID: 0.0.0.0 (Backbone)
        Packet Checksum: 0x55cb (correct)
        Auth Type: Null
        Auth Data (none)
    OSPF Hello Packet
        Network Mask: 255.255.255.0
        Hello Interval: 10 seconds
        Options: 0x2 (E)
        Router Priority: 1
        Router Dead Interval: 40 seconds
        Designated Router: 194.68.129.103
        Backup Designated Router: 194.68.129.102
        Active Neighbor: 193.51.206.61
	</programlisting>
</para>
 <para>Supposons qu'un routeur n'arrive pas à devenir adjacent. tcpdump
	 nous montre qu'il n'envoie pas de paquets mais il est
	 joignable par ping. Testons un <command>show ip ospf interface
	 eth0</command> : 
	 <computeroutput>eth0 is up, line protocol is up  OSPF not enabled on this interface
 </computeroutput>. Cela veut dire que l'interface a été coupée
	 explicitement (<command>passive-interface eth0</command>) ou
	 bien qu'aucune directive <command>network</command> ne couvre
	 les adresses IP de cette interface.</para>
 <para>Sur Quagga, on active le déboguage avec les commandes
	 <command>debug ospf
	 <replaceable>catégorie</replaceable></command>. Par exemple,
	 <command>debug ospf nsm</command> affichera dans le journal
	 les changements d'état des voisins (NSM,
	 <foreignphrase>Neighbor State
	 Machine</foreignphrase>). <command>debug ospf packet
	 <replaceable>type</replaceable></command> est sans doute la
	 commande de déboguage la plus utile. Par exemple,
	 <command>debug ospf packet ls-update</command> vous affichera
	 les changements d'état du réseau (LS <foreignphrase>Link State</foreignphrase>).</para>
 <para>Sur IOS, <command>debug ip ospf packet</command> vous donnera
	 une bonne idée du trafic OSPF<footnote><para>N'oubliez pas un
	 <command>terminal monitor</command> pour voir les messages
	 d'erreur, à moins que votre Cisco n'envoie ces informations
	 par syslog.</para>
	 </footnote>. <command>debug ip ospf adj</command> vous montre
	 les arrivées et départs des voisins comme :
	 <programlisting>OSPF: Neighbor 192.134.7.241 is dead
 OSPF: neighbor 192.134.7.241 is dead, state DOWN
 OSPF: Neighbor change Event on interface Ethernet0
 OSPF: DR/BDR election on Ethernet0 
 OSPF: Elect BDR 192.134.7.245
 OSPF: Elect DR 192.134.7.248
	DR: 192.134.7.248 (Id)   BDR: 192.134.7.245 (Id)
 ...
 OSPF: 2 Way Communication to neighbor 192.134.7.241
 </programlisting></para>
 <para>Pour tout savoir sur votre réseau, il faut que vous puissiez
	 lire la base de données d'OSPF, ce qui se fait avec la commande <command>show ip
       ospf database</command>. Cela n'est pas trivial et nécessite une
	 bonne compétence OSPF. </para>
 <para>Un peu de vocabulaire OSPF : les routeurs OSPF émettent des LSA
	 (<foreignphrase>Link State Advertisment</foreignphrase>) qui
	 sont des enregistrements donnant des informations sur un
	 routeur et ses liens (LSA de type routeur) ou sur un réseau
	 (LSA de type réseau) ou encore sur un préfixe externe à OSPF
	 (LSA de type externe).</para>
 <para> Nous allons commencer par l'exemple
	 décrit en <xref linkend="unezone-uneexterne"/>. La
	 base<footnote><para>Une des conséquences du choix d'utiliser
	 un protocole de type <foreignphrase>Link State</foreignphrase>
	 pour OSPF est que la base est identique sur tous les routeurs
	 de la zone.</para>
	   </footnote>
	 contient :</para>
 <programlisting>
 <prompt>laperouse></prompt> <command>show ip ospf database</command> <co id="command"/>

	 OSPF Router with ID (10.4.100.2)<co id="rid"/>

		 Router Link States (Area (0.0.0.0))

 Link ID         ADV Router      Age  Seq#       CkSum  Link count
 10.4.100.2<co id="lid"/>      10.4.100.2       458 0x8000010a 0xc586 1
 192.134.7.241   192.134.7.241    258 0x800000f3 0x79d5 1
 192.134.7.245   192.134.7.245    263 0x80000108 0x68fa 2<co id="linkrequin"/>
 192.134.7.248   192.134.7.248    264 0x800000da 0x9db5 1

		 Net Link States (Area (0.0.0.0))

 Link ID         ADV Router      Age  Seq#       CkSum
 10.4.200.1<co id="lid-net"/>      192.134.7.245<co id="dr-adv"/>   1096 0x8000000b 0x4baf
 192.134.7.248   192.134.7.248    264 0x80000045 0x519a

		 AS External Link States<co id="external"/>

 Link ID         ADV Router      Age  Seq#       CkSum  Route
 0.0.0.0         192.134.7.245   1470 0x800000bf 0xbdba E2 0.0.0.0/0 [0x0]


       </programlisting>
       <calloutlist>
	 <callout arearefs="command">
	   <para>Cette commande affiche un résumé de la base de données
	   (LS, <foreignphrase>Link State Database</foreignphrase>) OSPF. </para>
	 </callout>
	 <callout arearefs="rid"><para>C'est le <foreignphrase>router
	 ID</foreignphrase> de laperouse mais la base est la même sur
	 tous les routeurs de la zone.</para>
	 </callout>
	 <callout arearefs="lid">
	   <para>Le <foreignphrase>Link ID</foreignphrase> est ici le
	   <foreignphrase>Router ID</foreignphrase> puisque les LSA
	   sont de type routeur.</para>
	 </callout>
	 <callout arearefs="linkrequin">
 <para>C'est le nombre de liens du routeur, ici requin qui a deux
	     interfaces Ethernet.</para>
	 </callout>
	 <callout arearefs="lid-net">
	   <para>Pour un LSA de type réseau, le <foreignphrase>Link
	   ID</foreignphrase> reflète le préfixe du réseau,
	   contrairement aux LSA de type routeur, où il reflète le <foreignphrase>Router
	   ID</foreignphrase> du routeur.</para>
	 </callout>
	 <callout arearefs="dr-adv">
	   <para>Les LSA de type réseau ne sont envoyés que pour des
	   réseaux multipoint (comme Ethernet) et le LSA n'est envoyé
	   que par le routeur élu (DR, <foreignphrase>Designated
	   Router</foreignphrase>).</para>
	 </callout>
	 <callout arearefs="external">
	   <para>Ces LSA sont ceux qui viennent du monde extérieur à OSPF.</para>
	 </callout>
       </calloutlist>
 <para>Avec le lien point à point de l'exemple <xref
	   linkend="unezone-ptp"/>, la base a les mêmes LSA
	   mais le nombre de liens des routeurs de part et d'autre du lien
	   PPP augmente. La base détaillée des LSA de type routeur est
	   (tous les LSA n'ont pas été représentés, seulement ceux des
	   routeurs les plus intéressants) :</para>
 <programlisting>
 ospfd> show ip ospf database router
   LS age: 94
   Options: 2
   Flags: 0x0
   LS Type: router-LSA
   Link State ID: 192.134.7.241 
   Advertising Router: 192.134.7.241
   LS Seq Number: 800000f8
   Checksum: 0xc4d0
   Length: 60
    Number of Links: 3<co id="twolinks"/>

     Link connected to: a Transit Network<co id="notdr"/>
      (Link ID) Designated Router address: 192.134.7.248
      (Link Data) Router Interface address: 192.134.7.241
       Number of TOS metrics: 0
	TOS 0 Metric: 10

     Link connected to: another Router (point-to-point)
      (Link ID) Neighboring Router ID: 10.4.100.2
      (Link Data) Router Interface address: 172.22.131.64
       Number of TOS metrics: 0
	TOS 0 Metric: 10

     Link connected to: Stub Network<co id="stubptp"/>
      (Link ID) Network/subnet number: 172.22.131.65
      (Link Data) Network Mask: 255.255.255.255
       Number of TOS metrics: 0
	TOS 0 Metric: 10

   LS age: 175
   Options: 2
   Flags: 0x2 : ASBR<co id="asbr"/>
   LS Type: router-LSA
   Link State ID: 192.134.7.245 
   Advertising Router: 192.134.7.245
   LS Seq Number: 8000010b
   Checksum: 0x62fd
   Length: 48
    Number of Links: 2

     Link connected to: a Transit Network
      (Link ID) Designated Router address: 192.134.7.248
      (Link Data) Router Interface address: 192.134.7.245
       Number of TOS metrics: 0
	TOS 0 Metric: 10

     Link connected to: a Transit Network
      (Link ID) Designated Router address: 10.4.200.1
      (Link Data) Router Interface address: 10.4.200.1
       Number of TOS metrics: 0
	TOS 0 Metric: 10

 </programlisting>
       <calloutlist>
 <callout arearefs="twolinks">
	   <para>En fait, il n'y a que deux "vrais" liens. Voir <xref linkend="stubptp"/>.</para>
	 </callout>
	 <callout arearefs="notdr">
	   <para>Il n'y a guère de détails sur ce réseau : ils seront
	   contenus dans un LSA de type réseau, créé par le routeur élu.</para>
	 </callout>
 <callout arearefs="stubptp">
	   <para>Quagga ajoute un lien vers un <foreignphrase>stub
	   network</foreignphrase>. Pour tous les détails subtils
	   derrière ce comportement, <xref linkend="RFC2328"/>,
	   "2.1.  Representation of routers and networks",
	   "12.4.1.1. Describing point-to-point interfaces".</para>
	 </callout>
	 <callout arearefs="asbr">
	   <para>requin est ASBR (<foreignphrase>Autonomous System
	   Boundary Router</foreignphrase>) car il injecte une route
	   externe (la route par défaut).</para>
	 </callout>
       </calloutlist>
 <para>La base détaillée des LSA de type réseau contient les deux Ethernet :</para>
 <programlisting>
   LS age: 1335
   Options: 2
   LS Type: network-LSA
   Link State ID: 10.4.200.1 (address of Designated Router)
   Advertising Router: 192.134.7.245
   LS Seq Number: 8000000d
   Checksum: 0x47b1
   Length: 32
   Network Mask: /25
	 Attached Router: 192.134.7.245
	 Attached Router: 10.4.100.2

   LS age: 937
   Options: 2
   LS Type: network-LSA
   Link State ID: 192.134.7.248 (address of Designated Router)
   Advertising Router: 192.134.7.248
   LS Seq Number: 80000048
   Checksum: 0x4b9d
   Length: 40
   Network Mask: /28
	 Attached Router: 192.134.7.241
	 Attached Router: 192.134.7.245
	 Attached Router: 192.134.7.248
       </programlisting>
 <para>On peut aussi recueillir des informations avec SNMP (<xref
	   linkend="snmp"/>). <xref linkend="RFC1850"/> décrit la MIB associée à
	   OSPF. Malheureusement, Quagga n'en met en oeuvre qu'une
	   petite partie. Ici, on interroge un routeur Cisco (14 est le
	   point de départ de la MIB OSPF, voir le RFC ci-dessus) :
 <programlisting>
 <prompt>%</prompt><command>snmpwalk -m <replaceable>/usr/share/mibs/OSPF-MIB.txt</replaceable> <replaceable>192.134.7.246</replaceable>	 <replaceable>password</replaceable> 14</command>
 ...
 ospf.ospfNbrTable.ospfNbrEntry.ospfNbrState.192.134.7.245.0 = full(8)
 ospf.ospfNbrTable.ospfNbrEntry.ospfNbrState.192.134.7.248.0 = full(8)
 </programlisting>
 ce qui permet de voir, entre outres, que le routeur a deux voisins, et
	 qu'il est est totalement adjacent.</para>

   </section>

 <section><title>Des exemples de déboguage</title>
 <para>Les exemples de cette section sont présentés sous une forme de
	 questions à une liste de diffusion,  avec les informations nécessaires
	 puis les réponses<footnote><para>Cela n'a rien à voir avec
	     OSPF mais je regrette l'abondance, sur les listes de
	     diffusion techniques, de messages mal écrits, avec
	     insuffisamment d'informations. J'essaie donc de montrer
	     le bon exemple.</para>
	 </footnote>Le titre de chaque sous-section fournirait
	 un bon sujet au message.</para>
      <important><para>Avant de poser une question, vous pouvez aussi utiliser un moteur de recherche comme <ulink url="http://www.google.com/">Google</ulink>, qui archive le Web et les News. Par exemple, un message d'erreur incompréhensible est une excellente clé de recherche (à mettre en guillemets pour être sûr que le moteur de la recherche l'utilise littéralement).</para>
      </important>
 <section><title>Pas d'adjacence établie sur un lien PPP</title>
 <section><title>Question</title>
 <para>Mes deux routeurs OSPF (un PC/NetBSD et un PC/Linux, tous les
	   deux avec Zebra), ne peuvent établir une adjacence au dessus
	   d'un lien PPP. </para>
 <para>Le lien fonctionne :
 <programlisting>
 <prompt>laperouse:~ %</prompt> <command>ifconfig ppp0</command>
 ppp0      Link encap:Point-to-Point Protocol  
	   inet addr:172.22.131.65  P-t-P:172.22.131.64  Mask:255.255.255.255
	   UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1006  Metric:1
	   RX packets:81 errors:3 dropped:0 overruns:0 frame:3
	   TX packets:82 errors:0 dropped:0 overruns:0 carrier:0
	   collisions:0 txqueuelen:10 
	   RX bytes:1623 (1.5 KiB)  TX bytes:1559 (1.5 KiB)

 <prompt>laperouse:~ %</prompt> <command>ping -c 3 172.22.131.64</command>
 PING 172.22.131.64 (172.22.131.64): 56 octets data
 64 octets from 172.22.131.64: icmp_seq=0 ttl=255 time=18.0 ms
 64 octets from 172.22.131.64: icmp_seq=1 ttl=255 time=10.2 ms
 64 octets from 172.22.131.64: icmp_seq=2 ttl=255 time=10.2 ms

 --- 172.22.131.64 ping statistics ---
 3 packets transmitted, 3 packets received, 0% packet loss
 round-trip min/avg/max = 10.2/12.8/18.0 ms
	   </programlisting>
 Mais OSPF ne marche pas, lui :
 <programlisting>
 <prompt>rachel></prompt> show ip ospf neighbor 

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqstL DBsmL
 ...
 10.4.100.2        1   ExStart/DROther 00:00:37    172.22.131.65   ppp0:172.22.131.64     0     0     0
	   </programlisting>
 Le voisin ne sort pas de cet état ExStart<footnote><para>Qui signifie
	   <foreignphrase>Exchange Start</foreignphrase>, début de
	   l'échange des LSA qui constituent la base de données d'OSPF.</para>
	    </footnote>. Que puis-je faire ? Au
	   dessus d'Ethernet, les deux machines établissent une
	   adjacence sans problèmes.
	   </para>
	 </section>
 <section><title>Réponse</title>
 <para>Que contiennent les journaux des deux Zebra ? (N'oubliez pas un
	     <command>debug ospf packet </command>.) Je note que votre MTU est de
	     1006. N'y aurait-il pas un problème à ce sujet ? OSPF
	     exige que les voisins soient d'accord sur la MTU du
	     lien.</para>
	 </section>
 <section><title>Solution</title>
 <para>En effet, le journal me dit <computeroutput>2003/02/12 14:54:07
	       OSPF: Packet[DD]: MTU is larger than
	       [ppp0:172.22.131.65]'s MTU</computeroutput>. J'ai mis la
	     MTU du lien PPP à 1500 et tout marche. Merci !
	   </para>
	 </section>
     </section>
 <section><title>Pas d'adjacence sur un lien Ethernet</title>
 <section><title>Question</title>
 <para>Sur un lien Ethernet, mes deux routeurs OSPF (un ImageStream et
	     un PC/Linux avec Quagga) ne se voient pas. Sur le PC,
	     <command>show ip ospf neighbor</command> ne montre pas du
	     tout l'autre routeur (même pas dans un état autre que
	     <foreignphrase>Full</foreignphrase>). <command>tcpdump -n
	       -i eth0 proto ospf</command> ne montre aucun
	     trafic. Pourtant, les deux machines peuvent se
	     pinguer.</para>
 <para>Est-ce un problème de filtrage ? Pourtant, j'autorise tout le
	     trafic UDP.</para>
	 </section>
 <section><title>Réponse</title>
 <para>OSPF n'utilise pas UDP. Il a son propre protocole, qui porte le
	     numéro 89. Vérifiez que ce protocole est autorisé.</para>
	 </section>
 <section><title>Solution</title>
 <para>C'était bien cela. <command>dmesg | grep 89</command> montre que
	     je rejetais les paquets OSPF : <computeroutput>IN=eth0
	       OUT= MAC=01:00:5e:00:00:05:00:05:5d:03:86:7e:08:00
	       SRC=172.19.1.8 DST=224.0.0.5 LEN=68 TOS=0x00 PREC=0x00
	       TTL=1 ID=51540 PROTO=89</computeroutput>. Maintenant,
	     tout marche, merci.</para>
	 </section>
       </section>
 <section><title>Incapable de configurer OSPF pour IPv6</title>
 <para>OSPF (Zebra 0.93b sur une UltraSparc avec Linux 2.4.19) marche très bien pour IPv4. Maintenant que nous commençons
	 le déploiement d'IPv6, je mets des directives
	 <command>network</command> avec des adresses IPv6 dans mon
	 <filename>ospfd.conf</filename> mais ospfd ne démarre plus :
 <programlisting>
 There is no such command.
 Error occured during reading below line.
   network 2000::/3 area 0
	 </programlisting>Il me faut une version plus récente de
	 Zebra ?</para>
     </section>
 <section><title>Réponse</title>
 <para>Zebra accepte OSPF pour IPv6 depuis longtemps. Mais OSPF pour
	 IPv6 est un protocole différent (quasi-identique mais tournant
	 sur IPv6 et incompatible avec le premier) décrit dans le <xref
	   linkend="RFC2740"/>. Pour Zebra, il faut éditer
	 <filename>ospf6d.conf</filename> et lancer le démon
	 ospf6d.</para>
 <para>En outre, la configuration est différente : vous n'indiquez pas
	   le réseau, mais l'interface.</para>
     </section>
 <section><title>Solution</title>
 <para>Merci beaucoup, tout marche désormais avec le
	 <filename>ospf6d.conf</filename> suivant :
 <programlisting>
 router ospf6
  router-id 192.134.7.248
  interface eth0 area 0.0.0.0
	 </programlisting>
       </para>
     </section>
   </section>
   </section>

	   <section id="hierarchical">
     <title>Avec plusieurs zones</title>
 <para>Voici un exemple d'un réseau utilisant le routage
       hiérarchique. Un tel découpage est utile :<itemizedlist>
	 <listitem><para>Si vous avez tellement de routeurs qu'il vient
	     difficile de les gérer dans une même zone (par exemple,
	     la sortie de <command>show ip ospf database</command>
	     devient trop longue). Certains routeurs très lents ont
	     également du mal dès que la zone (et donc les informations
	     à traiter) devient trop grande.</para> <para>On dit souvent qu'il est
	     recommandé de ne pas mettre plus de 50 ou 100 routeurs
	     (selon leurs performances) par zone.</para>
	 </listitem>
	 <listitem>
	   <para>S'il existe plusieurs services dans votre
	   organisation, que ces services disposent de compétence en
	   routage et souhaitent un minimum d'autonomie. OSPF permet,
	   dans une certaine mesure, d'isoler l'épine dorsale
	   (<foreignphrase>backbone</foreignphrase>) de ces zones. </para>
	     <important><para>La régle d'unicité administrative dans
	   l'AS continue à s'appliquer. Si les services en question
	   sont totalement autonomes et ne dépendent pas de
	   l'autorité centrale, il ne faudra pas utiliser un protocole de
	   routage intérieur comme OSPF. Vous devrez faire du routage
	   statique ou bien utiliser un protocole de routage extérieur comme BGP.</para>
	     </important>
 </listitem>
       </itemizedlist>
 </para>
 <para id="abr">Les routeurs qui connectent plusieurs zones sont nommés les ABR
       (<foreignphrase>Area Border Router</foreignphrase>).</para>
 <figure float="0">
 <title>Réseau à plusieurs zones</title>
       <mediaobject>
	 <imageobject>
	   <imagedata fileref="reseau-hierarchique.pdf" format="EPS"/>
	 </imageobject>
	 <imageobject>
	   <imagedata fileref="reseau-hierarchique.png" format="PNG"/>
	 </imageobject>
	 <textobject><para>Un réseau à plusieurs zones.</para>
	 </textobject>
	 <caption><para>requin est l'unique ABR (<foreignphrase>Area Border Router</foreignphrase>) OSPF. Les deux zones ont comme ID 0 (dorsale) et 10.200.2.0 (il est courant de donner aux identificateurs de zone la forme d'une adresse IPv4).</para>
	 </caption>
       </mediaobject>
     </figure>
 <para>Sur le commutateur HP-procurve, on voit :		    </para>   						      
 <programlisting>			       						      
 NIC HP ProCurve 5308XL# show ip ospf neighbor 				      

  OSPF Neighbor Information						      

   Router ID       Pri IP Address      NbIfState State    Rxmt QLen Events     
   --------------- --- --------------- --------- -------- --------- ---------- 
   192.134.7.243   1   10.200.1.2      DR        FULL     0         6          
   10.200.3.1      1   10.200.1.4      BDR       FULL     0         6          
   192.134.7.243   1   192.134.7.243   DR        FULL     0         6          



 NIC HP ProCurve 5308XL# show ip route   				      

				 IP Route Entries			      

   Destination     Network Mask    | Gateway         Type      Sub-Type   Metric
   --------------- --------------- + --------------- --------- ---------- ------
   0.0.0.0         0.0.0.0         | 192.134.7.254   static               1     
   10.200.1.0      255.255.255.0   | VLAN2           connected            0     
   10.200.2.128    255.255.255.128 | 192.134.7.243   ospf      InterArea  11    
   127.0.0.0       255.0.0.0       | reject          static               0     
   127.0.0.1       255.255.255.255 | lo0             connected            0     
   192.134.7.240   255.255.255.240 | EUREG-net       connected            0     


 NIC HP ProCurve 5308XL# show ip ospf interface 				      

  OSPF Interface Status							      

   IP Address      Status   Area ID         State   Auth-type Cost   Priority  
   --------------- -------- --------------- ------- --------- ------ --------- 
   10.200.1.1      enabled  backbone        DROTHER none      1      1         
   192.134.7.246   enabled  backbone        BDR     none      1      1         



     </programlisting>
 <para>Sur le Cisco, on voit :</para>
 <programlisting>									      
 cisco-eureg#show ip ospf neighbor 					      

 Neighbor ID     Pri   State           Dead Time   Address         Interface   
 192.134.7.246     1   FULL/DROTHER    00:00:35    10.200.1.1      Ethernet0   
 192.134.7.243     1   FULL/DR         00:00:31    10.200.1.2      Ethernet0   

 cisco-eureg#show ip route     						      
 Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP      
	D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 	      
	E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP	      
	i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, * - candidate default
	U - per-user static route					      

 Gateway of last resort is 10.200.1.1 to network 0.0.0.0			      

      10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks		      
 O IA    10.200.2.128/25 [110/20] via 10.200.1.2, 00:01:46, Ethernet0	      
 C       10.200.1.0/24 is directly connected, Ethernet0			      
      192.134.7.0/28 is subnetted, 1 subnets				      
 O       192.134.7.240 [110/11] via 10.200.1.1, 00:01:46, Ethernet0	      
 O*E2 0.0.0.0/0 [110/10] via 10.200.1.1, 00:01:46, Ethernet0		      
     </programlisting>
 <para>La base de données contient désormais un nouveau type de LSA :
       les LSA de type résumé, émis par les <link linkend="abr">ABR</link> dans les zones connectées.</para>									      
 <programlisting>
 cisco-eureg#show ip ospf database 					      

	OSPF Router with ID (10.200.3.1) (Process ID 1)			      


		 Router Link States (Area 0.0.0.0)			      

 Link ID         ADV Router      Age    Seq#       Checksum Link count	      
 10.200.3.1      10.200.3.1      1303   0x80000039 0xF3C2   1		      
 192.134.7.243   192.134.7.243   147    0x80000045 0xDB5B   2		      
 192.134.7.246   192.134.7.246   145    0x80000003 0xEB96   2		      

		 Net Link States (Area 0.0.0.0)				      

 Link ID         ADV Router      Age    Seq#       Checksum		      
 10.200.1.2      192.134.7.243   148    0x80000035 0x4269  		      
 192.134.7.243   192.134.7.243   148    0x80000001 0xA53   		      

		 Summary Net Link States (Area 0.0.0.0)			      

 Link ID         ADV Router      Age    Seq#       Checksum		      
 10.200.2.128    192.134.7.243   1307   0x80000039 0x778B  		      

		 AS External Link States					      

 Link ID         ADV Router      Age    Seq#       Checksum Tag		      
 0.0.0.0         192.134.7.246   155    0x80000001 0x3501   0		      
     </programlisting>
 <para>Sur la machine Unix requin :</para>									      
 <programlisting>

 requin> show ip ospf neighbor 						      

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqsL
 192.134.7.246     1   Full/Backup     00:00:35    192.134.7.246   eth0:192.134.7.243     0     0
 10.200.2.130      1   Full/Backup     00:00:31    10.200.2.130    eth1:10.200.2.129     0     00
 192.134.7.246     1   Full/DROther    00:00:35    10.200.1.1      eth0.2:10.200.1.2     0     00
 10.200.3.1        1   Full/Backup     00:00:32    10.200.1.4      eth0.2:10.200.1.2     0     00

 requin> show ip ospf route 
 ============ OSPF network routing table ============
 N    10.200.1.0/24         [10] area: 0.0.0.0
			    directly attached to eth0.2
 N    10.200.2.128/25       [10] area: 10.200.2.0
			    directly attached to eth1
 N    192.134.7.240/28      [10] area: 0.0.0.0
			    directly attached to eth0

 ============ OSPF router routing table =============
 R    192.134.7.246         [10] area: 0.0.0.0, ASBR
			    via 192.134.7.246, eth0
			    via 10.200.1.1, eth0.2

 ============ OSPF external routing table ===========
 N E2 0.0.0.0/0             [10/10] tag: 0
			    via 192.134.7.254, eth0

 requin> show ip ospf database 

	OSPF Router with ID (192.134.7.243)

		 Router Link States (Area 0.0.0.0)

 Link ID         ADV Router      Age  Seq#       CkSum  Link count
 10.200.3.1      10.200.3.1      1512 0x80000039 0xf3c2 1
 192.134.7.243   192.134.7.243    355 0x80000045 0xdb5b 2
 192.134.7.246   192.134.7.246    353 0x80000003 0xeb96 2

		 Net Link States (Area 0.0.0.0)

 Link ID         ADV Router      Age  Seq#       CkSum
 10.200.1.2      192.134.7.243    355 0x80000035 0x4269
 192.134.7.243   192.134.7.243    355 0x80000001 0x0a53

		 Summary Link States (Area 0.0.0.0)

 Link ID         ADV Router      Age  Seq#       CkSum  Route
 10.200.2.128    192.134.7.243   1513 0x80000039 0x778b 10.200.2.128/25

		 Router Link States (Area 10.200.2.0)

 Link ID         ADV Router      Age  Seq#       CkSum  Link count
 10.200.2.130    10.200.2.130     614 0x80000042 0xd7d4 1
 192.134.7.243   192.134.7.243    628 0x80000034 0xf0f3 1

		 Net Link States (Area 10.200.2.0)

 Link ID         ADV Router      Age  Seq#       CkSum
 10.200.2.129    192.134.7.243    628 0x80000030 0x86f1

		 Summary Link States (Area 10.200.2.0)

 Link ID         ADV Router      Age  Seq#       CkSum  Route
 10.200.1.0      192.134.7.243    352 0x80000032 0x9279 10.200.1.0/24
 192.134.7.240   192.134.7.243    351 0x80000001 0xc21e 192.134.7.240/28

		 ASBR-Summary Link States (Area 10.200.2.0)

 Link ID         ADV Router      Age  Seq#       CkSum
 192.134.7.246   192.134.7.243    351 0x80000001 0xd2f7

		 AS External Link States

 Link ID         ADV Router      Age  Seq#       CkSum  Route
 0.0.0.0         192.134.7.246    362 0x80000001 0x3501 E2 0.0.0.0/0 [0x0]

     </programlisting>
 <para>Sur l'autre machine Unix, laperouse :</para>
 <programlisting>

 ospfd# show ip ospf  neighbor 

 Neighbor ID     Pri   State           Dead Time   Address         Interface           RXmtL RqstL DBsmL
 192.134.7.243     1   Full/DR         00:00:36    10.200.2.129    eth0:10.200.2.130     0     0     0

 ospfd# show ip ospf  route 
 ============ OSPF network routing table ============
 N IA 10.200.1.0/24         [20] area: (10.200.2.0)
			    via 10.200.2.129, eth0
 N    10.200.2.128/25       [10] area: (10.200.2.0)
			    directly attached to eth0
 N IA 192.134.7.240/28      [20] area: (10.200.2.0)
			    via 10.200.2.129, eth0

 ============ OSPF router routing table =============
 R    192.134.7.243         [10] area: (10.200.2.0), ABR
			    via 10.200.2.129, eth0
 R    192.134.7.246      IA [20] area: (10.200.2.0), ASBR
			    via 10.200.2.129, eth0

 ============ OSPF external routing table ===========
 N E2 0.0.0.0/0             [20/10] tag: 0
			    via 10.200.2.129, eth0


 ospfd# show ip ospf  database 

	OSPF Router with ID (10.200.2.130)

		 Router Link States (Area (10.200.2.0))

 Link ID         ADV Router      Age  Seq#       CkSum  Link count
 10.200.2.130    10.200.2.130    1394 0x80000043 0xd5d5 1
 192.134.7.243   192.134.7.243   1410 0x80000035 0xeef4 1

		 Net Link States (Area (10.200.2.0))

 Link ID         ADV Router      Age  Seq#       CkSum
 10.200.2.129    192.134.7.243   1410 0x80000031 0x84f2

		 Summary Link States (Area (10.200.2.0))

 Link ID         ADV Router      Age  Seq#       CkSum  Route
 10.200.1.0      192.134.7.243   1183 0x80000033 0x907a 10.200.1.0/24
 192.134.7.240   192.134.7.243    272 0x80000002 0xc01f 192.134.7.240/28

		 ASBR-Summary Link States (Area (10.200.2.0))

 Link ID         ADV Router      Age  Seq#       CkSum
 192.134.7.246   192.134.7.243   1603 0x80000002 0xd0f8

		 AS External Link States

 Link ID         ADV Router      Age  Seq#       CkSum  Route
 0.0.0.0         192.134.7.246   1142 0x80000002 0x3302 E2 0.0.0.0/0 [0x0]

     </programlisting>
 <para>Les configurations sont :</para>
 <programlisting>

 hostname requin
 router ospf
  network 10.200.1.0/24 area 0
  network 10.200.2.0/24 area 10.200.2.0
  network 192.134.7.0/24 area 0
     </programlisting>
 <programlisting>

 hostname laperouse
 router ospf
  network 10.200.2.0/24 area 10.200.2.0
     </programlisting>
 <para>Commutateur/routeur HP</para>
 <programlisting>
 ip router-id 192.134.7.246             
 router ospf               
     area backbone
     redistribute static
     exit               
 vlan 1  
     ip ospf area backbone
     exit                 
 vlan 2  
     ip ospf area backbone
     exit                 

     </programlisting>
 <para>Routeur Cisco</para>
 <programlisting>
 router ospf 1
  network 10.200.0.0 0.0.255.255<co id="ios-mask"/> area 0.0.0.0
       </programlisting>          
    <calloutlist>
      <callout arearefs="ios-mask">
	<para>IOS fait écrire le masque, tantôt avec les bits réseau à
	un et les bits machine à zéro (la norme), tantôt l'inverse,
	comme ici.</para>
      </callout>
    </calloutlist>
   </section>
  <section>
    <title>Conclusion</title>
<para>Il teste beaucoup à voir : la sécurité, les
      <foreignphrase>virtual links</foreignphrase>, les zones
      terminales (<foreignphrase>stubs</foreignphrase>) et NSSA,
      l'agrégation des routes aux frontières des zones, la théorie
      derrière les protocoles à Etats des Liaisons, comme OSPF... Mais vous avez
      déjà de quoi pratiquer... À vos claviers !</para>
  </section>

   <appendix>
     <title>Configuration matérielle et logicielle</title>
 <para>Les machines utilisées dans les exemples sont :
       <itemizedlist>
	 <listitem id="requin">
	   <para>requin : un PC/Unix. Système Debian de test ("sid"), noyau Linux
	   2.4.20 et logiciel de routage Zebra 0.93.</para>
	 </listitem>
	 <listitem>
	   <para>laperouse : un PC/Unix. Système Debian 3.0 ("woody"), noyau Linux
	   2.2.19 et logiciel de routage Zebra 0.92.</para>
	 </listitem>
	 <listitem>
	   <para>cisco : un Cisco 25xx avec IOS 11.1</para>
	 </listitem>
	 <listitem>
	   <para>hp : un commutateur/routeur Hewlett-Packard ProCurve.</para>
	 </listitem>
	 <listitem id="rachel">
	   <para>rachel : un PC/Unix. Système NetBSD 1.6, logiciel de
	   routage Zebra 0.93.</para>
	 </listitem>
       </itemizedlist></para>
 </appendix>
<xi:include href="biblio-ospf-automatic.db"/>
<xi:include href="rfc-ospf-automatic.db"/>
</article>

