P24 - BGP de A à Z

Objectif

Tout savoir sur BGP (Border Gateway Protocol), le protocole qui fait tenir Internet : vocabulaire, fonctionnement, attributs, choix du meilleur chemin, configuration Cisco et Linux (FRRouting), filtrage, multihoming, sécurité (RPKI) et dépannage. Fiche de référence complète, à lire dans l’ordre la première fois.

Sources et prérequis


Sommaire

  1. 1. BGP en une image
  2. 2. Le vocabulaire indispensable
  3. 3. Les principes de fonctionnement
  4. 4. La session BGP (états, messages, minuteries)
  5. 5. Les trois tables de BGP
  6. 6. Les attributs de chemin
  7. 7. Le choix du meilleur chemin
  8. 8. Labo Cisco complet pas à pas
  9. 9. Filtrer ce qu’on reçoit et ce qu’on annonce
  10. 10. Agrégation et communautés
  11. 11. Influencer le trafic (multihoming)
  12. 12. iBGP à grande échelle (route reflectors)
  13. 13. BGP et IPv6 (MP-BGP)
  14. 14. Sécurité de BGP
  15. 15. BGP sous Linux avec FRRouting
  16. 16. BGP ailleurs qu’entre opérateurs
  17. 17. Outils pour observer Internet
  18. 18. Aide-mémoire des commandes
  19. Exercices
  20. Erreurs fréquentes / dépannage

1. BGP en une image

Internet n’est pas un réseau : c’est l’interconnexion de plus de 75 000 réseaux indépendants (opérateurs, hébergeurs, universités, grandes entreprises). Chacun est un système autonome (AS). BGP est la langue qu’ils parlent pour se dire « moi, je sais joindre ces adresses ».

flowchart LR
  subgraph AS64500["AS 64500 — ton entreprise"]
    E["Routeur de bordure"]
  end
  subgraph AS174["AS 174 — Cogent (transitaire)"]
    C1["Routeur"] --- C2["Routeur"]
  end
  subgraph AS3215["AS 3215 — Orange"]
    O["Routeur"]
  end
  subgraph AS15169["AS 15169 — Google"]
    G["Routeur"]
  end
  E ---|"eBGP<br/>« je possède 203.0.113.0/24 »"| C1
  C2 ---|"eBGP"| O
  C2 ---|"eBGP"| G
  O ---|"eBGP (peering)"| G
   Ce que BGP transporte : des « annonces »

   « Le réseau 203.0.113.0/24 est joignable par moi.
     Pour y aller, le chemin d'AS est : 174 64500 »
                                         │    └── l'AS d'origine (le propriétaire)
                                         └─────── l'AS qui relaie l'annonce

La phrase à retenir

BGP ne route pas les paquets, il annonce des routes. Les paquets sont transmis par la table de routage classique ; BGP se contente de la remplir avec les meilleurs chemins appris de ses voisins.


2. Le vocabulaire indispensable

Systèmes autonomes

TermeSignification
AS (Autonomous System)Ensemble de réseaux IP publics sous une politique de routage, géré par une organisation
ASNNuméro d’AS. 16 bits à l’origine (1 à 65535), 32 bits depuis 2007 (jusqu’à 4 294 967 295)
PréfixeUn bloc d’adresses annoncé, en notation CIDR : 203.0.113.0/24
Voisin / peerRouteur avec qui on a une session BGP (configurée à la main)
Speaker / routeur de bordureRouteur qui parle BGP avec l’extérieur
eBGPSession entre deux AS différents
iBGPSession entre deux routeurs du même AS
IGPRoutage interne à l’AS (OSPF, IS-IS)
EGPRoutage entre AS : en pratique, BGP version 4 (RFC 4271)

Exemples réels : AS 174 = Cogent, AS 3215 = Orange, AS 12322 = Free, AS 15169 = Google, AS 16276 = OVH (ton hébergeur), AS 203432 = FAImaison (association nantaise, citée par lidstah).

Numéros d’AS réservés

PlageUsage
0Réservé, interdit
23456AS_TRANS : sert de remplaçant pour les vieux routeurs qui ne comprennent pas les ASN 32 bits
64496 – 64511 et 65536 – 65551Documentation et exemples (comme 192.0.2.0/24 pour les IP)
64512 – 65534Privés 16 bits : labos, réseaux internes, datacenters (comme le RFC 1918 pour les IP)
4 200 000 000 – 4 294 967 294Privés 32 bits
65535, 4 294 967 295Réservés

Un AS privé ne doit jamais apparaître sur Internet

Comme une adresse 192.168.x.x. Un opérateur supprime les ASN privés avant de relayer une route (neighbor X remove-private-as chez Cisco).

Qui distribue les numéros ?

IANA (mondial)
 └── RIR (un par continent)
      ├── RIPE NCC   → Europe, Moyen-Orient, Russie (siège : Amsterdam)
      ├── ARIN       → Amérique du Nord
      ├── APNIC      → Asie-Pacifique
      ├── LACNIC     → Amérique latine
      └── AFRINIC    → Afrique
           └── LIR (membres du RIR : opérateurs, associations…)
                └── les organisations qui reçoivent ASN et blocs d'IP

Pour obtenir un ASN, il faut être multihomé (relié à au moins deux autres AS) ou avoir une politique de routage propre, et passer par un LIR. Les blocs IPv4 sont devenus rares (on justifie chaque besoin) ; en IPv6 un LIR fournit typiquement un /32, une organisation un /48.

Transit, peering, IXP

