🗺️ Policy-Based Routing

PBR — Policy-Based Routing

Routage basé sur des politiques plutôt que sur la seule destination. Source IP, protocole, taille de paquet — PBR court-circuite la table de routage pour forcer un chemin spécifique vers un prochain saut.

📖 Concepts
🖧 Topologie
⚙️ Config de base
📡 IP SLA & Failover
🏠 Local PBR
🔍 Vérification
⚠️ Pièges CCIE
🃏 Flash Cards

Qu'est-ce que PBR ?

Par défaut, IOS route chaque paquet uniquement en fonction de son adresse destination (table de routage). PBR permet de router selon d'autres critères : adresse source, protocole, port TCP/UDP, ou taille du paquet. La décision est prise avant la consultation de la table de routage.

Règle fondamentale : PBR s'applique en entrée (inbound) sur l'interface où le trafic arrive. Il est traité avant la lookup de routage normal.

Flux de décision avec PBR

Ordre de traitement d'un paquet entrant :
📥 Paquet reçu sur Gi0/0
🗺️ PBR — ip policy route-map appliqué ?
OUI — match
set ip next-hop → forwarding direct
NON — no match
Lookup table de routage normale
Forwarding classique

Critères de match disponibles

Commande matchCe qu'elle filtreRemarque
match ip address <ACL>Source IP, destination IP, protocole, portACL étendue recommandée
match length <min> <max>Taille du paquet (bytes)Utile pour séparer VoIP / data
match ip address prefix-listPréfixe source ou destinationAvec match ip address

Actions set disponibles

Commande setComportementPriorité
set ip next-hop <IP>Forcer ce NH toujours, même si la table de routage a mieux🔴 Prioritaire sur la table de routage
set ip default next-hop <IP>Utiliser ce NH seulement si aucune route dans la table🟡 Fallback uniquement
set interface <int>Forcer l'interface de sortie🔴 Prioritaire
set default interface <int>Interface de sortie si pas de route🟡 Fallback uniquement
set ip next-hop verify-availabilityVérifier la joignabilité avant de forcer le NH✅ Best practice
set ip dscp / set ip tosMarquer le paquet (QoS)— Marking uniquement
set interface null0Black-hole volontaire🚫 Drop

set ip next-hop vs set ip default next-hop

set ip next-hop 10.0.0.1

  • Toujours utilisé si le paquet matche
  • Court-circuite la table de routage
  • Même si une route spécifique existe dans la table
  • Si le NH est injoignable → drop silencieux sans verify-availability

set ip default next-hop 10.0.0.1

  • Utilisé uniquement si aucune route dans la table de routage
  • La table de routage est consultée en premier
  • Route spécifique dans la table → PBR ignoré
  • Utile pour le routage par défaut PBR-based

PBR et CEF

CEF (Cisco Express Forwarding) est activé par défaut sur IOS moderne. PBR est compatible avec CEF et bénéficie du fast-switching CEF.

no ip route-cache policy sur l'interface désactive CEF pour PBR → traitement en process-switching (lent, uniquement pour debug/test).
Par défaut : CEF-switched PBR = performances optimales.

Cas d'usage classique : Dual-ISP avec PBR

Deux liens ISP. PBR route Branch-A (10.1.1.0/24) via ISP-A et Branch-B (10.2.2.0/24) via ISP-B, indépendamment de la route par défaut de la table de routage.

Branch-A 10.1.1.0/24 Branch-B 10.2.2.0/24 R1 — ASBR ip policy route-map PBR-DUAL-ISP ISP-A NH: 203.0.113.1 ISP-B NH: 198.51.100.1 Gi0/0 10.1.1.1 Gi0/1 10.2.2.1 PBR: Branch-A → ISP-A PBR: Branch-B → ISP-B Gi0/2 Gi0/3 PBR forcé trafic Branch-A trafic Branch-B

Adressage de la topologie

