BGP

BGP tiene diferentes versiones. Actualmente se utiliza la versión 4 (BGP4). BGP queda definido en el estándar RFC 1771.

BGP es el protocolo de enrutamiento de Internet. Su finalidad es crear una red de Sistemas Autónomos (AS) libre de bucles, que permita enrutar un paquete desde un AS a cualquier otro.

BGP es un protocolo de enrutamiento de vector distancia. BGP no fue diseñado para enrutar dentro de un AS sino para enrutar entre ellos.

BGP mantiene una tabla de rutas separada basada en el camino más corto (y otros atributos).

¿Qué es un Sistema Autónomo

Un sistema autónomo (AS) es un grupo de redes IP que poseen una política de rutas propia e independientes. El enrtuamiento dentro del AS es definido por los administradores de la red, y puede basarse en enrutamiento estático o bien en un protocolo de enrutamiento dinámico.

Los AS se identifican por un número que puede ir desde el 1 al 65535, llamados ASN (Autonomous System Number) y son asignados por las organizaciones regionales de la IANA. Los números 64512 - 65535 se reservan para uso privado. BGP utiliza el puerto 179 TCP

¿Cuándo usamos BGP?

BGP no es necesario cuando un AS tiene una única conexión a Internet, ya que el problema se puede resolver con rutas estáticas (al fin y al cabo solo hay una forma de llegar a/desde Internet). BGP debe usarse cuando:

  • Hay múltiples conexiones a Internet a través de diferentes proveedores.
  • Hay múltiples conexiones a Internet a través de un mismo proveedor, pero se pretende regular el tráfico a través de los enlaces.

Lo que realmente aporta BGP es el control de cómo el tráfico entra al interior de un AS más que como sale de él.

Vecinos BGP (Neighbors)

Para que BGP funcione necesita establecer una relación con sus vecinos. Existen dos tipos de relaciones entre vecinos:

  • vecinos iBGP - vecinos dentro del mismo AS. la "i", viene de interior
  • vecinos eBGP - vecinos que conectan diferentes sistemas autónomos. la "e" viene de exterior

iBGP no es RIP ni OSPF

Debe quedar claro que iBGP no es como RIP u OSPF. Su funcionalidad no es crear tablas de rutas para enrutar dentro del AS.

El router C (en el AS 200) podría formar una relación vecinal iBGP. En cmabio el router A (en el AS 100) y el router B (en el AS 200) formarían una relación vecinal eBGP.

Cuando dos vecinos BGP establecen su relación, intercambian su tabla de rutas completa. Una vez que el primer intercambio ha concluido, solo intercambian los cambios que se produzcan en la tabla de rutas.

Algunas restricciones de BGP

Vecinos a un salto

eBGP asume que los vecinos están a un salto de distancia como máximo (aunque hay una excepción. ver nota al final del apartado).

iBGP en cambio no tiene esta restricción. Depende del IGP (Interior Gateway Protocol) que los vecinos BGP se vean entre sí. iBGP considera que todos los vecinos iBGP están conectados en una maya completa.

Existe una excepción, cuando se usa la opción ebgp-multihop que permite establecer relaciones entre vecinos a más de un salto.

Distancia administrativa y pertenencia a AS's

Un router puede pertenecer a un único AS.

Las distancias administrativas son:

  • eBGP: 20
  • iBGP: 200

Mensajes que utiliza BGP

BGP intercambia mensajes con sus vecinos. Estos mensajes son los siguientes:

  • OPEN inicia una sesión entre vecinos (BGP utiliza TCP como protocolo de transporte). Los parámetros intercambiados son:
    • Versión BGP
    • ASN local
    • ID del router
  • KEEPALIVE es enviado periódicamente (cada 60 segundos) para asegurarse de que un vecino está disponible. Si el router no recibe un mensaje KEEPALIVE en un periodo Hold-time (180 segundos), el router considera que el vecino correspondiente está caído
  • UPDATE intercambia rutas entre vecinos
  • NOTIFICATION se envía cuando hay una condición de error. Cuando se envía este mensaje, la sesión se cierra y se reinicia.