TermeExplication
TransitUn opérateur te vend l’accès à tout Internet. Facturé au débit, en général au 95ᵉ centile (on retire les 5 % de pics du mois)
PeeringDeux AS échangent leur trafic mutuel, souvent gratuitement si les volumes sont équilibrés (au-delà d’un ratio d’environ 2,5 il devient souvent payant)
IXP (Internet eXchange Point)Lieu physique où des dizaines d’AS se branchent sur un même switch pour faire du peering : France-IX, Equinix Paris, Ouest-IX (Nantes/Rennes), LyonIX…
Route serverServeur BGP d’un IXP : on monte une session avec lui au lieu de cent sessions avec tous les membres
Tier 1Opérateur qui n’achète jamais de transit (Cogent, Lumen, NTT, Orange OpenTransit…)
Tier 2Achète du transit et en revend
Tier 3Achète tout (petit FAI, entreprise)
Full viewLa table BGP complète d’Internet : environ un million de préfixes IPv4 et plus de 200 000 en IPv6 en 2026. Il faut plusieurs Go de RAM sur le routeur
Route par défautAlternative à la full view : le transitaire n’envoie que 0.0.0.0/0 (suffisant pour un petit AS)
flowchart TB
  T1a["Tier 1 A"] <-->|"peering gratuit"| T1b["Tier 1 B"]
  T2["Tier 2<br/>(FAI régional)"] -->|"achète du transit"| T1a
  T3["Tier 3<br/>(petit FAI, entreprise)"] -->|"achète du transit"| T2
  T2 <-->|"peering à l'IXP"| T2b["Autre Tier 2"]

3. Les principes de fonctionnement

CaractéristiqueDétail
TransportTCP port 179 : la fiabilité est assurée par TCP, pas par BGP
TypeVecteur de chemin (path vector) : chaque route porte la liste des AS traversés
VoisinsDéclarés à la main des deux côtés (aucune découverte automatique, contrairement à OSPF)
Mises à jourIncrémentales : on n’envoie que ce qui change (pas de rafraîchissement périodique de toute la table)
MétriquePas de « coût » unique : une liste d’attributs comparés dans un ordre précis (§ 7)
PhilosophiePolitique avant performance : on choisit selon des règles commerciales (« je préfère mon lien gratuit »), pas selon le débit
ConvergenceLente (dizaines de secondes à minutes) : la stabilité est privilégiée
Distance administrative (Cisco)eBGP = 20 (plus fiable qu’OSPF 110) · iBGP = 200 (moins fiable que l’IGP)

Les deux règles anti-boucle

Règle eBGP : « Si je vois MON numéro d'AS dans l'AS_PATH, je refuse la route. »

   AS100 ──► AS200 ──► AS300 ──► AS100 ?
   AS_PATH reçu par AS100 : "300 200 100"  → contient 100 → REJETÉE

Règle iBGP (split horizon) : « Une route apprise d'un voisin iBGP
                              n'est JAMAIS renvoyée à un autre voisin iBGP. »

Conséquence de la règle iBGP : dans un AS, tous les routeurs BGP doivent être reliés entre eux en iBGP (full mesh : n × (n − 1) / 2 sessions, soit 45 sessions pour 10 routeurs !) ou utiliser des route reflectors (§ 12).

eBGP vs iBGP

eBGPiBGP
EntreAS différentsMême AS
remote-as≠ son propre AS= son propre AS
TTL des paquets1 (voisin directement connecté, sinon ebgp-multihop)255 (peut traverser l’AS)
NEXT_HOPRemplacé par l’IP du routeur qui annonceConservé tel quel (d’où next-hop-self)
AS_PATHOn ajoute son ASN en têteInchangé
LOCAL_PREFPas transmisTransmis
Distance administrative20200
Session montée surL’IP de l’interface d’interconnexionEn général les loopbacks (plus stables)

4. La session BGP (états, messages, minuteries)

Les 6 états (machine à états finis)

stateDiagram-v2
  [*] --> Idle
  Idle --> Connect: démarrage, ouverture TCP vers le port 179
  Connect --> OpenSent: TCP établi, envoi d'OPEN
  Connect --> Active: échec TCP, nouvelle tentative
  Active --> OpenSent: TCP établi
  Active --> Idle: échec répété
  OpenSent --> OpenConfirm: OPEN du voisin reçu et accepté
  OpenConfirm --> Established: KEEPALIVE reçu
  Established --> Idle: NOTIFICATION ou hold timer expiré
ÉtatCe qui se passeSi on reste bloqué ici
IdleRien, en attenteVoisin désactivé (shutdown), pas de route vers lui
ConnectTentative de connexion TCPPaquets perdus, pare-feu
ActiveNouvelle tentative après un échec TCPLe plus courant : IP du voisin fausse, TCP/179 bloqué, mauvaise IP source (update-source), eBGP non direct (ebgp-multihop)
OpenSentOPEN envoyé, on attend celui du voisin
OpenConfirmOPEN reçu, on attend un KEEPALIVEMauvais ASN, mot de passe MD5 différent, router-id identiques
Established✅ Les routes s’échangent-

Piège de vocabulaire

Active ne veut pas dire « actif = ça marche » : c’est un état d’échec ! Dans show ip bgp summary, une session qui fonctionne affiche un nombre (les préfixes reçus) dans la colonne State/PfxRcd, pas un mot.

Les messages

MessageContenuQuand
OPENVersion (4), ASN, hold time, router-id, capacités (IPv6, ASN 32 bits, route refresh…)À l’ouverture
KEEPALIVEVide (19 octets)Toutes les 60 s par défaut chez Cisco
UPDATENouvelles routes (préfixes + attributs) et/ou routes retirées (withdrawn)À chaque changement
NOTIFICATIONCode d’erreurJuste avant de couper la session
ROUTE-REFRESH« Renvoie-moi toutes tes routes »Après un changement de filtre (clear ip bgp X soft in)

Minuteries

MinuterieCiscoJuniper / FRRRôle
Keepalive60 s30 s / 60 sFréquence des KEEPALIVE
Hold time180 s90 s / 180 sSans nouvelles du voisin pendant ce temps → session coupée

Les deux voisins retiennent le plus petit hold time proposé. Pour détecter une panne plus vite, on ne baisse pas trop ces minuteries : on ajoute BFD (Bidirectional Forwarding Detection, détection en moins d’une seconde).

router bgp 64500
 ! keepalive 10 s, hold 30 s (labo)
 neighbor 10.0.12.2 timers 10 30
 ! si BFD est configuré sur l'interface
 neighbor 10.0.12.2 fall-over bfd

