BGP – Path Selection Part II & Weight

Detta blir en fortsättning på inlägget “AS_SEQ Path Attribute & Path Selection” så vi kan gå in lite mer på djupet över hur just BGPs best path selection går till.

För att bestämma vilken route som är bäst används följande kriterier i turordning tills den hittat en avgörande faktor, dvs om alla parametrar är identiska mellan två vägar för en specifik destination så är det tillslut den med lägst Router-ID som vinner. 🙂

  1. Largest Weight (cisco proprietary)
  2. Highest Local Preference
  3. Locally Originated
  4. Shortest AS Path
  5. Lowest Origin Type (i < e < ?)*
  6. Lowest MED (metric)
  7. eBGP over iBGP
  8. Lowest IGP metric to neighbor (Max. paths check – default 1)
  9. Older route
  10. Lowest Router-ID

*i = Injected from an IGP (using network-command), e = Injected from Exterior Gateway Protocol (EGP), ? = Undetermined

Det finns dock ett Steg 0 också, “Next hop: reachable?”, om routern inte kan nå den specificerade next-hop adressen kommer routern räknas som invalid.

För att lättare komma ihåg detta föreslår Cisco följande “ordramsa(?)” – N WLLA OMNI.

Ytterligare något som är bra att känna till är att Cisco särskiljer på rekommenderade metoder beroende på om vi vill modifiera “outbound”-eller “inbound”-routes.

För outbound rekommenderas:

  • Weight
  • Local Preference
  • AS_PATH

Och för inbound:

  • MED (metric)

Låt oss använda följande topologi igen och kontrollera hur valet gått till för exempelvis routen 200.0.3.0/24 i R7:

bgp AS-path

pathselection1

Först har vi weight, men vi kan se att värdet är satt till “0” för båda alternativen, ingen vinnare där med andra ord. Nästa steg är “Highest Local Preference”, men inte heller där finns det något värde satt, Tredje punkten, “Locally Originated” får vi inte heller någon match på då det är en extern route.

För fjärde punkten i listan – “Shortest AS Path”, kan vi dock se skillnad. Routen med next-hop adressen 172.16.47.4 har ett mindre AS-hopp än alternativet som går via AS200- > AS500 -> AS100. Denna route blir därför vald till “best route” och installeras i routerns routing table:

R7#sh ip route 200.0.3.0
Routing entry for 200.0.3.0/24
 Known via "bgp 50", distance 20, metric 0
 Tag 500, type external
 Last update from 172.16.47.4 05:53:45 ago
 Routing Descriptor Blocks:
 * 172.16.47.4, from 172.16.47.4, 05:53:45 ago
 Route metric is 0, traffic share count is 1
 AS Hops 2
 Route tag 500

Hur bär vi då oss åt om vi vill modifiera detta? I CCNP route räknar Cisco med att vi ska ha koll på följande fyra:

  • Weight
  • Local preference
  • AS_Path Lenght
  • MED (metric)

Vi börjar med den enklaste(?)..

Largest Weight

  • Is not a Path Attribute
  • Purpose – Identifies a single router’s best route
  • Scope – Set on inbound route Updates; influences only that one router’s choice
  • Range – 0 through 65-535 (2^16-1)
  • Which is best? – Bigger value is better
  • Default – 0 for learned routes, 32,768 for locally injected routes
  • Defining a new default – Not supported
  • Configuration – neighbor route-map (per prefix), neighbor weight (all routes from this neighbor)

Detta option är “Cisco proprietary” och räknas ej som ett “Path Attribute”. Vi behöver dock inte bry oss i om våra neighbors också använder Cisco’s hårdvara då Weight endast används lokalt! Om vi använder oss av samma topologi återigen, låt oss säga att vi hellre föredrar att trafiken från R7 tar den längre vägen via AS200 -> AS500 -> AS100 (då vi kanske har en snabbare uppkoppling mellan de kontoren). Konfigurationen blir då följande:

R7(config)#router bgp 50
R7(config-router)#neighbor 172.16.76.6 weight ?
 <0-65535> default weight
R7(config-router)#neighbor 172.16.76.6 weight 5
R7(config-router)#end
R7#clear ip bgp *

Kom ihåg att vi behöver starta om BGP-processen!

Detta leder till följande resultat:

pathselection-weight

R7 föredrar nu att gå via R6 trots att det är ett AS-hopp mer än direkt via R4/AS500.

