← Tous les articles

Le même routeur, trois vérités différentes

Un seul équipement physique, plusieurs identités de routage, et pourquoi un graphe de nœuds et d'arêtes ne peut pas les contenir

Michel Wijnberg

Les quatre premiers billets de cette série portaient sur la confiance : modéliser le réseau correctement, l’observer sans danger, reproduire l’acheminement honnêtement, et refuser de deviner. Celui-ci ouvre un second ensemble, sur ce qu’il faut réellement pour tenir cette ligne.

Et il commence par ce qui casse la plupart des outils de topologie bien avant qu’ils n’approchent une question intéressante : un routeur n’est pas une seule chose.


Un routeur avec deux de tout

Voici nrt1-cr1, tiré de mon laboratoire :

Le panneau d'équipement de nrt1-cr1, montrant des badges ABR·ASBR séparés pour OSPFv2 et OSPFv3
Le panneau d'équipement de nrt1-cr1, montrant des badges ABR·ASBR séparés pour OSPFv2 et OSPFv3

Regardez en haut à droite. Pas un badge de rôle. Deux :

OSPFv2   ABR·ASBR
OSPFv3   ABR·ASBR

Et en dessous, dans Protocols & Areas :

Instance de protocoleAreasRôle
OSPFv2 · processus 1 (ipv4)0.0.0.0, 14.18.20.0ABR · ASBR
OSPFv3 · processus 1 (ipv6)0.0.0.0, 14.18.20.0ABR · ASBR

Cela ressemble à une duplication. Ce n’en est pas une. Ce sont deux instances de protocole indépendantes avec deux bases à état de liens indépendantes, et nrt1-cr1 gagne le titre d’ABR séparément dans chacune, en étant rattaché à plus d’une area dans cette instance. Les libellés d’area coïncident parce que quelqu’un les a numérotés pour qu’ils coïncident, pas parce que ce sont les mêmes objets. En base ils ont des UUID différents, car l’area OSPFv2 14.18.20.0 et l’area OSPFv3 14.18.20.0 sont des areas différentes qui partagent un nom par hasard.

Cette distinction paraît pédante, jusqu’au moment précis où les deux divergent. Ce qui, il se trouve, arrive toujours.


Un câble, deux coûts, cent pour cent du temps

Voici un unique lien physique entre deux routeurs :

Le panneau de lien pour lax1-gw1 vers lax1-gw2, avec les onglets Physical, OSPFv2 et OSPFv3 et des coûts différents
Le panneau de lien pour lax1-gw1 vers lax1-gw2, avec les onglets Physical, OSPFv2 et OSPFv3 et des coûts différents

Un câble. Et0/3 vers Et0/3, 10G, portant 172.24.2.13/30 et fddb:10:24:2::6/127. Osprey le dessine comme une seule arête, parce que physiquement c’en est une, et lui donne un onglet par protocole.

Lisez maintenant les coûts :

OSPFv2   Area 12.1.24.0   cost 10
OSPFv3   Area 12.1.24.0   cost 1

Même câble. Même numéro d’area. Métrique différente.

Je n’ai pas arrangé cela pour la capture. J’ai ensuite vérifié tous les liens à double pile de l’AS 200, et le résultat est plus intéressant que l’exemple isolé :

Liens double pile dans l’AS 200124
…où les coûts OSPFv2 et OSPFv3 diffèrent124 (100 %)
à (v2 = 10, v3 = 1)85
à (v2 = 10000, v3 = 10)39

Tous diffèrent, mais regardez les deux groupes : 39 liens sont séparés d’un facteur 1000, et 85 d’un facteur 10. Cette asymétrie est la partie intéressante, et il a fallu demander au routeur pour l’expliquer.

Routing Process "ospf 1"     Reference bandwidth unit is 100000 mbps
Routing Process "ospfv3 1"   Reference bandwidth unit is 100 mbps

Un réglage, pas deux. Le coût est la bande passante de référence divisée par la bande passante de l’interface : les deux processus mettent donc les mêmes câbles à l’échelle avec des nombres qui diffèrent exactement d’un facteur 1000. Sur les liens à 10 Mbps cela arrive intact : 10000 contre 10. Sur les liens à 10 Gbps, OSPFv3 calcule 100/10000 = 0,01, et le coût minimal qu’un routeur annonce est 1. Le plancher mange le reste.

La distorsion n’est donc pas uniforme, et c’est précisément ce qui la rend dangereuse. Une mise à l’échelle uniforme serait inoffensive : multipliez chaque coût d’une topologie par la même constante et le plus court chemin ne bouge pas. Ici la constante vaut 1000 sur certains liens et 10 sur d’autres, parce qu’un plancher est intervenu. Les deux protocoles classent donc les mêmes liens différemment les uns par rapport aux autres, et le trafic IPv4 et le trafic IPv6 peuvent emprunter des chemins différents sur ce réseau. Vous ne pouvez pas voir lesquels à l’œil. Il faut calculer les deux.