5. Les trois tables de BGP

flowchart LR
  V["Voisins"] -->|"UPDATE"| IN["Adj-RIB-In<br/>tout ce qui est reçu<br/>(avant filtre)"]
  IN -->|"filtres en entrée<br/>(prefix-list, route-map in)"| LOC["Loc-RIB = table BGP<br/>show ip bgp<br/>meilleur chemin marqué >"]
  LOC -->|"meilleurs chemins"| RIB["Table de routage<br/>show ip route bgp<br/>(B)"]
  LOC -->|"filtres en sortie<br/>(route-map out)"| OUT["Adj-RIB-Out<br/>ce qu'on annonce"]
  OUT -->|"UPDATE"| V2["Voisins"]
TableCommande CiscoContenu
Voisinsshow ip bgp summaryListe des peers, état, nombre de préfixes reçus
Table BGPshow ip bgpToutes les routes reçues, de tous les voisins, avec leurs attributs
Table de routageshow ip route bgpSeulement les meilleures, effectivement utilisées

Lire show ip bgp

BGP table version is 7, local router ID is 1.1.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

     Network          Next Hop        Metric LocPrf Weight Path
 *>  10.10.0.0/24     0.0.0.0              0         32768 i
 *>  172.16.1.0/24    10.0.12.2            0             0 64501 i
 *   172.16.2.0/24    10.0.13.3                          0 64502 64503 i
 *>                   10.0.12.2                          0 64501 64503 i
 *>i 192.168.50.0/24  2.2.2.2              0    100      0 64504 i
Colonne / symboleSignification
*Route valide (next hop joignable)
>Meilleur chemin, installé dans la table de routage
i (à gauche)Apprise en iBGP
rRIB-failure : une meilleure route existe déjà par un autre protocole (ex. statique)
s / dSupprimée (agrégation) / pénalisée (dampening, route qui « clignote »)
Next Hop 0.0.0.0Route créée par ce routeur (commande network)
MetricLe MED
LocPrfLa LOCAL_PREF (100 par défaut, vide pour les routes eBGP)
Weight32768 pour ses propres routes, 0 sinon
Path + lettre finaleAS_PATH, puis l’ORIGIN : i (IGP / network), e (EGP, historique), ? (incomplete / redistribute)

Sur la ligne 172.16.2.0/24, deux chemins existent : le second (via 64501) est préféré bien que les deux AS_PATH fassent la même longueur, à cause d’un critère plus bas dans la liste (§ 7).


6. Les attributs de chemin

Chaque route BGP transporte des attributs. Ce sont eux que BGP compare pour choisir.

CatégorieSignificationAttributs
Bien connu obligatoireTous les routeurs le comprennent, présent dans chaque UPDATEORIGIN, AS_PATH, NEXT_HOP
Bien connu discrétionnaireTous le comprennent, présence facultativeLOCAL_PREF, ATOMIC_AGGREGATE
Optionnel transitifPeut être inconnu, mais est relayé quand mêmeCOMMUNITY, AGGREGATOR, LARGE_COMMUNITY
Optionnel non transitifPeut être inconnu, pas relayé au-delà du voisinMED, ORIGINATOR_ID, CLUSTER_LIST
Propre à CiscoN’est jamais transmis, local au routeurWEIGHT
AttributRôleQui préfère quoiPortée
WEIGHT (Cisco)Préférer un voisin sur ce routeurLe plus hautCe routeur seulement
LOCAL_PREFChoisir la sortie de l’ASLe plus haut (défaut 100)Tout l’AS (iBGP)
AS_PATHListe des AS traversés, anti-boucleLe plus courtPartout
ORIGINComment la route est néei < e < ?Partout
MED (Multi-Exit Discriminator)Suggérer au voisin par quelle entrée venirLe plus basAS voisin seulement
NEXT_HOPIP à qui envoyer le paquetDoit être joignable-
COMMUNITYÉtiquette pour appliquer des politiques (64500:100)-Relayé

7. Le choix du meilleur chemin

Quand un routeur reçoit plusieurs chemins vers le même préfixe, il les compare critère par critère et s’arrête au premier qui départage (ordre Cisco) :

#CritèreOn préfère
0NEXT_HOP joignable ?Sinon la route est ignorée
1WEIGHTLe plus haut
2LOCAL_PREFLe plus haut
3Route créée localement (network, aggregate)Locale
4AS_PATHLe plus court
5ORIGINIGP (i) < EGP (e) < incomplete (?)
6MEDLe plus bas (comparé seulement entre routes du même AS voisin)
7eBGP plutôt qu’iBGPeBGP
8Coût IGP jusqu’au next hopLe plus bas (hot potato : on fait sortir le trafic au plus vite)
9Multipath ?Plusieurs routes égales installées si maximum-paths
10Route eBGP la plus ancienneLa plus stable
11Router-id du voisinLe plus bas
12Longueur de CLUSTER_LISTLa plus courte
13Adresse IP du voisinLa plus basse

Moyen mnémotechnique

« We Love Oranges AS Oranges Mean Pure Refreshment » : Weight, Local pref, Originated localement, AS path, Origin, MED, Paths externes (eBGP), Router-id.

Ce critère passe AVANT tout BGP

Le routeur choisit d’abord la route la plus précise (préfixe le plus long) dans la table de routage, quel que soit le protocole. Si quelqu’un annonce 203.0.113.0/25 alors que tu annonces 203.0.113.0/24, la moitié de ton trafic part chez lui, même avec un AS_PATH plus long. C’est le principe des détournements (§ 14).


8. Labo Cisco complet pas à pas