Hur gör vi då om vi endast vill modifiera detta för en/flera specifika routes och inte alla? Route-maps! Vi tar bort ändringen ovan och försöker istället utföra samma sak men endast för routen 200.0.3.0/24.

Som du säkert gissat behöver vi först skapa en access-lista:

access-list 1 permit 200.0.3.0

Och sedan en route-map:

route-map WEIGHT-FILTER permit 10
match ip address 1
set weight 10

Vi applicerar sedan route-map:en i vårat neighbor-statement(!)

router bgp 50
neighbor 172.16.76.6 route-map WEIGHT-FILTER in
do clear ip bgp *

That’s it, detta ger följande resultat:

route-map weight

Fast vänta lite nu.. Jämför detta med det resultat vi fick innan vi applicerade route-mapen ovan. Vi saknar nu de alternativa vägarna för näten 5.5.5.0/24, 6.6.6.0/24 & 200.0.2.0/24! Du kanske redan listat ut varför det blir såhär, om inte föreslår jag att du tar en paus och försöker lösa det på egen hand innan du läser vidare.

I den access-lista vi skapade matchade vi endast nätet 200.0.3.0/24, så det är kanske inte så konstigt att vi endast ser detta nätet nu. Men vi kan ju inte gärna lägga till resterande nät i acl:en då vi endast ville ändra weight för 200.0.3.0?

Svaret ligger i route-map:en! Just nu har vi ju följande konfiguration:

access-list 1 permit 200.0.3.0
!
route-map WEIGHT-FILTER permit 10
match ip address 1
set weight 10

Det finns ju bevisligen inget statement för de övriga näten. Vi fixar detta enkelt med att skapa ett match-any statement som tillåter allt!

route-map WEIGHT-FILTER permit 20

Vi behöver inget match-statement då vi vill tillåta allt som inte redan matchats under sequence 10/ACL 1. Vi kör återigen en clear ip bgp * och håller tummarna..

route-map weight2

Kungligt! Nästa inlägg blir en fortsättning på samma ämne men då kollar vi istället på Local Preference & AS PATH_LENGHT.

BGP – AS_SEQ Path Attribute & Best Path Selection

AS_SEQ Path

Per default använder sig BGP av AS_Path attributet “AS_SEQ” (Autonomous System Sequence) för att bestämma vilken route som är bäst, men även för att förhindra eventuella routing loopar.

AS_Path listar vilka AS som trafiken kommer gå via för att nå sin destination, BGP kommer då att välja den route som går via lägst antal AS. Detta kan komiskt nog liknas vid RIP som använder hopcount för att räkna ut den bästa vägen.

Låt oss använda följande topologi för att testa detta lite mer ingående:

bgp AS-path

Vi tar och kollar vidare på nätet 192.168.0.0/24.

I R5 kan vi se följande:

R5#sh ip route | beg Gat
 Gateway of last resort is not set
C 200.0.0.0/24 is directly connected, Loopback1
 5.0.0.0/24 is subnetted, 1 subnets
 C 5.5.5.0 is directly connected, Loopback0
 C 200.0.1.0/24 is directly connected, Loopback2
 6.0.0.0/24 is subnetted, 1 subnets
 B 6.6.6.0 [20/0] via 172.16.51.1, 01:03:52
 C 200.0.2.0/24 is directly connected, Loopback3
 172.16.0.0/24 is subnetted, 1 subnets
 C 172.16.51.0 is directly connected, FastEthernet0/0
 C 200.0.3.0/24 is directly connected, Loopback4
 B 192.168.0.0/24 [20/0] via 172.16.51.1, 00:16:32
 B 200.0.0.0/22 [200/0] via 0.0.0.0, 00:52:34, Nu
R5#sh ip bgp
 BGP table version is 13, local router ID is 5.5.5.5
 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
 *> 5.5.5.0/24 0.0.0.0 0 32768 i
 *> 6.6.6.0/24 172.16.51.1 0 500 200 i
 *> 192.168.0.0 172.16.51.1 0 500 200 50 i
 s> 200.0.0.0 0.0.0.0 0 32768 i
 *> 200.0.0.0/22 0.0.0.0 32768 i
 s> 200.0.1.0 0.0.0.0 0 32768 i
 s> 200.0.2.0 0.0.0.0 0 32768 i
 s> 200.0.3.0 0.0.0.0 0 32768 i

Observera next-hop adressen, R1 annonserar sin egen adress då det är ett eBGP-förhållande mellan R1 <-> R5.  Vi kan också se att för R5 skall nå destinationen 192.168.0.0 kommer den behöva gå via Path: 500 -> 200 -> 50. Detta känns ju dock ej som den kortaste vägen när trafiken går via AS 200 också?

