lunes, 8 de febrero de 2010

BGP Best Path

Posted by Nicolas | lunes, 8 de febrero de 2010 | Category: , |

Uno de los links más recurrentes por aquellos que están aprendiendo el funcionamiento de BGP es: BGP Best Path Selection Algorithm. Éste se puede resumir en que un determinado path en la tabla BGP será preferido sobre otro basado en alguno de sus atributos que son revisados en el siguiente orden hasta lograr el desempate:

  1. WEIGHT: Sólo equipos Cisco.
  2. LOCAL PREFERENCE: Mayor valor es preferido y es local al número de Sistema Autónomo.
  3. Se preferirán aquellos originados localmente (comandos network/redistribute/aggregate-address)
  4. AS PATH: El más corto es preferido.
  5. ORIGIN: Se prefiere IGP sobre EGP y éste último es preferido sobre INCOMPLETE (?). Ojo!, IGP no tiene nada que ver con OSPF , EIGRP, etc. en este caso y no creeránlo antiguo que es EGP.
  6. MED: También conocido como metric. Menor valor es preferido.
  7. eBGP sobre iBGP paths. De existir un desempate, se pasa al paso 9.
  8. Menor métrica IGP al next hop.
  9. Chequea si Multipath está activo.
  10. Si ambos paths son externos, preferir el que fue recibido primero (si es que bgp bestpath compare-routerid no está activo).
  11. Menor router ID.
  12. Menor longitud de cluster list (escenarios con Route Reflectors).
  13. Menor dirección IP del neighbor.
A continuación se analizará cómo modificar la configuración de BGP para preferir distintos path sin necesidad de modificar sus atributos y en qué caso se considera Multipath. Los ejemplos estarán basados en el escenario de la figura (hacer click en ella para ver con más detalle):


Se supondrá que por cualquiera sean las razones, siempre se aprenderán los prefijos en el siguiente orden; primero desde R2, luego R3, R4 y finalmente desde R1. Dado que la línea de comandos (CLI) muestra los prefijos (paths) en el orden inverso del que fueron aprendidos inicialmente se tendrá lo siguiente:

R6#sh ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/8, version 2
Paths: (4 available, best #4, table Default-IP-Routing-Table)
Advertised to update-groups:
1 2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin IGP, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, localpref 100, valid, external
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin IGP, localpref 100, valid, external
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin IGP, localpref 100, valid, external, best

Es importante destacar que la comparación de prefijos se efectúa de arriba hacia abajo, o sea de manera inversa a cómo fueron aprendidos.

Se puede ver que se prefiere el prefijo de más abajo, el desempate se logra debido a que R2 anuncia 10.0.0.0/8 primero que el resto de los vecinos. El path por R1 se descarta por su longuitud de tres números de sistema autónomo al ser comparado con el path por R4. Éste último se descarta en compararción contra el aprendido por R3 por la antiguedad del anuncio en la tabla de BGP. Cabe destacar que no se compara MED de paths provenientes de distintos sistemas autónomos a no ser que así sea especificado como se verá más adelante. Finalmente el path por R2 es preferido por sobre el de R3 también por una cosa de tiempo. Interesante resulta que el óden en que son comparados los prefijos es FUNDAMENTAL, puesto que de haber sido comparado el path de R2 contra el de R4, el path que resulta ahora como mejor opción hubiese sido descartado por MED.

1. Ignorar el AS PATH y comparar el router ID previo a revisar antiguedad del prefijo (path).

R6#
R6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)#router bgp 65111
R6(config-router)#bgp bestpath as-path ignore
R6(config-router)#bgp bestpath compare-routerid
R6(config-router)#end
R6#

Lugeo de realizar los respectivos clear en el orden mencionado al comienzo se obtiene:

R6#sh ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/8, version 111
Paths: (4 available, best #1, table Default-IP-Routing-Table)
Flag: 0x10820
Advertised to update-groups:
2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin IGP, metric 200, localpref 100, valid, external, best
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin IGP, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, localpref 100, valid, external
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin IGP, metric 100, localpref 100, valid, external
R6#

Primero que nada se ha ignorado la longuitud del AS PATH con bgp bestpath as-path ignore, que en todo caso debería haber determinado el path por R2 como el preferido puesto que es el más antiguo, sin embargo bgp bestpath compare-routerid ha sobrepuesto esta comparación permitiendo el resultado observado (R1 tiene el menor Router ID).

2. Comparar MED incluso si provienen de distintos Sistemas Autónomo.

R6#
R6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)#router bgp 65111
R6(config-router)#bgp always-compare-med
R6(config-router)#