Un outil qui affiche « un lien, un coût » doit choisir l’un des deux nombres. Quel que soit son choix, il se trompe la moitié du temps, et il ne vous dira jamais dans quelle moitié vous êtes.


Pourquoi la hiérarchie est porteuse

C’est la raison pour laquelle le modèle de données d’Osprey n’est pas Node, Edge, Protocol :

Network → Autonomous System → Routing Domain → Protocol Instance → Area → Device
                                                                      ↳ Interface

Chaque niveau existe parce que quelque chose dans le réseau peut différer d’un côté à l’autre :

  • Network : la frontière de locataire. Le même équipement physique peut être supervisé sous deux locataires avec des identifiants et des vues différents.
  • Autonomous System : l’identité BGP, et la portée à laquelle appartient un flux BMP.
  • Routing Domain : table globale, VRF ou L3VPN. Même routeur, tables de routage différentes, joignabilité réellement différente.
  • Protocol Instance : unique sur (domaine de routage, protocole, identifiant de processus, famille d’adresses). C’est le niveau qui fait de nrt1-cr1 deux routeurs.
  • Area : là où la LSDB vit réellement, et donc là où SPF tourne réellement.
  • Device : plusieurs-à-plusieurs avec les areas, via une table d’appartenance. Pas une clé étrangère. Une clé étrangère aurait imposé le mensonge selon lequel un routeur vit dans une seule area.

Et les interfaces sont bornées par (device_id, if_index, area_id), parce que le même port physique participe à plusieurs instances de protocole à la fois, avec dans chacune un coût différent, un état de voisinage différent et une famille d’adresses différente.

Les rôles dérivés découlent de cette structure au lieu d’être stockés comme étiquettes :

  • ABR = rattaché à plus d’une area au sein d’une instance
  • ASBR = le bit E positionné dans le LSA propre du routeur (RFC 2328 §A.4.2), c’est-à-dire le routeur déclarant qu’il origine des informations de routage externes. Pas un décompte d’appartenances : un routeur peut être ASBR en vivant dans une seule area, et il peut s’étendre sur plusieurs instances sans en être un
  • VRF-Lite = présent dans plus d’un domaine de routage

Voilà pourquoi nrt1-cr1 peut être ABR deux fois, et pourquoi le badge est dessiné deux fois. Personne n’a tapé « ABR » nulle part. C’est une conséquence des appartenances, recalculée depuis les LSDB.


Les topologies sont toutes réelles en même temps

La bonne façon d’y penser est qu’il n’existe pas la topologie. Il y en a plusieurs, elles sont toutes vraies simultanément, et elles répondent à des questions différentes :

TopologieConstruite à partir deRépond à
PhysiqueLLDP / CDP, IP-MIBCe qui est câblé à quoi
L2Adjacence bridge/VLANCe qui partage un domaine de diffusion
IGP (par instance)LSDB par protocole et par areaCe que chaque protocole croit
BGPRIB BMPCe qui est joignable et par qui
AcheminementLa table propre de chaque routeurOù va réellement un paquet

« A et B sont-ils connectés ? » a cinq réponses correctes différentes selon celle que vous vouliez dire. Deux routeurs peuvent partager un câble sans aucune adjacence IGP. Ils peuvent partager une adjacence IGP et ne jamais s’échanger un paquet. Ils peuvent être voisins BGP par un chemin qui traverse trois équipements qu’aucun des deux ne voit.

Le billet trois était en réalité un argument sur les deux dernières lignes : la topologie IGP et la topologie d’acheminement ne sont pas le même graphe, et les traiter comme un seul produisait des chemins fictifs une fois sur huit. Ce billet-ci est le même argument un niveau plus bas : la topologie physique et la topologie protocolaire ne sont pas non plus le même graphe, et 124 liens de mon laboratoire le prouvent avec un facteur dix.


Ce que cela coûte

Être honnête là-dessus n’est pas gratuit. Cela veut dire :

  • Deux LSDB à parcourir là où un outil plus simple en parcourt une
  • Une table d’appartenance au lieu d’une clé étrangère
  • Des rôles recalculés plutôt que stockés
  • Chaque requête de chemin doit savoir de quelle instance et de quelle famille d’adresses on lui parle
  • Une interface qui doit afficher une barre d’onglets sur un lien au lieu d’un nombre

L’alternative est un graphe qui s’affiche plus vite, se démontre mieux, et choisit discrètement l’un des deux coûts sur chaque lien à double pile de votre réseau.

J’ai exploité des réseaux où les chemins IPv4 et IPv6 divergeaient sans que personne ne s’en aperçoive pendant des mois, parce que chaque outil au mur dessinait une ligne entre deux routeurs. La ligne n’était pas fausse. Elle répondait simplement à une question que personne n’avait posée.


Ensuite : ce qui se passe quand ces sources se contredisent franchement : Quand le réseau se contredit lui-même.