InterfaceAdresseRôle
R1 Gi0/010.1.1.1/24LAN Branch-A — PBR appliqué inbound
R1 Gi0/110.2.2.1/24LAN Branch-B — PBR appliqué inbound
R1 Gi0/2203.0.113.2/30Lien vers ISP-A (NH: 203.0.113.1)
R1 Gi0/3198.51.100.2/30Lien vers ISP-B (NH: 198.51.100.1)
Objectif : Branch-A (10.1.1.0/24) sort systématiquement par ISP-A. Branch-B (10.2.2.0/24) sort par ISP-B. La route par défaut classique (ex. ISP-A) serait ignorée pour Branch-B sans PBR.

Configuration complète — Dual-ISP PBR

Étape 1 — ACLs étendues pour identifier le trafic

! Identifier le trafic venant de Branch-A
ip access-list extended ACL-BRANCH-A
 permit ip 10.1.1.0 0.0.0.255 any

! Identifier le trafic venant de Branch-B
ip access-list extended ACL-BRANCH-B
 permit ip 10.2.2.0 0.0.0.255 any

Étape 2 — Route-map PBR

route-map PBR-DUAL-ISP permit 10
 ! Branch-A → ISP-A
 match ip address ACL-BRANCH-A
 set ip next-hop 203.0.113.1

route-map PBR-DUAL-ISP permit 20
 ! Branch-B → ISP-B
 match ip address ACL-BRANCH-B
 set ip next-hop 198.51.100.1

! Clause implicite deny → trafic non matché → table de routage normale

Étape 3 — Application sur les interfaces LAN (inbound)

interface GigabitEthernet0/0
 ! LAN Branch-A
 ip address 10.1.1.1 255.255.255.0
 ip policy route-map PBR-DUAL-ISP

interface GigabitEthernet0/1
 ! LAN Branch-B
 ip address 10.2.2.1 255.255.255.0
 ip policy route-map PBR-DUAL-ISP
⚠️ INBOUND seulement ! ip policy route-map ne s'applique qu'au trafic entrant sur l'interface. Ne pas confondre avec ip route-map outbound des redistribution.

Cas d'usage : PBR par taille de paquet (VoIP vs Data)

Séparer les petits paquets VoIP (typiquement < 300 bytes) du trafic data bulk pour les envoyer sur deux chemins différents :

route-map PBR-VOIP permit 10
 ! Petits paquets = VoIP → lien MPLS faible latence
 match length 0 300
 set ip next-hop 10.0.0.1

route-map PBR-VOIP permit 20
 ! Gros paquets = data → lien Internet
 match length 301 9000
 set ip next-hop 10.0.1.1

Cas d'usage : Marquage QoS via PBR

route-map PBR-MARK permit 10
 match ip address ACL-VOIP
 set ip dscp ef          ! DSCP 46 — Expedited Forwarding
 ! Pas de set next-hop → juste marquage, table de routage normale ensuite

interface GigabitEthernet0/0
 ip policy route-map PBR-MARK

Problème avec set ip next-hop simple

Sans verify-availability : si ISP-A (203.0.113.1) tombe, PBR continue d'envoyer le trafic Branch-A vers ce NH mort → blackhole silencieux. Le trafic disparaît sans aucune alerte.

Solution : set ip next-hop verify-availability + IP SLA

PBR vérifie l'état d'un objet track avant d'utiliser le next-hop. Si l'objet est DOWN → PBR passe au NH suivant (séquence), ou laisse la table de routage décider.

Étape 1 — Configurer IP SLA

! SLA 1 : surveiller ISP-A
ip sla 1
 icmp-echo 203.0.113.1 source-interface GigabitEthernet0/2
 frequency 10          ! probe toutes les 10 secondes
ip sla schedule 1 life forever start-time now

! SLA 2 : surveiller ISP-B
ip sla 2
 icmp-echo 198.51.100.1 source-interface GigabitEthernet0/3
 frequency 10
ip sla schedule 2 life forever start-time now

Étape 2 — Créer les objets track

track 1 ip sla 1 reachability
track 2 ip sla 2 reachability

Étape 3 — Route-map avec verify-availability

route-map PBR-DUAL-ISP permit 10
 match ip address ACL-BRANCH-A
 ! NH primaire : ISP-A si track 1 UP
 set ip next-hop verify-availability 203.0.113.1 1 track 1
 ! NH secondaire : ISP-B si track 1 DOWN
 set ip next-hop verify-availability 198.51.100.1 2 track 2

