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.
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.
| Commande match | Ce qu'elle filtre | Remarque |
|---|---|---|
match ip address <ACL> | Source IP, destination IP, protocole, port | ACL étendue recommandée |
match length <min> <max> | Taille du paquet (bytes) | Utile pour séparer VoIP / data |
match ip address prefix-list | Préfixe source ou destination | Avec match ip address |
| Commande set | Comportement | Priorité |
|---|---|---|
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-availability | Vérifier la joignabilité avant de forcer le NH | ✅ Best practice |
set ip dscp / set ip tos | Marquer le paquet (QoS) | — Marking uniquement |
set interface null0 | Black-hole volontaire | 🚫 Drop |
verify-availabilityno ip route-cache policy sur l'interface désactive CEF pour PBR → traitement en process-switching (lent, uniquement pour debug/test).
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.
| Interface | Adresse | Rôle |
|---|---|---|
R1 Gi0/0 | 10.1.1.1/24 | LAN Branch-A — PBR appliqué inbound |
R1 Gi0/1 | 10.2.2.1/24 | LAN Branch-B — PBR appliqué inbound |
R1 Gi0/2 | 203.0.113.2/30 | Lien vers ISP-A (NH: 203.0.113.1) |
R1 Gi0/3 | 198.51.100.2/30 | Lien vers ISP-B (NH: 198.51.100.1) |
! 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
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
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
ip policy route-map ne s'applique qu'au trafic entrant sur l'interface. Ne pas confondre avec ip route-map outbound des redistribution.
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
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
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.
! 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
track 1 ip sla 1 reachability track 2 ip sla 2 reachability
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
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)! É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
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.
ip policy route-map → sur une interface → trafic transit entrantip local policy route-map → global → trafic généré par le routeur
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
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
| Critère | PBR interface | Local PBR |
|---|---|---|
| Commande d'application | ip policy route-map sur interface | ip local policy route-map (global) |
| Trafic concerné | Transit entrant sur l'interface | Généré par le routeur lui-même |
| Direction | Inbound sur interface | Output path du routeur |
| Exemples | PC → Internet via R1 | ping R1, BGP update, SSH sortant |
| Nombre de route-maps | Une par interface | Une seule, globale |
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.
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é
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
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
! 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
| Symptôme | Vérification | Cause probable |
|---|---|---|
| PBR inactif | show ip policy | route-map non appliquée sur l'interface |
| 0 packets dans show route-map | Tester avec debug ip policy | ACL ne matche pas le trafic (source IP ?) |
| Trafic blackholé | show track | verify-availability : tracks tous DOWN |
| PBR ignoré | Vérifier sens inbound | route-map appliquée mauvaise interface |
| NH injoignable | show ip route 203.0.113.1 | NH pas dans réseau directement connecté |
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
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
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
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
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
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) ⚠️
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.
Cliquez sur une carte pour révéler la réponse.
ip policy route-map sur l'interface où le trafic entre. Jamais outbound sur l'interface de sortie.set ip next-hop → override la table de routage.set ip default next-hop → utilisé uniquement si aucune route dans la table.show ip policy → interfaces actives.show route-map <nom> → clauses + nombre de paquets matchés.undebug all pour désactiver.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.permit sans match = wildcard. Tout le trafic entrant est redirigé vers le next-hop du set. Toujours ajouter un match ip address.