Estados de una sesión BGP

Una sesión BGP entre vecinos pasa por varios estados:

  • Idle es el estado inicial
  • Connect espera una conexión TCP de un vecino.
    • Si la conexión se lleva a cabo con éxito, se envía un mensaje OPEN.
    • Si la conexión no se completa, la sesión pasa al estado Active
  • Active es un estado en el que BGP trata de iniciar una sesión.
    • Si la conexión se lleva a cabo con éxito, se envía un mensaje OPEN
    • Si la conexión no se completa dentro de un periodo Connect Retry, BGP pasa de nuevo al estado Connect
  • OpenSent indica que ambos vecinos han establecido una conexión TCP, y han intercambiado un mensaje OPEN. Los vecinos están a la espera de una respuesta al mensaje OPEN. En el momento en que un vecino reciba un mensaje OPEN enviará un mensaje KEEPALIVE.
  • OpenConfirm indica que los vecinos están a la espera de una respuesta al mensaje KEEPALIVE.
  • Established indica que la sesión ha sido establecida. Los mensajes UPDATE se intercambiarán en este estado para el intercambio de información.

En el estado Active los vecinos intentan de manera repetida el establecimiento de conexión. Si este estado no cambia, puede indicar un problema de conectividad, errores en la configuración del vecino o bien el filtrado del puerto 179.

Configurar vecinos BGP

Partiendo de la red mostrada en la figura, el proceso para configurar un vecino es el siguiente.

Topología de ejemplo para configurar vecinos BGP

Para configurar un router, e indicarle que pertenece a un AS, el comando a ejecutar es el siguiente:

RouterB(config)# router bgp 100

Ahora, RouterB pertenece al AS 100. A continuación estableceremos las relaciones con sus vecinos. RouterA es un vecino iBGP ya que están dentro del mismo AS.

RouterB(config)# router bgp 100 RouterB(config-router)# neighbor 10.1.1.1 remote-as 100

El router RouterC es un vecino eBGP ya que está en otro AS.

RouterB(config)# router bgp 100 RouterB(config-router)# neighbor 172.16.1.2 remote-as 900

Si desemos que haya autenticación entre vecinos, podemos indicar una contraseña al registrar un vecino:

RouterB(config)# router bgp 100 RouterB(config-router)# neighbor 172.16.1.2 password Perro20

Comprobar vecinos BGP

Para comprobar el estado de los vecinos BGP, usamos el siguiente comando:

En la salida del comando podemos ver la descripción del estado para el vecino 172.16.1.2, como BGP state = Established

Si lo que queremos es ver el estado de un determinado vecino, ejecutaremos el siguiente comando:

RouterB# show ip bgp neighbors 172.16.1.2

Sincronización entre vecinos

Si consideramos el ejemplo de la primera figura, el AS 200 sirve como red de tránsito entre el AS 100 y el AS 300.

BGP tiene una regla para la sincronización:

Regla de sincronización de BGP para redes de tránsito

Todos los routers de una red de tránsito, incluyendo los routers no BGP, deben aprender todas las rutas hacia las redes de los demás AS's

Esto puede parecer extraño, dado que RouterC no es un router BGP. Pero, ¿Qué pasaría si una vez que las actualizaciones de BGP se han expandido y el router RouterE quisiera alcanzar la red 10.5.0.0/16?

La respuesta, es que si RouterC no conoce una ruta hacia 10.5.0.0/16, descartará el paquete. Por eso, aunque RouterC no sea un router BGP, debe conocer las rutas hacia redes de los AS externos.

La regla de sincronización de BGP obligará al router RouterC a aprender la ruta hacia 10.5.0.0/16 antes de reenviar dicha ruta al router RouterE. ¿Cómo puede el router RouterD saber si el router RouterC ha aprendido la ruta? La respuesta es cuando RouterD reciba una actualización a través del IGP conteniendo la ruta

La sincronización BGP puede desactivarse en determinadas circunstancias:

  • El AS local no es una red de tránsito
  • Los routers en la red de tránsito ejecutan iBGP y tienen una topología de maya completa

