Le critère #12 n'est atteint que si tous les critères précédents (#1–#11) sont égaux entre deux chemins. Il est exclusif aux environnements Route Reflector : si aucun chemin ne porte de CLUSTER_LIST, ce critère ne départage rien.
Longueur = nombre de sauts RR
La CLUSTER_LIST contient un Cluster-ID (4 octets) par Route Reflector traversé. Le chemin avec le moins de Cluster-IDs est préféré : il a traversé moins de RR, donc est plus proche de l'annonceur.
Anti-boucle avant comparaison
Avant même d'arriver au critère #12, un RR qui reçoit une route contenant son propre Cluster-ID dans la CLUSTER_LIST rejette la route immédiatement (boucle détectée). La comparaison ne porte que sur les routes acceptées.
Cas d'égalité
Si les deux chemins ont une CLUSTER_LIST de même longueur (ou ni l'un ni l'autre n'en a), le critère #12 ne départage pas → on passe au critère #13 : adresse IP du neighbor (lowest wins).
Chemin sans CLUSTER_LIST
Un chemin sans CLUSTER_LIST est arrivé directement (pas via RR). S'il est comparé à un chemin avec CLUSTER_LIST, le chemin sans CLUSTER_LIST est préféré car longueur 0 < longueur > 0.
Sans Route Reflectors, iBGP exige une full-mesh : chaque routeur doit avoir une session iBGP avec tous les autres. Pour n routeurs : n(n-1)/2 sessions. Les RR suppriment cette contrainte en réfléchissant les routes.
| Source de la route | Reflété vers clients ? | Reflété vers non-clients ? | CLUSTER_LIST modifiée ? |
|---|---|---|---|
| Peer eBGP | ✓ Oui | ✓ Oui | Cluster-ID ajouté |
| Client iBGP | ✓ Oui (autres clients) | ✓ Oui | Cluster-ID ajouté |
| Non-client iBGP | ✓ Oui | ✗ Non (split horizon) | Cluster-ID ajouté |
[1.1.1.1] (longueur 1) → ce chemin serait préféré au critère #12.Avant de réfléchir une route, le RR vérifie si son propre Cluster-ID est déjà présent dans la CLUSTER_LIST reçue :
! ─── Vérification anti-boucle au niveau du RR ──────────────────────────
! Route reçue par RR1 (Cluster-ID = 1.1.1.1) :
!
! Cas 1 — CLUSTER_LIST reçue : [2.2.2.2]
! → 1.1.1.1 absent → OK, RR1 ajoute 1.1.1.1 et réfléchit
! → CLUSTER_LIST envoyée : [1.1.1.1, 2.2.2.2]
!
! Cas 2 — CLUSTER_LIST reçue : [2.2.2.2, 1.1.1.1]
! → 1.1.1.1 présent → BOUCLE DÉTECTÉE → route REJETÉE silencieusement
! → La route n'est pas installée, pas réfléchie
| Champ | Taille | Valeur |
|---|---|---|
| Flags | 1 octet | 0x80 — Optional, Non-Transitive, pas Partial |
| Type code | 1 octet | 10 |
| Length | 1 octet | 4 × nombre de Cluster-IDs (ex: 2 RRs → 8) |
| Value | 4n octets | Liste de Cluster-IDs (4 octets chacun), du plus récent au plus ancien |
| Attribut | Type | Contenu | Usage critère BGP |
|---|---|---|---|
ORIGINATOR_ID |
9 | Router-ID de l'annonceur original (ajouté par 1er RR) | Critère #11 (remplace Router-ID du peer) |
CLUSTER_LIST |
10 | Liste des Cluster-IDs traversés (1 par RR) | Critère #12 (shortest wins) |
Ces deux attributs sont toujours créés ensemble par le premier RR qui réfléchit une route. ORIGINATOR_ID n'est ajouté qu'une seule fois (par le 1er RR), alors que CLUSTER_LIST grandit à chaque RR traversé.
! ─── Relation Cluster-ID / Router-ID ──────────────────────────────────── ! ! Par défaut : Cluster-ID = Router-ID du RR ! → Si RR1 a RID = 1.1.1.1, son Cluster-ID = 1.1.1.1 ! ! Configuration manuelle : ! router bgp 65000 ! bgp cluster-id 10.0.0.1 ! → Cluster-ID = 10.0.0.1 (indépendant du RID) ! ! Pourquoi configurer manuellement ? ! Deux RRs dans le MÊME cluster (redondance) doivent avoir ! le MÊME Cluster-ID → sinon la route apparaît dans 2 clusters ! différents → la CLUSTER_LIST grossit inutilement de 2 entrées ! au lieu de 1 → critère #12 défavorisé sans raison. router bgp 65000 bgp cluster-id 10.0.0.1 ! même valeur sur RR1 et RR2 du cluster neighbor 10.1.1.2 route-reflector-client neighbor 10.1.1.3 route-reflector-client
! ─── Exemple : R reçoit deux chemins vers 192.168.1.0/24 ────────────────
!
! Chemin A (via RR1 → RR2) :
! CLUSTER_LIST : [2.2.2.2, 1.1.1.1] ← longueur = 2
!
! Chemin B (via RR3 directement) :
! CLUSTER_LIST : [3.3.3.3] ← longueur = 1
!
! Critères #1 à #11 : tous égaux
! Critère #12 : longueur(B) = 1 < longueur(A) = 2
! → Chemin B préféré (CLUSTER_LIST plus courte)
!
! ─── Cas sans CLUSTER_LIST ──────────────────────────────────────────────
! Chemin C (route eBGP directe, pas de RR) :
! CLUSTER_LIST : absente ← longueur = 0
!
! Chemin D (via RR) :
! CLUSTER_LIST : [5.5.5.5] ← longueur = 1
!
! Critère #12 : longueur(C) = 0 < longueur(D) = 1
! → Chemin C préféré
! ─── RR1 — Route Reflector avec clients ───────────────────────────────── router bgp 65000 bgp router-id 1.1.1.1 bgp cluster-id 1.1.1.1 ! optionnel si RID = Cluster-ID souhaité ! Clients du RR (les routes reçues d'eux sont réfléchies) neighbor 10.0.1.1 remote-as 65000 neighbor 10.0.1.1 update-source Loopback0 neighbor 10.0.1.1 route-reflector-client neighbor 10.0.1.2 remote-as 65000 neighbor 10.0.1.2 update-source Loopback0 neighbor 10.0.1.2 route-reflector-client ! Non-clients (autres RRs) — session iBGP normale neighbor 2.2.2.2 remote-as 65000 neighbor 2.2.2.2 update-source Loopback0
! ─── Cluster avec 2 RRs (haute disponibilité) ─────────────────────────── ! ! RR1 et RR2 servent les mêmes clients. ! Ils doivent avoir le MÊME Cluster-ID pour éviter que ! la CLUSTER_LIST ne grossisse de 2 entrées à chaque passage. ! ! Résultat INCORRECT (Cluster-IDs différents) : ! Client → RR1 (ajoute 1.1.1.1) → RR2 (ajoute 2.2.2.2) → autre client ! CLUSTER_LIST = [2.2.2.2, 1.1.1.1] ← 2 entrées pour 1 seul cluster ! ! ── RR1 ── router bgp 65000 bgp router-id 1.1.1.1 bgp cluster-id 10.0.0.100 ! même cluster-id que RR2 neighbor 10.0.1.1 route-reflector-client neighbor 10.0.1.2 route-reflector-client ! ── RR2 ── router bgp 65000 bgp router-id 2.2.2.2 bgp cluster-id 10.0.0.100 ! même cluster-id que RR1 ← clé neighbor 10.0.1.1 route-reflector-client neighbor 10.0.1.2 route-reflector-client
! ─── Vérifier la configuration RR ─────────────────────────────────────── show ip bgp summary ! vue globale des sessions show ip bgp neighbors 10.0.1.1 ! vérifier "route-reflector-client" show ip bgp 192.168.1.0/24 ! voir les chemins et CLUSTER_LIST ! ─── Chercher les routes avec CLUSTER_LIST ─────────────────────────────── show ip bgp regexp _ ! toutes les routes iBGP show ip bgp 192.168.1.0 255.255.255.0 ! chemin détaillé ! ─── Identifier un RR dans la table ───────────────────────────────────── show ip bgp 10.10.10.0/24 ! BGP routing table entry for 10.10.10.0/24 ! Paths: (2 available, best #1) ! Advertised to update-groups: ! 1 ! 65100 ! 10.0.1.1 from 2.2.2.2 (2.2.2.2) ! Origin IGP, metric 0, localpref 100, valid, internal, best ! Originator: 10.0.1.1, Cluster list: 2.2.2.2, 1.1.1.1 ! ─────────────────────────────────────────── ! ORIGINATOR_ID (type 9) CLUSTER_LIST (type 10) ! rx pathid: 0, tx pathid: 0x0
Cluster list: dans show ip bgp affiche les Cluster-IDs dans l'ordre de la liste (du plus récent au plus ancien). Le nombre d'entrées est ce qui compte pour le critère #12.PE2# show ip bgp 10.10.10.0/24 BGP routing table entry for 10.10.10.0/24, version 12 Paths: (2 available, best #1, table default) Not advertised to any peer Refresh Epoch 1 65100 10.0.1.1 from 1.1.1.1 (1.1.1.1) ← via RR1 Origin IGP, metric 0, localpref 100, valid, internal, best Originator: 10.0.1.1, Cluster list: 1.1.1.1 ↑ longueur = 1 ← GAGNE critère #12 rx pathid: 0, tx pathid: 0x0 Refresh Epoch 1 65100 10.0.3.1 from 3.3.3.3 (3.3.3.3) ← via RR2→RR3 Origin IGP, metric 0, localpref 100, valid, internal Originator: 10.0.1.1, Cluster list: 3.3.3.3, 2.2.2.2 ↑ longueur = 2 ← PERD critère #12 rx pathid: 0, tx pathid: 0
| Critère | Chemin A (RR1) | Chemin B (RR2→RR3) | Résultat |
|---|---|---|---|
| #1 à #10 | Identiques (même LOCAL_PREF, même AS-PATH, même IGP…) | Égalité | |
| #11 Router-ID | ORIG_ID = 10.0.1.1 | ORIG_ID = 10.0.1.1 | Égalité |
| #12 Cluster-list | longueur = 1 | longueur = 2 | Chemin A gagne |
RR1# show ip bgp neighbors 10.0.1.2 BGP neighbor is 10.0.1.2, remote AS 65000, internal link BGP version 4, remote router ID 10.0.1.2 ... Route-Reflector Client RR1# show running-config | section router bgp router bgp 65000 bgp cluster-id 1.1.1.1 neighbor 10.0.1.1 route-reflector-client neighbor 10.0.1.2 route-reflector-client
! ── Symptôme ── ! Client reçoit la même route via RR1 et RR2 (redondants) ! CLUSTER_LIST via RR1 : [1.1.1.1] ← attendu ! CLUSTER_LIST via RR2 : [2.2.2.2] ← attendu ! Mais après réflexion inter-RR : ! CLUSTER_LIST : [2.2.2.2, 1.1.1.1] ← 2 entrées pour 1 cluster ! ! ! ── Fix ── router bgp 65000 bgp cluster-id 10.0.0.100 ! MÊME valeur sur RR1 et RR2
bgp cluster-id n'est pas configuré, le Cluster-ID = Router-ID du RR. Si deux RRs différents ont accidentellement le même Router-ID (mauvaise config), le mécanisme anti-boucle peut rejeter des routes légitimes.! Vérification — s'assurer que les Cluster-IDs sont uniques entre clusters show ip bgp neighbors | include cluster show running-config | include cluster-id
show ip bgp sur un routeur eBGP voisin, la CLUSTER_LIST n'apparaît pas. Ce comportement est normal.! Sur un routeur eBGP qui reçoit la route depuis l'AS :
! → Cluster list: absent ← normal, attribut stripped avant envoi eBGP
! → Originator: absent ← idem, ORIGINATOR_ID aussi stripped
! Route dans une hiérarchie 3 niveaux :
! CLUSTER_LIST : [3.3.3.3, 2.2.2.2, 1.1.1.1] ← longueur = 3
!
! Route dans hiérarchie 2 niveaux :
! CLUSTER_LIST : [2.2.2.2, 1.1.1.1] ← longueur = 2
!
! Au critère #12 : la route 2 niveaux gagne (longueur plus courte)
Cliquez sur une carte pour révéler la réponse.
bgp cluster-id X.X.X.X. Ainsi, quand la route passe par les deux RRs, un seul Cluster-ID est ajouté au lieu de deux. Le mécanisme anti-boucle fonctionne toujours car les deux RRs partagent le même ID.
show ip bgp X.X.X.X/Y, la ligne Cluster list: A.A.A.A, B.B.B.B affiche les Cluster-IDs du plus récent au plus ancien. Le nombre d'IDs listés = longueur de la CLUSTER_LIST = nombre de sauts RR. La ligne Originator: Z.Z.Z.Z juste avant indique l'ORIGINATOR_ID.