route-map PBR-DUAL-ISP permit 20
 match ip address ACL-BRANCH-B
 set ip next-hop verify-availability 198.51.100.1 1 track 2
 set ip next-hop verify-availability 203.0.113.1 2 track 1
Logique de séquence : le chiffre après l'IP (1, 2…) est la séquence de préférence. PBR essaie séquence 1 en premier. Si le track associé est DOWN → il essaie séquence 2. Si tous DOWN → table de routage normale.

Syntaxe détaillée de verify-availability

set ip next-hop verify-availability <next-hop-ip> <sequence> track <track-id>

   ├── next-hop-ip : l'adresse du prochain saut
   ├── sequence    : ordre de préférence (1 = premier essai)
   └── track-id    : objet track à surveiller (ip sla ou interface)

Vérifier l'état IP SLA et tracking

! État des probes IP SLA
R1# show ip sla statistics
Round Trip Time (RTT) for       Index 1
        Latest RTT: 2 milliseconds
Latest operation start time: *20:14:33.123 UTC
Latest operation return code: OK            ← ISP-A joignable

! État des objets track
R1# show track
Track 1
  IP SLA 1 reachability
  Reachability is Up              ← track 1 UP → ISP-A utilisé
    1 change, last change 00:15:42
Track 2
  IP SLA 2 reachability
  Reachability is Down            ← track 2 DOWN → ISP-B KO

Qu'est-ce que Local PBR ?

PBR standard (via ip policy route-map) s'applique au trafic transit — les paquets qui arrivent sur une interface et doivent être forwardés. Il ne touche pas au trafic généré par le routeur lui-même (Telnet, SSH, BGP updates, pings locaux, SNMP…).

Local PBR permet d'appliquer une policy sur ce trafic local.

Différence clé :
ip policy route-map → sur une interface → trafic transit entrant
ip local policy route-map → global → trafic généré par le routeur

Cas d'usage : forcer le trafic de management

Le routeur a deux ISP. On veut que les pings, SSH sortants, et BGP updates issus du routeur utilisent toujours ISP-A, quelle que soit la route par défaut.

! ACL identifiant le trafic local (source = loopback du routeur)
ip access-list extended ACL-LOCAL-MGMT
 permit ip host 192.168.100.1 any  ! loopback0 du routeur

route-map LOCAL-PBR permit 10
 match ip address ACL-LOCAL-MGMT
 set ip next-hop 203.0.113.1      ! toujours via ISP-A

! Application globale (pas sur une interface !)
ip local policy route-map LOCAL-PBR

Cas d'usage : BGP update-source + Local PBR

Quand BGP utilise une loopback comme update-source, les paquets TCP/179 sont générés localement. Local PBR peut forcer leur chemin de sortie si nécessaire (ex. réseau sans IGP pour résoudre la loopback).

ip access-list extended ACL-BGP-LOCAL
 permit tcp any any eq 179
 permit tcp any eq 179 any

route-map LOCAL-BGP-PBR permit 10
 match ip address ACL-BGP-LOCAL
 set ip next-hop 10.0.0.1

ip local policy route-map LOCAL-BGP-PBR

Comparaison PBR interface vs Local PBR

CritèrePBR interfaceLocal PBR
Commande d'applicationip policy route-map sur interfaceip local policy route-map (global)
Trafic concernéTransit entrant sur l'interfaceGénéré par le routeur lui-même
DirectionInbound sur interfaceOutput path du routeur
ExemplesPC → Internet via R1ping R1, BGP update, SSH sortant
Nombre de route-mapsUne par interfaceUne seule, globale
Piège : appliquer ip policy route-map sur l'interface ne suffit pas pour le trafic local. Il faut impérativement ip local policy route-map en complément si le routeur génère du trafic à controller.

Commandes de vérification

SHOW show ip policy

Liste toutes les interfaces avec une policy PBR active et le nom de la route-map associée.

R1# show ip policy

Interface         Route map
Gi0/0             PBR-DUAL-ISP    ← PBR actif sur Gi0/0
Gi0/1             PBR-DUAL-ISP    ← PBR actif sur Gi0/1
local             LOCAL-PBR       ← Local PBR si configuré
SHOW show route-map [nom]