Para desactivar la sincronización BGP:

RouterD(config)# router bgp 200 RouterD(config-router)# no synchronization

Anuncio de redes

Hay tres formas de anunciar redes en BGP:

  • Usar sentencias network
  • Usar sentencias aggregate-address
  • Redistribuir un IGP dentro de BGP

Usar el comando network

Usar el comando network informa a BGP de qué redes anunciar a los routers eBGP, pero no por qué interfaces hacerlo. Se utiliza para inyectar cualquier red desde el AS local en BGP, incluyendo las rutas dinámicas aprendidas mediante el IGP (no solo las redes directamente conectadas).

Regla de BGP para el anuncio de rutas

Sin embargo, cada ruta anunciada debe estar en la tabla de rutas antes de que BGP anuncie la red a un vecino eBGP

Si recordamos el ejemplo 2, veremos que el router RouterB anunciará la red 10.5.0.0/16. Para que esto ocurra, la ruta hacia 10.5.0.0/16 debe estar en su tabla de rutas. En caso contrario, RouterB no inyectará la red en BGP.

RouterB, incluiría los siguientes comandos para anunciar sus redes:

RouterB(config)# router bgp 100 RouterB(config-router)# network 10.1.1.0 mask 255.255.0.0 RouterB(config-router)# network 172.16.1.0 mask 255.255.0.0

La tabla de rutas BGP

BGP mantiene su propia tabla de rutas. Esta tabla contiene una lista de rutas que pueden ser anunciadas a los vecinos BGP, siempre respetando la regla anterior.

Para comprobar la tabla de rutas BGP, usaremos el comando show ip bgp. Podemos verlo en el router RouterB:

Salida del comando show ip bgp en el router RouterB

En la salida del comando podemos apreciar lo siguientes aspectos:

  • La ruta se ha inyectado en BGP usando el comando network.
  • El siguiente salto (0.0.0.0) indica que la ruta se originó localmente en BGP. El IGP correspondiente se encargará de resolver el envío del paquete al router correspondiente dentro del AS local para llegar a dicha red.
  • El parámetro path está vacío ya que la ruta se originó en el mismo AS al que pertenece RouterB.
  • El código "*>" significa lo siguiente:
    • * indica que la ruta es válida (está presente en la tabla de rutas)
    • > indica que es la mejor ruta hacia el destino.

BGP no anunciará una ruta a un vecino eBGP hasta que la ruta sea válida y además sea la mejor ruta hacia su destino. Es decir, una ruta BGP anunciada cumple estas dos condiciones:

  • La ruta es válida (*)
  • La ruta es la mejor (>)

Si observamos la tabla de rutas BGP de RouterC de la figura 2, observaremos lo siguiente:

Tabla de rutas BGP del router RouterC

Podemos ver que el AS 100 ha sido añadido a la columna path, y que el siguiente salto es ahora RouterB.

BGP route-reflector

Una de las condiciones que BGP pone para iBGP es que los vecinos dentro de un AS deben tener topología de maya completa. Esto no siempre es posible, y por eso existe una "artimaña" para superar esta restricción.

route-reflector es un servicio que permite el tránsito de notificaciones GBP entre nodos que no están el maya completa.

El router RouterA actúa como route-reflector server.

En la imagen anterior hay tres routers BGP en el AS. Siguiendo la restricción de BGP, debería haber una topología de maya completa, de forma que RouterD debería estar conectado a RouterB. Una alternativa es que RouterA sea conectado como un servidor route-reflector. Tanto RouterB como RouterD tendrán vecindad con RouterA únicamente:

RouterA(config)# router bgp 100 RouterA(config-router)# neighbor 10.2.1.2 remote-as 100 RouterA(config-router)# neighbor 10.2.1.2 route-reflector-client RouterA(config-router)# neighbor 10.1.1.2 remote-as 100 RouterA(config-router)# neighbor 10.1.1.2 route-reflector-client

Un ejemplo