Topologie

                       AS 64501                                AS 64502
                   ┌──────────────┐                        ┌──────────────┐
                   │     ISP1     │                        │     ISP2     │
                   │ Lo0 8.8.1.1  │                        │ Lo0 9.9.2.2  │
                   └──────┬───────┘                        └──────┬───────┘
                .1  10.0.11.0/30  eBGP                 eBGP  10.0.22.0/30  .1
                          │ .2                                 .2 │
   AS 64500    ┌──────────┴───────┐      10.0.12.0/30     ┌───────┴──────────┐
               │        R1        ├───────────────────────┤        R2        │
               │ Lo0 1.1.1.1/32   │ .1                 .2 │ Lo0 2.2.2.2/32   │
               └──────────┬───────┘   (OSPF aire 0 +      └───────┬──────────┘
                     .1   │          iBGP entre loopbacks)        │ .1
                10.0.13.0/30                                 10.0.23.0/30
                     .2   │                                       │ .2
               ┌──────────┴───────────────────────────────────────┴──┐
               │                         R3                          │
               │  Lo0 3.3.3.3/32   LAN 192.168.10.0/24 (.1)          │
               └─────────────────────────────────────────────────────┘
   Bloc public de l'entreprise annoncé à Internet : 203.0.113.0/24

Objectifs : AS 64500 (ton entreprise) est multihomé vers deux opérateurs, annonce son bloc 203.0.113.0/24, reçoit les routes des opérateurs, et ne devient pas transitaire entre eux.

Étape 1 - IGP interne (OSPF) pour joindre les loopbacks

iBGP a besoin que les loopbacks soient joignables : c’est le rôle de l’IGP.

! R1 (même principe sur R2 et R3 avec leurs réseaux)
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
router ospf 1
 router-id 1.1.1.1
 network 1.1.1.1 0.0.0.0 area 0
 network 10.0.12.0 0.0.0.3 area 0
 network 10.0.13.0 0.0.0.3 area 0
 ! interface vers ISP1 : pas d'OSPF avec l'opérateur
 passive-interface GigabitEthernet0/0

Vérifier : show ip route ospf doit montrer 2.2.2.2/32 et 3.3.3.3/32 sur R1.

Étape 2 - eBGP vers les opérateurs

! R1
router bgp 64500
 bgp router-id 1.1.1.1
 bgp log-neighbor-changes
 neighbor 10.0.11.1 remote-as 64501
 neighbor 10.0.11.1 description ISP1-transit
 ! MD5, identique des deux côtés
 neighbor 10.0.11.1 password Labo-BGP-1
 
! ISP1
router bgp 64501
 neighbor 10.0.11.2 remote-as 64500
 neighbor 10.0.11.2 password Labo-BGP-1
 network 8.8.1.1 mask 255.255.255.255

(R2 ↔ ISP2 : même chose avec 10.0.22.0/30 et AS 64502.)

show ip bgp summary sur R1 : le voisin 10.0.11.1 doit afficher un nombre de préfixes.

Étape 3 - Annoncer son bloc avec network

La commande network de BGP n’active rien sur les interfaces (contrairement à OSPF) : elle annonce un préfixe s’il existe exactement (même masque) dans la table de routage. Astuce classique : une route statique vers Null0 qui « ancre » le bloc.

! R1 et R2
! le bloc existe toujours, même si un sous-réseau tombe
ip route 203.0.113.0 255.255.255.0 Null0
router bgp 64500
 ! ici c'est un MASQUE, pas un wildcard
 network 203.0.113.0 mask 255.255.255.0

network ou redistribute ?

network = liste précise, ORIGIN i, recommandé. redistribute connected|static|ospf = automatique mais risqué (on peut annoncer à Internet des réseaux privés), ORIGIN ? ; toujours avec une route-map de filtrage.

Étape 4 - iBGP entre loopbacks

! R1
router bgp 64500
 ! même AS = iBGP
 neighbor 2.2.2.2 remote-as 64500
 ! sinon la session part avec l'IP de l'interface
 neighbor 2.2.2.2 update-source Loopback0
 ! sinon R2 reçoit le next hop 10.0.11.1 qu'il ne connaît pas
 neighbor 2.2.2.2 next-hop-self
 neighbor 3.3.3.3 remote-as 64500
 neighbor 3.3.3.3 update-source Loopback0
 neighbor 3.3.3.3 next-hop-self

(Faire de même sur R2 vers 1.1.1.1 et 3.3.3.3, et sur R3 vers 1.1.1.1 et 2.2.2.2 : full mesh des 3 routeurs.)

Pourquoi next-hop-self ?

ISP1 annonce 8.8.1.1/32, next hop = 10.0.11.1 (son IP)
R1 relaie à R2 en iBGP SANS changer le next hop → R2 lit « next hop 10.0.11.1 »
R2 ne connaît pas 10.0.11.0/30 (pas dans OSPF) → route invalide (pas de *)
Avec next-hop-self : R1 écrit « next hop 1.1.1.1 » → R2 le joint par OSPF ✅

Étape 5 - Ne pas devenir transitaire

Sans filtre, R1 réannoncerait à ISP1 les routes apprises d’ISP2 : ton petit lien entreprise transporterait le trafic entre deux opérateurs. On n’annonce que ses propres préfixes :

! ^$ = AS_PATH vide = routes nées dans MON AS
ip as-path access-list 1 permit ^$
ip prefix-list MES-PREFIXES seq 5 permit 203.0.113.0/24
route-map VERS-OPERATEURS permit 10
 match ip address prefix-list MES-PREFIXES
 match as-path 1
router bgp 64500
 neighbor 10.0.11.1 route-map VERS-OPERATEURS out

Étape 6 - Vérifier

show ip bgp summary
show ip bgp
! tous les chemins vers ce préfixe et pourquoi le meilleur
show ip bgp 8.8.1.1
! ce qu'on annonce à ISP1
show ip bgp neighbors 10.0.11.1 advertised-routes
! ce qu'on a accepté d'ISP1
show ip bgp neighbors 10.0.11.1 routes
show ip route bgp
! depuis R3
ping 8.8.1.1 source 192.168.10.1

Faire ce labo

Packet Tracer gère un BGP simplifié (sessions eBGP de base). Pour iBGP, route-maps, communautés, il faut GNS3 ou EVE-NG avec des images Cisco, ou plus simplement FRRouting sur des VM Debian du cluster Proxmox (§ 15).


9. Filtrer ce qu’on reçoit et ce qu’on annonce