Affiche les clauses de la route-map et les hit counts par clause — essentiel pour vérifier que PBR match bien le trafic attendu.

R1# show route-map PBR-DUAL-ISP

route-map PBR-DUAL-ISP, permit, sequence 10
  Match clauses:
    ip address (access-lists): ACL-BRANCH-A
  Set clauses:
    ip next-hop verify-availability 203.0.113.1 1 track 1  [up]
    ip next-hop verify-availability 198.51.100.1 2 track 2 [down]
  Policy routing matches: 1247 packets, 156840 bytes   ← trafic matché

route-map PBR-DUAL-ISP, permit, sequence 20
  Match clauses:
    ip address (access-lists): ACL-BRANCH-B
  Set clauses:
    ip next-hop verify-availability 198.51.100.1 1 track 2 [down]
    ip next-hop verify-availability 203.0.113.1 2 track 1  [up]
  Policy routing matches: 892 packets, 89200 bytes
DEBUG debug ip policy

Trace paquet par paquet les décisions PBR. Attention : très verbeux en production, utiliser avec un ACL de filtre.

R1# debug ip policy

! Exemple de sortie
IP: s=10.1.1.10 (Gi0/0), d=8.8.8.8, len 60, policy match
IP: route map PBR-DUAL-ISP, item 10, permit
IP: s=10.1.1.10 (Gi0/0), d=8.8.8.8, g=203.0.113.1, PBR forward

! Si track DOWN → no match → table de routage
IP: s=10.1.1.10 (Gi0/0), d=8.8.8.8, len 60, policy rejected
IP: s=10.1.1.10 (Gi0/0), d=8.8.8.8, normal forwarding

R1# undebug all   ! toujours désactiver après usage
SHOW Vérifier IP SLA et Track
! Statistiques IP SLA
R1# show ip sla statistics

! Résumé IP SLA
R1# show ip sla summary

! État des objets track
R1# show track
R1# show track brief

! Historique des changements d'état
R1# show track 1

Checklist de troubleshooting PBR

SymptômeVérificationCause probable
PBR inactifshow ip policyroute-map non appliquée sur l'interface
0 packets dans show route-mapTester avec debug ip policyACL ne matche pas le trafic (source IP ?)
Trafic blackholéshow trackverify-availability : tracks tous DOWN
PBR ignoréVérifier sens inboundroute-map appliquée mauvaise interface
NH injoignableshow ip route 203.0.113.1NH pas dans réseau directement connecté

Pièges classiques CCIE

1

PBR s'applique INBOUND — jamais outbound

ip policy route-map ne s'applique qu'au trafic entrant sur l'interface. Le trafic sortant (généré ou forwardé vers cette interface) n'est pas affecté. Erreur classique : appliquer PBR sur l'interface WAN sortante.

! ❌ INCORRECT — appliqué sur Gi0/2 (lien ISP sortant)
interface GigabitEthernet0/2
 ip policy route-map PBR-DUAL-ISP   ← aucun effet sur trafic sortant

! ✅ CORRECT — appliqué sur Gi0/0 (LAN entrant)
interface GigabitEthernet0/0
 ip policy route-map PBR-DUAL-ISP
2

set ip next-hop : NH doit être directement joignable

PBR nécessite que le next-hop soit dans un réseau directement connecté. Si le NH est appris via IGP/BGP → PBR ne peut pas l'utiliser et peut blackholer le trafic.

! R1 Gi0/2 = 203.0.113.2/30 → NH 203.0.113.1 est directement connecté ✅
set ip next-hop 203.0.113.1     ← OK

! Si 10.0.5.1 est appris via OSPF et pas directement connecté
set ip next-hop 10.0.5.1        ← peut échouer silencieusement
3

Sans verify-availability : NH mort = blackhole silencieux

Si le next-hop tombe et qu'il n'y a pas de verify-availability, PBR continue d'envoyer le trafic vers ce NH → paquets droppés sans aucune notification. Toujours coupler avec IP SLA en production.

! ❌ Dangereux en production
set ip next-hop 203.0.113.1

! ✅ Best practice
set ip next-hop verify-availability 203.0.113.1 1 track 1
4

Route-map sans match = toutes routes matchent