Para poder simular eBGP e iBGP es preciso usar el programa GNS3, ya que PacketTracer no es capaz de simular iBGP.

Vamos a ver un ejemplo práctico. Observa la siguiente topología:

Topología de ejemplo.

Configuración del IGP (RIPv2) en el AS 1

El IGP en el AS 1 será RIPv2. RIPv2 se encargará de actuar como intermediario entre los routers iBGP Router1 y Router2, inyectando las rutas recibidas por BGP en el dominio RIP, permitiendo así el tránsito a través del AS 1.

Algunas consideraciones imporantes son:

  • El Router1 aprende la ruta hacia 151.108.1.0/24 por dos caminos. Paradógicamente, la ruta aprendida por iBGP es más valorada por BGP que la ruta más corta, de forma que se da una situación un tanto extraña cuando Router1 considera que que llegará a 151.108.1.0/24 a través de 131.108.255.0, router al cual no tiene acceso directamente. Para resolver este problema es preciso usar el atribut Weight, que veremos más adelante.
  • El problema anterior, se da igualmente en Router2 para alcanzar 141.108.1.0/24.
  • Router5 no aprende las rutas eBGP. De hecho, aprenderlas podría ser un problema. Es preferible que Router5 tenga una ruta por defecto, para enviar a redes remotas.

Atributos BGP

BGP utiliza atributos para determinar el mejor camino hasta su destino. Los atributos soportados en todas las implementaciones de BGP (independientemente del fabricante) son:

  • AS-Path identifica la lista de AS atravesados para alcanzar un destino concreto.
  • Next-Hop identifica la siguiente dirección IP para alcanzar un destino.
  • Origin identifica al router que originó la ruta.
  • Local Preference (opcional) proporciona una preferencia para determinar el mejor camino para el tráfico de salida.
  • Atomic Aggregate (opcional) identifica rutas sumarizadas.
  • MED (opcional) Multi-Exit-Discriminator permite elegir entre los diferentes routers directamente conectados mediante eBGP.
  • Wight (propietario de Cisco) asignado administrativamente.

Determinación de la mejor ruta

Si BGP contiene varias rutas hacia el mismo destino, compara las rutas, empezando por las más nuevas y terminando por las más antiguas. La mejor ruta se decide comparando los atributos de las rutas, en el siguiente orden:

  1. Weight: ruta con mayor peso
  2. Local preference: ruta de mayor preferencia
  3. Ruta originada localmente: es decir, tiene como destino 0.0.0.0
  4. AS-Path: ruta con AS-Path más corto
  5. Origin Code: tipo de origen. Por orden de preferencia:
    1. IGP
    2. EGP
    3. Origen desconocido
  6. MED: ruta con menor MED
  7. Tipo de BGP: eBGP es preferible a iBGP
  8. Age: las rutas más antiguas son las preferidas
  9. Router ID: se prefieres rutas originadas por el ID más bajo
  10. Peer IP Address: qué ruta se originó en el router con menor IP

Usar Weight

El peso (weight) es un atributo propietario de Cisco y solo tiene valor local, de forma que no se transmite al resto de routers. Una ruta originada en el propio router tendrá un peso de 32768 y el resto de rutas tendrá valor 0 por defecto. Este valor se puede modificar hasta 65535.

Ejemplo para explicar weight
RouterA(config)# router bgp 100 RouterA(config)# neighbor 10.1.1.2 weight 200

Puede que tras asignar un peso a un vecino, no veamos los cambios al ejecutar show ip bgp. En tal caso, es preciso resetar las conexiones BGP, mediante el comando clear ip bgp A.B.C.D, donde A.B.C.D es la ip del vecino cuyo peso hemos cambiado.

De esta forma, las rutas recibidas desde 10.1.1.2 serán ponderadas por encima de las mismas rutas enviadas desde 10.2.1.2.

Local Preference

El atributo Local Preference se aplica a routers de borde para indicar a iBGP de qué manera salir del AS, en caso de existir varios routers de salida.