Les listes de préfixes (prefix-list)

ip prefix-list NOM seq N permit|deny RÉSEAU/LONGUEUR [ge MIN] [le MAX]
ÉcritureCe qui correspond
10.0.0.0/8Exactement 10.0.0.0/8, rien d’autre
10.0.0.0/8 le 24Tout préfixe contenu dans 10/8 de longueur 8 à 24
10.0.0.0/8 ge 16 le 24Contenu dans 10/8, longueur 16 à 24
0.0.0.0/0Seulement la route par défaut
0.0.0.0/0 le 32Tout (= permit any)
0.0.0.0/0 ge 25Tout préfixe plus petit qu’un /24 (trop précis pour Internet)

Une prefix-list se termine par un deny implicite (comme une ACL). Les numéros de séquence permettent d’insérer des lignes plus tard (5, 10, 15…).

Filtre d’entrée type face à un transitaire (bogons)

On refuse ce qui n’a rien à faire sur Internet (liste inspirée du cours de lidstah) :

! « ce réseau »
ip prefix-list DEPUIS-TRANSIT seq 5  deny 0.0.0.0/8 le 32
! RFC 1918
ip prefix-list DEPUIS-TRANSIT seq 10 deny 10.0.0.0/8 le 32
! CGNAT
ip prefix-list DEPUIS-TRANSIT seq 15 deny 100.64.0.0/10 le 32
! bouclage
ip prefix-list DEPUIS-TRANSIT seq 20 deny 127.0.0.0/8 le 32
! APIPA
ip prefix-list DEPUIS-TRANSIT seq 25 deny 169.254.0.0/16 le 32
! RFC 1918
ip prefix-list DEPUIS-TRANSIT seq 30 deny 172.16.0.0/12 le 32
! protocoles IETF
ip prefix-list DEPUIS-TRANSIT seq 35 deny 192.0.0.0/24 le 32
! documentation
ip prefix-list DEPUIS-TRANSIT seq 40 deny 192.0.2.0/24 le 32
! RFC 1918
ip prefix-list DEPUIS-TRANSIT seq 45 deny 192.168.0.0/16 le 32
! tests de performance
ip prefix-list DEPUIS-TRANSIT seq 50 deny 198.18.0.0/15 le 32
! documentation
ip prefix-list DEPUIS-TRANSIT seq 55 deny 198.51.100.0/24 le 32
! documentation
ip prefix-list DEPUIS-TRANSIT seq 60 deny 203.0.113.0/24 le 32
! multicast
ip prefix-list DEPUIS-TRANSIT seq 65 deny 224.0.0.0/4 le 32
! réservé
ip prefix-list DEPUIS-TRANSIT seq 70 deny 240.0.0.0/4 le 32
! plus précis qu'un /24
ip prefix-list DEPUIS-TRANSIT seq 75 deny 0.0.0.0/0 ge 25
! la route par défaut (si on prend la full view)
ip prefix-list DEPUIS-TRANSIT seq 80 deny 0.0.0.0/0
! tout le reste
ip prefix-list DEPUIS-TRANSIT seq 100 permit 0.0.0.0/0 le 24
router bgp 64500
 neighbor 10.0.11.1 prefix-list DEPUIS-TRANSIT in
 ! sécurité si le voisin envoie n'importe quoi
 neighbor 10.0.11.1 maximum-prefix 1100000 90 restart 30

Le labo utilise 203.0.113.0/24

C’est un bloc de documentation : sur le vrai Internet il serait filtré par la ligne 60. Dans ton labo, retire cette ligne.

Règle d’usage sur Internet : on n’accepte pas plus précis qu’un /24 en IPv4 ni qu’un /48 en IPv6.

route-map : filtrer et modifier

route-map NOM permit|deny SÉQUENCE
 ! condition (prefix-list, as-path, community)
 match ...
 ! action (local-preference, metric, as-path prepend, community)
 set ...
  • Une route qui ne correspond à aucune séquence est refusée (deny implicite).
  • Pour « modifier certaines routes et laisser passer les autres », terminer par une séquence permit vide.

Filtrer sur le chemin d’AS (as-path access-list, expressions régulières)

ExpressionSignification
^$AS_PATH vide : mes propres routes
^64501$Routes nées chez mon voisin 64501 (pas plus loin)
^64501_Routes apprises de 64501
_64503_Routes qui passent par 64503
_64503$Routes nées dans 64503
.*Tout

(_ remplace un séparateur : espace, début ou fin.)

Appliquer un changement de filtre sans couper la session

! redemande les routes (ROUTE-REFRESH)
clear ip bgp 10.0.11.1 soft in
! renvoie nos annonces
clear ip bgp 10.0.11.1 soft out
! JAMAIS « clear ip bgp * » en production : coupe toutes les sessions

10. Agrégation et communautés

Agrégation (résumé de routes)

router bgp 64500
 network 203.0.113.0 mask 255.255.255.128
 network 203.0.113.128 mask 255.255.255.128
 ! n'annonce QUE le /24
 aggregate-address 203.0.113.0 255.255.255.0 summary-only

summary-only supprime les sous-réseaux (marqués s dans la table). Sans lui, on annonce le /24 et les deux /25.

Les communautés : des étiquettes sur les routes

Une communauté est un nombre ASN:valeur collé à une route. Les opérateurs publient la liste des communautés qu’ils comprennent (« si tu mets 174:3001, je n’annonce pas ta route en Europe »).

CommunautéValeurEffet
NO_EXPORT65535:65281Ne pas annoncer hors de l’AS qui la reçoit
NO_ADVERTISE65535:65282Ne l’annoncer à aucun voisin
BLACKHOLE65535:666Demander à l’opérateur de jeter le trafic vers ce préfixe (contre un DDoS : RTBH)
Large community64500:1:20Format à 3 nombres, pour les ASN 32 bits
! afficher sous forme ASN:valeur
ip bgp-community new-format
route-map MARQUER permit 10
 set community 64500:100
router bgp 64500
 ! les communautés ne sont PAS envoyées par défaut chez Cisco
 neighbor 2.2.2.2 send-community
 neighbor 2.2.2.2 route-map MARQUER out