Une clause permit sans aucun match dans une route-map de PBR matche tous les paquets. Erreur fréquente quand on oublie d'ajouter le match ip address.

! ❌ Matche TOUT le trafic entrant — comportement inattendu
route-map PBR-MAP permit 10
 set ip next-hop 203.0.113.1    ← pas de match → tout est redirigé !

! ✅ Correct
route-map PBR-MAP permit 10
 match ip address ACL-BRANCH-A
 set ip next-hop 203.0.113.1
5

Local PBR ≠ PBR interface

Le trafic généré par le routeur (BGP, ping local, SSH sortant) n'est pas affecté par ip policy route-map sur les interfaces. Il faut ip local policy route-map séparément.

! ❌ N'affecte pas le trafic BGP/SSH/ping du routeur lui-même
interface Gi0/0
 ip policy route-map MON-PBR

! ✅ Pour le trafic généré localement
ip local policy route-map MON-PBR-LOCAL
6

set ip next-hop vs set ip default next-hop — confusion CCIE

Question d'examen classique : si une route spécifique existe dans la table de routage, set ip default next-hop l'utilise et ignore PBR. set ip next-hop court-circuite la table de routage dans tous les cas.

! Route 8.8.8.0/24 via OSPF existe dans la table

set ip next-hop 203.0.113.1        → 203.0.113.1 utilisé (PBR prioritaire) ✅
set ip default next-hop 203.0.113.1 → OSPF route utilisée (table de routage gagne) ⚠️
7

ACL standard dans match ip address — seulement source

Avec une ACL standard dans match ip address, seule l'adresse source est comparée. Pour filtrer sur source + destination + port → utiliser une ACL étendue.

Flash Cards — PBR

Cliquez sur une carte pour révéler la réponse.

Direction
PBR s'applique dans quel sens ?
inbound ou outbound ?
INBOUND
ip policy route-map sur l'interface où le trafic entre. Jamais outbound sur l'interface de sortie.
Commande
Appliquer PBR sur interface
syntaxe IOS
ip policy route-map <nom>
En mode interface. Applique la route-map au trafic entrant sur cette interface.
Différence
next-hop vs default next-hop
priorité vs fallback ?
next-hop = prioritaire
default = fallback
set ip next-hop → override la table de routage.
set ip default next-hop → utilisé uniquement si aucune route dans la table.
Sécurité
NH mort sans verify-availability → ?
Blackhole silencieux
PBR continue d'envoyer vers un NH injoignable. Pas d'erreur visible. Toujours coupler avec IP SLA + verify-availability.
Local PBR
Commande global pour trafic local
différente de l'interface
ip local policy route-map
Appliqué en config globale (pas sur une interface). Affecte uniquement le trafic généré par le routeur lui-même (BGP, SSH, ping…).
Vérification
Afficher les interfaces PBR + hit counts
show ip policy
show route-map
show ip policy → interfaces actives.
show route-map <nom> → clauses + nombre de paquets matchés.
match
Critère match par taille de paquet
match length <min> <max>
Filtre les paquets selon leur taille en bytes. Utile pour séparer VoIP (petits paquets) du trafic data (gros paquets).
Debug
Tracer les décisions PBR paquet par paquet
debug ip policy
Très verbeux — utiliser avec un ACL de filtre ou sur un trafic limité. undebug all pour désactiver.
verify-availability
Syntaxe complète avec track
set ip next-hop verify-availability
<IP> <seq> track <id>
Seq = ordre de préférence. PBR essaie seq 1, puis 2 si DOWN. Si tous DOWN → table de routage.
CEF
PBR sans CEF → quel mode ?
Process switching
no ip route-cache policy sur l'interface = PBR en process switching (lent). Par défaut : CEF-switched PBR. Ne désactiver qu'en debug.
Piège
Route-map permit sans match → ?
Matche TOUT le trafic
Un permit sans match = wildcard. Tout le trafic entrant est redirigé vers le next-hop du set. Toujours ajouter un match ip address.
Black-hole
Dropper volontairement du trafic avec PBR
set interface null0
PBR redirige le trafic matché vers Null0 → drop immédiat. Utile pour mitigation DoS basée sur source IP.