Gör vi samma sak på R4 ser det ju dock bättre ut:

R4#sh ip bgp
 BGP table version is 35, local router ID is 4.4.4.4
 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
 *>i5.5.5.0/24 1.1.1.1 0 100 0 100 i
 * 6.6.6.0/24 172.16.47.7 0 50 200 i
 *>i 3.3.3.3 0 100 0 200 i
 *> 192.168.0.0 172.16.47.7 0 0 50 i
 r>i200.0.0.0/22 1.1.1.1 0 100 0 100 i

Varför väljer då R5 att ta omvägen?

R1#sh ip bgp 192.168.0.0
 BGP routing table entry for 192.168.0.0/24, version 4
 Paths: (2 available, best #1, table Default-IP-Routing-Table)
 Flag: 0x820
 Advertised to update-groups:
 1
 200 50
 3.3.3.3 (metric 129) from 3.3.3.3 (3.3.3.3)
 Origin IGP, metric 0, localpref 100, valid, internal, best
 50
 172.16.47.7 (inaccessible) from 4.4.4.4 (4.4.4.4)
 Origin IGP, metric 0, localpref 100, valid, internal

Det visade sig att jag glömt annonsera nätet 172.16.47.0/24  i R4 till OSPF-processen, BGP använder endast routes den kan nå.

Efter jag fixat detta får vi nu förväntat resultat på R5:

R5#sh ip bgp
 BGP table version is 22, local router ID is 5.5.5.5
 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
 *> 5.5.5.0/24 0.0.0.0 0 32768 i
 *> 6.6.6.0/24 172.16.51.1 0 500 200 i
 *> 192.168.0.0 172.16.51.1 0 500 50 i
 s> 200.0.0.0 0.0.0.0 0 32768 i
 *> 200.0.0.0/22 0.0.0.0 32768 i
 s> 200.0.1.0 0.0.0.0 0 32768 i
 s> 200.0.2.0 0.0.0.0 0 32768 i
 s> 200.0.3.0 0.0.0.0 0 32768 i

Om vi även kollar R3’s tabell kan vi se att den har två routes till 192.168.0.0/24-nätet, men att den väljer den med kortast AS_PATH.

R3#sh ip bgp
 BGP table version is 38, local router ID is 3.3.3.3
 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
 *>i5.5.5.0/24 1.1.1.1 0 100 0 100 i
 *> 6.6.6.0/24 172.16.36.6 0 0 200 i
 * 192.168.0.0 172.16.36.6 0 200 50 i
 *>i 172.16.47.7 0 100 0 50 i
 r>i200.0.0.0/22 1.1.1.1 0 100 0 100 i
Routing entry for 192.168.0.0/24
 Known via "bgp 500", distance 200, metric 0
 Tag 50, type internal
 Last update from 172.16.47.7 00:24:41 ago
 Routing Descriptor Blocks:
 * 172.16.47.7, from 4.4.4.4, 00:24:41 ago
 Route metric is 0, traffic share count is 1
 AS Hops 1
 Route tag 50

En viktig skillnad mellan iBGP och eBGP är förövrigt att iBGP ej lägger till sitt AS i AS_PATH. Varför? BGP’s “loop prevention” innebär att routern alltid inspekterar AS_PATH för nya routes, och om den finner att sitt eget AS-nummer redan finns med så ignoreras routen (en bättre väg måste bevisligen redan finnas). Hur vi löser loop prevention i iBGP har jag redan nämnt i det tidigare inlägget  “BGP – Internal BGP & Transitarea” (full mesh).

Best Path Selection

Som vi sett i ovanstående exempel, lämnar vi BGP med default-inställningar kommer den välja routen med kortast AS-PATH. Det ingår dock betydligt fler variabler där routern går i turordning tills den hittar den bästa kandidaten.

  1. Largest Weight
  2. Highest Local Preference
  3. Locally originated
  4. Shortest AS-Path
  5. Lowest origin type (i < e < ?)
  6. Lowest MED (metric)
  7. eBGP > iBGP
  8.  Lowest IGP metric to neighbor (max. match check)
  9. Older route
  10. Lowest Router-ID

Det är med andra ord lite mer än vad vi är vana med från OSPF/EIGRP. 😉 Det är somliga av dessa värden vi senare kommer att modifiera för att ha möjlighet att påverka vilken väg vi önskar att trafiken skall ta.