11. Influencer le trafic (multihoming)

ConfigurationDescription
Single-homedUn seul lien, un seul opérateur : une route statique suffit, pas besoin de BGP
Dual-homedDeux liens vers le même opérateur
MultihomedLiens vers plusieurs opérateurs : redondance + choix des chemins → BGP obligatoire

On contrôle facilement le trafic sortant (c’est nous qui choisissons), beaucoup moins le trafic entrant (ce sont les autres AS qui choisissent : on ne peut que les influencer).

ButOutilComment
Sortir de préférence par ISP1LOCAL_PREFMettre 200 sur les routes reçues d’ISP1 (défaut 100)
Ce routeur seul préfère un voisinWEIGHTneighbor X weight 100 (Cisco, local)
Faire entrer le trafic par ISP1AS-path prependRallonger artificiellement le chemin annoncé à ISP2
Entrée : choisir entre 2 liens vers le même opérateurMEDMED bas sur le lien préféré
Entrée, méthode fortePréfixes plus précisAnnoncer 2 × /25… impossible sur Internet (filtré) : annoncer le /24 partout + des /24 séparés si on a un /23
Entrée, finesseCommunautés de l’opérateurSelon la documentation de l’opérateur

ISP1 = lien principal, ISP2 = secours

! Sortie : préférer ISP1 (sur R1, routes reçues d'ISP1 → local-pref 200, propagée à tout l'AS en iBGP)
route-map DEPUIS-ISP1 permit 10
 set local-preference 200
router bgp 64500
 neighbor 10.0.11.1 route-map DEPUIS-ISP1 in
 
! Entrée : décourager ISP2 (sur R2, notre bloc annoncé à ISP2 avec 3 fois notre ASN)
! (elle remplace VERS-OPERATEURS sur R2 : un voisin n'a qu'UNE route-map « out », donc on garde les mêmes « match »)
route-map VERS-ISP2 permit 10
 match ip address prefix-list MES-PREFIXES
 match as-path 1
 set as-path prepend 64500 64500 64500
router bgp 64500
 neighbor 10.0.22.1 route-map VERS-ISP2 out
Vu de l'extérieur après le prepend :
   via ISP1 : AS_PATH = 64501 64500                       (2 AS)
   via ISP2 : AS_PATH = 64502 64500 64500 64500 64500     (5 AS)
   → le reste d'Internet préfère passer par ISP1 ; ISP2 ne sert que si ISP1 tombe

12. iBGP à grande échelle (route reflectors)

Le full mesh devient ingérable : 50 routeurs = 1 225 sessions. Solution : le route reflector (RR), autorisé à réfléchir les routes iBGP vers ses clients.

flowchart TB
  RR1["Route reflector 1"] <--> RR2["Route reflector 2<br/>(redondance)"]
  RR1 --> C1["Client"] & C2["Client"] & C3["Client"]
  RR2 --> C1 & C2 & C3
! sur le route reflector uniquement
router bgp 64500
 neighbor 10.255.0.11 remote-as 64500
 neighbor 10.255.0.11 update-source Loopback0
 neighbor 10.255.0.11 route-reflector-client

Les clients n’ont qu’une session (deux pour la redondance) vers les RR. Les attributs ORIGINATOR_ID et CLUSTER_LIST empêchent les boucles entre réflecteurs. Autre solution, plus rare : les confédérations (découper l’AS en sous-AS privés).


13. BGP et IPv6 (MP-BGP)

BGP « multiprotocole » (RFC 4760) transporte d’autres familles d’adresses dans la même session : IPv6, VPN MPLS (VPNv4, voir P11 - Routage avancé (BGP, EIGRP, MPLS)), EVPN (datacenters).

! activer le routage IPv6 sur le routeur (désactivé par défaut)
ipv6 unicast-routing
router bgp 64500
 neighbor 2001:db8:11::1 remote-as 64501
 address-family ipv6 unicast
  ! obligatoire : une famille n'est active qu'à la demande
  neighbor 2001:db8:11::1 activate
  network 2001:db8:500::/48
 exit-address-family
! ancre, comme en IPv4
ipv6 route 2001:db8:500::/48 Null0
! vérifier (« do » permet une commande show depuis le mode configuration)
do show bgp ipv6 unicast summary
do show bgp ipv6 unicast

Préfixes à refuser en IPv6 (extrait) : ::/8, 2001:db8::/32 (documentation), fc00::/7 (adresses privées ULA), fe80::/10 (lien local), ff00::/8 (multicast), et tout ce qui est plus précis qu’un /48. Le cours de lidstah donne une liste complète prête à l’emploi : cours de lidstah.


14. Sécurité de BGP

BGP a été conçu en 1989 sur la confiance : par défaut, un routeur croit ce que ses voisins lui annoncent. D’où des incidents célèbres :

DateIncidentCause
Février 2008YouTube inaccessible dans le monde pendant environ deux heuresPakistan Telecom, chargé de bloquer YouTube dans le pays, annonce par erreur à l’extérieur un préfixe plus précis que celui de YouTube (détournement, hijack)
Avril 2018Vol de cryptomonnaie (MyEtherWallet)Détournement volontaire de préfixes d’Amazon Route 53 pour répondre de faux DNS
Juin 2019Une partie d’Internet (Cloudflare, etc.) dégradéeFuite de routes (route leak) : un petit AS réannonce les routes d’un fournisseur à un autre, sans filtre
Octobre 2021Facebook, Instagram et WhatsApp hors ligne pendant environ six heuresUne erreur de configuration retire les annonces BGP vers leurs propres serveurs DNS
Type de problèmeDescription
Détournement (hijack)Annoncer un préfixe qui ne nous appartient pas (souvent plus précis)
Fuite (route leak)Réannoncer des routes à qui on ne devrait pas (devenir transitaire par erreur)
Usurpation de sessionInjecter de faux messages dans une session TCP

Les protections