Luego de realizar los respectivos clear en el orden mencionado al comienzo se obtiene:

R6#sh ip bgp 10.0.0.0   
BGP routing table entry for 10.0.0.0/8, version 9
Paths: (4 available, best #2, table Default-IP-Routing-Table)
Flag: 0x10800
Advertised to update-groups:
1 2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin IGP, metric 200, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, localpref 100, valid, external, best
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin IGP, metric 100, localpref 100, valid, external
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin IGP, metric 100, localpref 100, valid, external
R6#

Se puede apreciar bgp always-compare-med fuerza se comparen valores de MED para prefijos aprendidos de distintos sistemas autónomo. Si bien el path por R2 no muestra ningún valor de MED (metric) es simplemente por que no se le ha asignado ninguno y por defecto toma el valor de 0, por ende se convierte en el path más conveniente en ese sentido. Para variar esto se puede utilizar bgp bestpath med missing-as-worst como se verá a continuación.

R6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)#router bgp 65111
R6(config-router)#bgp bestpath med missing-as-worst
R6(config-router)#

R6#sh ip bgp 10.0.0.0   
BGP routing table entry for 10.0.0.0/8, version 11
Paths: (4 available, best #4, table Default-IP-Routing-Table)
Flag: 0x10820
Advertised to update-groups:
1 2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin IGP, metric 200, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, metric 4294967295, localpref 100, valid, external
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin IGP, metric 100, localpref 100, valid, external
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin IGP, metric 100, localpref 100, valid, external, best
R6#

O sea, el valor por defecto asignado en caso que MED no sea setado manualmente es infinito (desde la perspectiva del router => 4294967295).

3. Agrupar prefijos por Sistema Autónomo.

R6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)#router bgp 65111
R6(config-router)#no bgp bestpath med missing-as-worst
R6(config-router)#bgp deterministic-med
R6(config-router)#