Local Preference puede valer desde 0 a 4294967295 (2^32). El router con mayor valor es elegido para salir del AS, de forma que el valor por defecto es 100.

Ejemplo para explicar Local Preference
RouterB(config)# router bgp 100 RouterB(config-router)# bgp default local-preference 200 RouterD(config)# router bgp 100 RouterD(config-router)# bgp default local-preference 300

Sumarización

Las rutas BGP son sumarizadas automáticamente. Para descativarlas, podemos utilizar el comando no auto-summary:

Router(config)# router bgp 100 Router(config-router)# no auto-summary

Podemos conseguir el efecto contrario con el comando aggregate-address para forzar la sumarización. Por ejemplo, si queremos sumarizar las siguientes redes:

  • 172.16.0.0/24
  • 172.16.1.0/24
  • 172.16.2.0/24
  • 172.16.3.0/24

Utilizaremos el siguiente comando:

Router(config)# router bgp 100 Router(config-router)# aggregate-address 172.16.0.0 255.255.252.0

Por defecto, BGP envía tanto las rutas sumarizadas como las no suparizadas. Para enviar solamente las rutas sumarizadas, podemos usar la opción summary-only:

Router(config-router)# aggregate-address 172.16.0.0 255.255.252.0 summary- only

Next-Hop-Self

En la imagen anterior, si el RouterC envía la ruta 192.168.1.0/24 a eBGP a través de RouterB, el siguiente salto para dicha ruta será RouterC.

El problema surge cuando el router RouterB envía esta ruta a sus vecinos iBGP (RouterA y RouterD), ya que el valor Next Hop no cambia. Es decir, RouterA (así como RouterD) pensarán que el siguiente salto hacia 192.168.1.0/24 es RouterC:

RouterB considera que Next Hop es RouterC
RouterA también piensa que Next Hop hacia 192.168.1.0/24 es RouterC.

Si observamos, la ruta hacia 192.168.1.0/24 en RouterA no tiene ">", lo que quiere decir que no es la mejor ruta al destino. Esto es así ya que RouterA no tiene una ruta hacia RouterC.

Existen dos soluciones:

  1. La ruta hacia 172.16.0.0/16 es añadida manualmente en los routers RouterA y RouterD
  2. El campo Next-Hop se ajusta para identificar a RouterB como el siguiente salto.

La segunda opción se conseguiría del siguiente modo:

RouterB(config)# router bgp 200 RouterB(config-router)# neighbor 10.1.1.1 next-hop-self RouterB(config-router)# neighbor 10.2.1.2 next-hop-self

De este modo, RouterB informa de que él es el siguiente salto para las rutas eBGP aprendidas. Tras ejecutar este comando, RouterA modifica el campo Next-Hop:

RouterA modifica el parámetro Next-Hop.

Resumen de comandos BGP vistos

Router(config)# router bgp 100 Router(config-router)# neighbor 10.1.1.1 remote-as 100 Router# show ip bgp neighbors 172.16.1.2 Router(config-router)# no synchronization Router(config-router)# network 172.16.1.0 mask 255.255.0.0 Router(config-router)# neighbor 10.2.1.2 route-reflector-client Router(config)# neighbor 10.1.1.2 weight 200 Router(config-router)# bgp default local-preference 200 Router(config-router)# no auto-summary Router(config-router)# aggregate-address 172.16.0.0 255.255.252.0 Router(config-router)# aggregate-address 172.16.0.0 255.255.252.0 summary-only RouterB(config-router)# neighbor 10.1.1.1 next-hop-self

Otros comandos BGP

Resetear la sesión BGP entre con todos los vecinos:

Router# clear ip bgp *

Forzar el reenvío de las actualizaciones BGP, sin resetar las sesiones BGP:

Router# clear ip bgp * soft

Obener un informe de todas las conexiones BGP, incluyendo el número total de rutas, y una lista resumida de vecinos:

Router# show ip bgp summary

Actividad final. Crea la topología anterior utilizando BGP y RIP para obtener conectividad total en la red

Toplogía de la actividad final.

Se comprobará el funcionamiento de la red en clase.