ProtectionRôleConfiguration
Filtrage par préfixesN’accepter de ses clients que leurs préfixes, n’annoncer que les siensprefix-list (§ 9)
maximum-prefixCouper la session si le voisin envoie trop de routesneighbor X maximum-prefix N
Mot de passe MD5Signer les segments TCP de la sessionneighbor X password ... (successeur moderne : TCP-AO)
GTSM (sécurité TTL)N’accepter que des paquets ayant un TTL de 254 ou plus : un attaquant éloigné ne peut pas l’atteindreneighbor X ttl-security hops 1
IRRBases publiques (RIPE DB, RADB) où chacun déclare quels préfixes son AS a le droit d’annoncer (objets route)Les opérateurs génèrent leurs filtres avec bgpq4
RPKI / ROACertificats cryptographiques : le titulaire d’un bloc signe une ROA « ce préfixe peut être annoncé par tel AS, jusqu’à telle longueur »Créée dans le portail du RIR (RIPE)
ROV (Route Origin Validation)Chaque routeur vérifie l’AS d’origine contre les ROA : valid, invalid (rejetée), not-foundUn validateur (Routinator, rpki-client) + rpki sur le routeur
ASPAExtension en cours de déploiement : vérifier aussi les relations client/fournisseur dans l’AS_PATHEncore récent
MANRSEngagement public des opérateurs à appliquer ces bonnes pratiques-
flowchart LR
  T["Titulaire du bloc<br/>203.0.113.0/24"] -->|"signe une ROA :<br/>origine AS 64500, max /24"| RIPE["RIPE NCC<br/>(dépôt RPKI)"]
  RIPE --> V["Validateur RPKI<br/>(Routinator)"]
  V -->|"liste valide"| R["Routeur BGP"]
  A["Attaquant AS 666<br/>annonce 203.0.113.0/25"] -->|"UPDATE"| R
  R -->|"origine 666 ≠ 64500<br/>et /25 > max /24"| X["❌ INVALID, rejetée"]

15. BGP sous Linux avec FRRouting

FRRouting (FRR) est la suite de routage libre la plus utilisée (successeur de Quagga cité par lidstah). Sa console vtysh a une syntaxe très proche de Cisco. Elle fait tourner le réseau de Proxmox SDN (EVPN), de nombreux datacenters et de petits opérateurs. Autre logiciel courant : BIRD (route servers des IXP).

Labo : deux VM Debian, deux AS

   VM « as65001 »                          VM « as65002 »
   LAN fictif 10.1.0.0/24 (dummy0)         LAN fictif 10.2.0.0/24 (dummy0)
   ens19 : 172.31.12.1/30  ─────────────── ens19 : 172.31.12.2/30

Sur les deux VM :

sudo apt install frr
# activer le démon BGP
sudo sed -i 's/^bgpd=no/bgpd=yes/' /etc/frr/daemons
sudo systemctl restart frr
# activer le routage IP
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/90-routage.conf && sudo sysctl --system
# un « LAN » fictif à annoncer (sur as65002 : 10.2.0.1/24)
sudo ip link add dummy0 type dummy && sudo ip addr add 10.1.0.1/24 dev dummy0 && sudo ip link set dummy0 up
sudo vtysh

Dans vtysh sur as65001 :

configure terminal
router bgp 65001
 bgp router-id 10.1.0.1
 neighbor 172.31.12.2 remote-as 65002
 address-family ipv4 unicast
  network 10.1.0.0/24
  neighbor 172.31.12.2 route-map TOUT in
  neighbor 172.31.12.2 route-map MES-RESEAUX out
 exit-address-family
exit
ip prefix-list MES-RESEAUX seq 5 permit 10.1.0.0/24
route-map MES-RESEAUX permit 10
 match ip address prefix-list MES-RESEAUX
exit
route-map TOUT permit 10
exit
end
write memory

(Sur as65002 : mêmes commandes avec 65002, 172.31.12.1 et 10.2.0.0/24.)

Le piège n°1 de FRR : la RFC 8212

Depuis FRR 7.x, une session eBGP sans route-map en entrée et en sortie n’échange aucune route (sécurité par défaut). La session est Established mais affiche (Policy) et 0 préfixe. Solution : des route-maps comme ci-dessus, ou en labo seulement no bgp ebgp-requires-policy.

Vérifier :

sudo vtysh -c "show bgp summary"
sudo vtysh -c "show bgp ipv4 unicast"
sudo vtysh -c "show ip route bgp"
ip route | grep bgp              # la route est installée dans le noyau Linux
ping -I 10.1.0.1 10.2.0.1        # de LAN à LAN

16. BGP ailleurs qu’entre opérateurs

UsageExemple
DatacentersChaque switch a son ASN privé, BGP remplace OSPF (BGP unnumbered, RFC 7938), EVPN-VXLAN pour étendre des réseaux de niveau 2
Proxmox SDNLes zones EVPN utilisent FRR et BGP entre les nœuds du cluster (V06 - Proxmox VE)
KubernetesMetalLB (mode BGP) annonce les IP des services au routeur ; Calico et Cilium routent les pods en BGP (P19 - Kubernetes)
AnycastLa même IP annoncée depuis plusieurs lieux : le trafic va au plus proche (serveurs DNS racine, 1.1.1.1, 8.8.8.8)
VPN MPLSMP-BGP transporte les routes des clients (VPNv4) chez les opérateurs (P11 - Routage avancé (BGP, EIGRP, MPLS))
SD-WANBeaucoup de solutions s’appuient sur BGP avec des ASN privés (P12 - SD-WAN (OpenZiti))
Anti-DDoSRTBH (communauté BLACKHOLE) et FlowSpec (BGP diffuse des règles de filtrage)

17. Outils pour observer Internet

