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 :
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 protocole | Areas | Rôle |
|---|---|---|
| OSPFv2 · processus 1 (ipv4) | 0.0.0.0, 14.18.20.0 | ABR · ASBR |
| OSPFv3 · processus 1 (ipv6) | 0.0.0.0, 14.18.20.0 | ABR · 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 :
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 200 | 124 |
|---|---|
| …où les coûts OSPFv2 et OSPFv3 diffèrent | 124 (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-cr1deux 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 :
| Topologie | Construite à partir de | Répond à |
|---|---|---|
| Physique | LLDP / CDP, IP-MIB | Ce qui est câblé à quoi |
| L2 | Adjacence bridge/VLAN | Ce qui partage un domaine de diffusion |
| IGP (par instance) | LSDB par protocole et par area | Ce que chaque protocole croit |
| BGP | RIB BMP | Ce qui est joignable et par qui |
| Acheminement | La table propre de chaque routeur | Où 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.