R6#sh ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/8, version 14
Paths: (4 available, best #3, table Default-IP-Routing-Table)
Flag: 0x10800
Advertised to update-groups:
1 2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin IGP, metric 200, localpref 100, valid, external
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin IGP, metric 100, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, localpref 100, valid, external, best
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin IGP, metric 100, localpref 100, valid, external
R6#

En este caso, bgp deterministic-med agrupará los paths aprendidos de un mismo sistema autónomo, por ende el mejor representante de este grupo será comparado con los paths aprendidos de otros sistemas autónomo. Los prefijos en este caso no son desplegados en relación exacta a cuándo fueron aprendidos, si no más bien considerando que aquellos provenientes de un mismo sistema autónomo deben estar uno al lado del otro. Se evita suceda lo que se vió en el caso inicial, escogiendo efectivamente en esta oportunidad el path con mejores atributos.

4. Involucrando ORIGIN.

En este caso sí se moficará un atributo de los paths en cuestión. Originalmente el prefijo 10.0.0.0/8 es generado en R7 con el comando network, por ende su ORIGIN es IGP. Se cambiará a INCOMPLETE (?) al insertar el prefijo con el comando redistribute.

R7#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R7(config)#
R7(config)#ip prefix-list CONNECTED permit 10.0.0.0/8
R7(config)#
R7(config)#route-map REDISTRIBUTE
R7(config-route-map)#
R7(config-route-map)#match ip address prefix-list CONNECTED
R7(config-route-map)#
R7(config-route-map)#router bgp 65222
R7(config-router)#no network 10.0.0.0
R7(config-router)#redistribute connected route-map REDISTRIBUTE
R7(config-router)#^Z
R7#
R7#clear ip bgp *

R6#sh ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/8, version 75
Paths: (4 available, best #3, table Default-IP-Routing-Table)
Flag: 0x10820
Advertised to update-groups:
2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin incomplete, metric 200, localpref 100, valid, external
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin incomplete, metric 100, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin incomplete, localpref 100, valid, external, best
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin incomplete, metric 100, localpref 100, valid, external
R6#

Como se ve todas las entradas muestran ORIGIN incomplete (además que aún no se ha desactivado bgp deterministic-med). En R4 se modificará el valor de ORIGIN para que así R6 seleccione el path por R4.

R4# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R4(config)#route-map SET-ORIGIN
R4(config-route-map)#set origin IGP
R4(config-route-map)#router bgp 64555
R4(config-router)#neighbor 192.0.2.6 route-map SET-ORIGIN out
R4(config-router)#end
R4#

R6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)#router bgp 65111
R6(config-router)#no bgp deterministic-med
R6(config-router)#end
R6#

R6#sh ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/8, version 79
Paths: (4 available, best #2, table Default-IP-Routing-Table)
Flag: 0x10820
Advertised to update-groups:
1
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin incomplete, metric 200, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, localpref 100, valid, external, best
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin incomplete, metric 100, localpref 100, valid, external
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin incomplete, metric 100, localpref 100, valid, external
R6#

5. Igualando dos prefijos => ¿Multipath?

Se modificará ORIGIN en R3 y no se tocará MED para así los paths a través de R3 y R4 puedan ser considerados iguales para así considerar dos paths como preferidos (Multipath).

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#route-map SET-ORIGIN
R3(config-route-map)#set origin IGP
R3(config-route-map)#
R3(config-route-map)#do sh run | i neighbor 192.0.2.6 route-map
neighbor 192.0.2.6 route-map SET-MED out
R3(config-route-map)#
R3(config-route-map)#router bgp 64888
R3(config-router)#neighbor 192.0.2.6 route-map SET-ORIGIN out
R3(config-router)#
R3(config-router)#do sh run | i neighbor 192.0.2.6 route-map
neighbor 192.0.2.6 route-map SET-ORIGIN out
R3(config-router)#
R3(config-router)#end
R3#

Se configura Multipath.

R6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)#router bgp 65111
R6(config-router)#maximum-paths 2
R6(config-router)#end
R6#

Revisando no pareciera haber funcionado. Se está escogiendo sólo un path (a través de R3)

R6#sh ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/8, version 80
Paths: (4 available, best #3, table Default-IP-Routing-Table)
Multipath: eBGP
Flag: 0x820
Advertised to update-groups:
1 2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin incomplete, metric 200, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, localpref 100, valid, external
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin IGP, localpref 100, valid, external, best
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin incomplete, metric 100, localpref 100, valid, external
R6#

El truco acá es que si bien pareciera que ambos paths tienen iguales atributos, existe uno que difiere; AS PATH.... Hmmmmm...pero no es sólo su longitud lo que interesa, ah?. Sucede que Cisco IOS seleccionará dos prefijos como best path sí y sólo sí sus AS PATH's son idénticos. Esto por cierto puede ser modificado con un comando oculto; bgp bestpath as-path multipath-relax.

R6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)#router bgp 65111
R6(config-router)#
R6(config-router)#bgp bestpath ?
compare-routerid Compare router-id for identical EBGP paths
cost-community cost community
med MED attribute

R6(config-router)#bgp bestpath as-path multipath-relax
R6(config-router)#

R6#sh ip bgp 10.0.0.0
BGP routing table entry for 10.0.0.0/8, version 84
Paths: (4 available, best #3, table Default-IP-Routing-Table)
Multipath: eBGP
Flag: 0x1820
Advertised to update-groups:
1 2
64777 64999 65222
192.0.2.1 from 192.0.2.1 (192.0.2.1)
Origin incomplete, metric 200, localpref 100, valid, external
64555 65222
192.0.2.4 from 192.0.2.4 (192.0.2.4)
Origin IGP, localpref 100, valid, external, multipath
64888 65222
192.0.2.3 from 192.0.2.3 (192.0.2.3)
Origin IGP, localpref 100, valid, external, multipath, best
64555 65222
192.0.2.2 from 192.0.2.2 (192.0.2.2)
Origin incomplete, metric 100, localpref 100, valid, external
R6#

:)

En total 2 comentarios:

  1. Que bestia. Me ha parecido una exposición genial. Mi hora buena.

  2. increible !! realmente jugaste con los atributos a tu antojo, me gusto mucho, casi siempre pense que el unico que funcionaba para quitarme de problemas era el local preference, pero por ser tan simple ni lo expusiste. Realemente es un buen documento.


Leave a Reply