OutilCe qu’on y trouve
bgp.he.net (Hurricane Electric)Fiche de chaque AS : préfixes, voisins, IXP
bgp.toolsMême chose, très à jour, graphes de voisinage
RIPEstat (stat.ripe.net)Historique des annonces, visibilité, statut RPKI
PeeringDBOù chaque réseau est présent (IXP, datacenters), politique de peering
Looking glassInterfaces web pour lancer show ip bgp sur les routeurs d’un opérateur
isbgpsafeyet.comTeste si ton FAI rejette les routes RPKI invalides
whoisInfos d’un AS ou d’un bloc
whois AS16276                        # OVH
whois -h whois.radb.net AS203432     # objets IRR de FAImaison
whois 51.38.0.0                      # à qui appartient ce bloc
curl -s 'https://stat.ripe.net/data/prefix-overview/data.json?resource=8.8.8.8' | python3 -m json.tool | head -30   # qui annonce cette IP

18. Aide-mémoire des commandes

ActionCisco IOSFRR (vtysh)
Démarrer BGProuter bgp ASNrouter bgp ASN
Identifiantbgp router-id X.X.X.Xidem
Déclarer un voisinneighbor IP remote-as ASNidem
Source loopback (iBGP)neighbor IP update-source Loopback0neighbor IP update-source lo
eBGP non directneighbor IP ebgp-multihop 2idem
Next hopneighbor IP next-hop-selfidem (dans l’address-family)
Annoncernetwork A.B.C.D mask M.M.M.Mnetwork A.B.C.D/LL (dans l’address-family)
Agrégeraggregate-address A.B.C.D M.M.M.M summary-onlyaggregate-address A.B.C.D/LL summary-only
Filtrerneighbor IP prefix-list NOM in/outidem
Politiqueneighbor IP route-map NOM in/outidem
MD5neighbor IP password MDPidem
Limiteneighbor IP maximum-prefix Nidem
Couper un voisinneighbor IP shutdownidem
Résuméshow ip bgp summaryshow bgp summary
Table BGPshow ip bgpshow bgp ipv4 unicast
Un préfixe en détailshow ip bgp A.B.C.Dshow bgp ipv4 unicast A.B.C.D
Ce qu’on annonceshow ip bgp neighbors IP advertised-routesshow bgp neighbors IP advertised-routes
Ce qu’on reçoit (après filtre)show ip bgp neighbors IP routesshow bgp neighbors IP routes
Routes installéesshow ip route bgpshow ip route bgp
Recharger sans couperclear ip bgp IP soft inclear bgp IP soft in
Journauxdebug ip bgp updates (labo uniquement)debug bgp updates

Exercices

1. Ton routeur reçoit 198.51.100.0/24 par deux voisins eBGP. Chemin A : AS_PATH 64501 64510, LOCAL_PREF 100. Chemin B : AS_PATH 64502 64520 64510, LOCAL_PREF 150. Lequel est choisi ?

2. Que correspond à ip prefix-list X permit 172.16.0.0/12 ge 20 le 24 ? Les préfixes 172.16.0.0/12, 172.20.8.0/22, 172.31.5.0/24 et 172.16.1.128/25 passent-ils ?

3. Ta session iBGP entre loopbacks reste en état Active alors que ping 2.2.2.2 fonctionne. Cause la plus probable ?

4. R2 reçoit en iBGP la route 8.8.1.1/32 avec le next hop 10.0.11.1, sans étoile * devant. Pourquoi, et comment corriger ?

5. Tu as deux opérateurs. Tu veux que le trafic entrant arrive par ISP1, et ISP2 seulement en secours. Quel outil, sur quel routeur, dans quel sens ?

6. Pourquoi un AS d’entreprise multihomé doit-il filtrer ses annonces en sortie, même s’il n’annonce « rien de spécial » ?

7. Quelle est la différence entre un détournement de préfixe et une fuite de routes ? Quel mécanisme protège contre le premier ?

8. Sous FRR, la session eBGP est Established, mais show bgp summary affiche (Policy) et 0 préfixe. Que se passe-t-il ?


Erreurs fréquentes / dépannage

flowchart TD
  A["show ip bgp summary"] --> B{"Session Established ?<br/>(un nombre dans State/PfxRcd)"}
  B -->|"Idle / Active / Connect"| C["Problème de session :<br/>ping de l'IP voisine, TCP 179,<br/>remote-as, update-source,<br/>ebgp-multihop, mot de passe"]
  B -->|"Oui, 0 préfixe reçu"| D["Le voisin n'annonce rien<br/>ou mon filtre « in » bloque :<br/>show ip bgp neighbors X routes"]
  B -->|"Oui, préfixes reçus"| E{"La route est-elle<br/>dans show ip bgp avec * > ?"}
  E -->|"pas de *"| F["Next hop injoignable :<br/>next-hop-self / IGP"]
  E -->|"r (RIB-failure)"| G["Une route statique ou OSPF<br/>plus fiable existe déjà"]
  E -->|"* > oui"| H["Vérifier show ip route,<br/>puis le chemin retour<br/>chez l'autre AS"]
SymptômeCause probableCorrection
Voisin en Idleneighbor shutdown, pas de route vers le voisin, maximum-prefix dépasséshow ip bgp neighbors IP, lire « Last reset »
Voisin en Active en boucleMauvaise IP, TCP 179 filtré, update-source manquant, eBGP entre loopbacks sans ebgp-multihopCorriger, puis clear ip bgp IP
Message « BGP notification: … bad AS »remote-as faux d’un côtéVérifier les ASN des deux côtés
« MD5 authentication failed » dans les logsMot de passe différentRetaper le même des deux côtés
Mon réseau n’est pas annoncénetwork avec un masque différent de la table de routageRoute Null0 exacte, ou corriger le masque
Routes iBGP non propagées à un 3ᵉ routeurRègle de split horizon iBGPFull mesh ou route reflector
Route reçue mais pas installéeNext hop injoignable, ou RIB-failurenext-hop-self, vérifier les autres routes
Asymétrie : ça part mais ça ne revient pasL’autre AS ne connaît pas ton préfixe (filtre chez lui, IRR/ROA absents)show ip bgp neighbors X advertised-routes, looking glass
Changement de filtre sans effetFiltre appliqué mais routes pas redemandéesclear ip bgp IP soft in
FRR : (Policy)RFC 8212Ajouter des route-maps in/out

Voir aussi