bgp

Tránsitos y filtros en BGP

El otro día en el grupo de Telegram del podcast (https://t.me/grupopodcast) surgió una conversación interesantísima, en la cual se hablaba sobre los tránsitos con ruta por defecto y de los tránsitos con full routing.

Pues se comentaros distintas visiones sobre el tema y aquí me gustaría contaros un poco cual es mi visión sobre el tema por si a alguien le puede servir.

El tránsito es un tema del que ya os estuve hablando el 14 de diciembre de 2017, en un audio llamado «Tránsitos y peering«, pero hoy vamos a profundizar un poco más, además, os quiero hablar de la importancia de los filtros en los tránsitos, porque a veces a nuestro amigo BGP hay que ayudarle un poco a elegir el camino correcto ya sea mediante communities, mediante prefijos, mediante AS-PATH o lo que queráis.

Recordad que BGP nos ayuda a tomar la decisión correcta en cuanto a qué camino elegir en cada caso, obviamente esto sólo tiene sentido si tenemos al menos dos caminos, porque sino sólo habrá una posibilidad, pero aún así algo podremos hacer si tenemos un full routing. Si sólo tenemos un camino como mucho podremos pasar a nuestro tránsito que no anuncie un prefijo a un AS, en un IXP o que le meta un prepend cuando nuestro tránsito se lo anuncie a alguien, no está mal, pero es limitado.

Si tenemos dos tránsitos, con ruta por defecto los dos, lo único que podemos hacer es tener uno de backup del otro o tener un router externo que le mande la mitad de tráfico a uno o al otro, pero todo esto es bastante deficiente.

Aún teniendo los dos como ruta por defecto podremos anunciar communities para que los filtros de nuestros tránsitos hagan algo con ello, lo que hemos comentado antes.

Ahora, si tenemos al menos dos tránsitos con full routing ya podemos hacer hacer cosas interesantes como por ejemplo decir que para ir a un AS concreto vaya por un tránsito como elección principal diga lo que diga BGP porque os voy a contar un secreto «BGP es falible» y a veces la decisión que toma BGP no es la misma que la decisión que nosotros como administradores de ese AS tomamos.

Lo primero es recordar cual es la selección de rutas en BGP, os hago un resumen:

  1. Preferimos el path con mayor WEIGHT.
  2. Preferimos el path con mayor LOCAL PREFERENCE.
  3. Preferimos el path generados con network o redistribute sobre los agregados.
  4. Preferimos el path con el AS PATH más corto.
  5. Preferimos el path con ORIGIN TYPE menor, siendo el orden: IGP < EGP < Incompleto.
  6. Preferimos el path con menor MED.
  7. Preferimos eBGP sobre iBGP.
  8. Preferimos el path con menor métrica en el IGP hasta el peer BGP (el más cerecano)
  9. ….

La selección completa la tenéis enel documento titulado BGP Best Path Selection Algorithm (https://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/13753-25.html)

BGP por ejemplo puede decir que para ir al destino 192.0.2.1 el mejor tránsito es el primero de ellos y para ir a otro destino el segundo de ellos.

En este caso la decisión de encaminamiento ha sido tomada por el algoritmo de selección de path de BGP, vamos a suponer que la decisión se ha tomado en la selección del AS PATH más corto, pero vemos que por el AS PATH más corto tenemos un retardo de 153ms, mientras que por el otro tránsito el retardo es de 48ms, en este caso tendremos que decirle a nuestros routers que el camino bueno es por el segundo tránsito, aunque el algoritmo de selección de path de BGP diga lo contrario.

¿Cómo podemos modificar la decisión de routing en BGP o en cualquier otro protocolo? mediante filtros.

Los filtros van a estar compuestos por route-maps y estos van a tener sus condiciones y sus modificadores.

Por ejemplo, en el segundo tránsito podemos crear un filtro de la siguiente manera:

Router bgp 65510
  neighbour 198.51.100.2 remote-as 65512
  neighbour 198.51.100.2 route-map ruta_por_aqui in

route-map ruta_por_aqui permit 10
  match ip address prefix-list rutas_preferidas 
  set local-preference 150

ip prefix-list rutas_preferidas 192.0.2.0/24

En este ejemplo lo que hacemos es decir al router en el tránsito al 198.51.100.2 que lo que aprenda por ahí mire si está la 192.0.2.0/24 y que le aplique una Local Preference de 150, y como por defecto es 100 se preferirá este tránsito para ese prefijo.

Ahora queremos que el tráfico contra el AS12345 vaya siempre por este tránsito, en vez de utilizar un prefix-list usaremos un as-path:

Router bgp 65510
  neighbour 198.51.100.2 remote-as 65512
  neighbour 198.51.100.2 route-map ruta_por_aqui in

route-map ruta_por_aqui permit 10
  match as-path 10 
  set local-preference 150

ip as-path access-list 10 permit ^65000$

En este ejemplo lo que hacemos es decir que el tráfico del AS65000 tendrá una local preference de 150 por este tránsito.

Esta es la forma de hacerlo en Cisco, evidentemente en otros routers habrá que adaptar el filtro a cada router, pero la idea subyacente es la misma.

Y obviamente esto no funcionaría si recibimos sólo una ruta por defecto.