BGP en Mikrotik

  • Introducción
  • Habilitar IPv6 en tu equipo
  • Definir las direcciones IP de tus interfaces para el IP transit, Perú IX (PIT Peru sac) (pitperu.net) y tu red interna
  • Definir el ASN de tu empresa (el ASN otorgado por LACNIC)
  • Crear los Filtros de Ruteo para el filtros OUT y filtros IN
  • Crear el Peer BGP con tu Proveedor de IP transit
  • Crear los Peers BGP con los Route Server del Perú IX (PIT Peru sac) (pitperu.net)
  • Definir los prefijos que vas a anunciar
  • Comprobar funcionamiento

Introducción

En Perú IX (PIT Peru sac) promovemos el uso de IPv6, y nuestro primer consejo es perderle el miedo. Si bien al principio puede parecer algo difícil ya que las direcciones son largas y no sólo consideran números sino que también algunas letras y el uso de los dos puntos, una vez que uno lo entiende es muy sencillo ya que guardar grandes similitudes con IPv4. En caso que aún no tengan ningún tipo de contacto con IPv6 les recomiendo revisar este video explicativo sobre los conceptos básicos de IPv6 https://www.youtube.com/watch?v=43VBLzwWwxU

En este ejemplo vamos a configurar tanto las direcciones IPv4 como IPv6, así como las sesiones BGP para IPv4 e IPv6.

Nota: dada la gran flexibilidad de Mikrotik es común que se use un único equipo para múltiples funciones como ruteo, firewall, queue y otros. Sin embargo, es altamente recomendable usar un equipo exclusivo (puede ser un CCR por ejemplo) para la función de router de borde, así lograremos que el consumo de CPU se mantenga bajo permitiendo un alto desempeño y dejar un margen de seguridad en caso que la cantidad de paquetes por segundo aumente significativamente. Esto es especialmente importante cuando estamos ruteando más de 3-4 Gbps.

Con el fin de ejemplificar las configuraciones haremos uso de algunos supuestos, los cuales deberán ser reemplazados con las direcciones IP asignadas por el proveedor de tránsito IP, Perú IX (PIT Peru sac) y LACNIC.

Habilitar IPv6 en tu equipo

Lo primero que haremos es habilitar IPv6 en nuestro Router Mikrotik

/system package enable ipv6
/system reboot 
y

Esto reiniciará el equipo, y al volver, tendremos un nuevo menú llamado IPv6

Además vamos a aprovechar de modificar el arp-timeout para ser un buen ciudadano, 4 horas suele ser un tiempo bastante prudente que evita estar enviando actualizaciones cada 5 minutos. Así como definir la cantidad máxima de entradas ARP y el número máximo de neighbor entries para IPv6.

/ip settings set 
arp-timeout=04:00:00 
set max-arp-entries=65535 
/ipv6 settings set max-neighbor-entries=8192

Definir las direcciones IPv4 e IPv6 de tus interfaces para IP transit, PIT Peru sacPerú IX (PIT Peru sac) (pitperu.net) y tu red interna

Supuestos para el ejemplo:

Supuestos para el ejemplo:

  • El ASN otorgado por LACNIC a nuestra organización es el AS 123456
  • Bloque IPv4 asignado por LACNIC es el 100.100.100.0/22
  • Bloque IPv6 asignado por LACNIC es el 2803:cd10::/32
  • Dirección IPv4 para el punto a punto del proveedor de IP transit 198.51.100.2/30 (donde el el equipo en el lado del Proveedor de IP transit contra el cual haremos el BGP es el 198.51.100.1)
  • Dirección IPv6 para el punto a punto del proveedor de IP transit 2803:dd99:1111::2/126 (donde el el equipo en el lado del Proveedor de IP transit contra el cual haremos el BGP es el 2803:dd99:1111::1)
  • Dirección IPv4 asignada por Perú IX (PIT Peru sac) (pitperu.net) es la 45.183.47.254/24
  • Dirección IPv6 asignada por Perú IX (PIT Peru sac) (pitperu.net) es la 2803:cd60:6411:5::ff/64
  • Configurar la direcciones IPv4 e IPv6 otorgadas por LACNIC en una interfaz loopback

    Esto es una forma bastante simple de dejar funcionando el nuevo segmento, ya que luego puedo ir subasignando prefijos más pequeños a los otros routers o equipos de mi red.

    Lo primero será crear una interfaz Loopback y asignarle las direcciones IPv4 e IPv6 otorgadas por LACNIC.

    /interface bridge add name=loopback
    #cambiar la 100.100.100.1/22 por la primera IPv4 del rango asignado por LACNIC#
    /ip address add address=100.100.100.1/22 interface=loopback 
    #cambiar la 2803:cd10::/32 por la primera IPv6 del rango asignado por LACNIC#
    /ipv6 address add address=2803:cd10::/32 advertise=no interface=loopback  

    Luego vamos a definir las direcciones IPv4 e IPv6 del Proveedor de IP transit, en caso que aún no estén ya definidas en el equipo:

    #cambiar la 198.51.100.2/30 por la IPv4 otorgada por tu Proveedor de IP transit#
    /ip address add address=198.51.100.2/30 interface=IP_TRANSIT
    #cambiar la 2803:dd99:1111::2/126 por la IPv6 otorgada por tu Proveedor de IP transit#
    /ipv6 address add address=2803:dd99:1111::2/126 advertise=no interface=IP_TRANSIT

    Finalmente, vamos a configurar las direcciones IP otorgadas por Perú IX (PIT Peru sac)

    #cambiar la 45.183.47.254/24 por la IPv4 asignada por Perú IX (PIT Peru sac)#
    /ip address add address=45.183.47.254/24 interface=PIT_PERU_sac 
    #cambiar la 2803:cd60:6411:5::ff/64 por la IPv6 asignada por Perú IX (PIT Peru sac)#
    /ipv6 address add address=2803:cd60:6411:5::ff/64 advertise=no interface=PIT_PERU_sac

    Definir el ASN de tu empresa (el ASN otorgado por LACNIC)

    En nuestro ejemplo vamos a asumir que LACNIC nos otorgó el ASN 123456, en router-id vamos a poner nuestra primera dirección IPv4 pública.

    #cambiar el name por el nombre que gustes, el as por tu número de ASN otorgado por LACNIC y en route-id puedes usar la IP de la loopback u otra#
    /routing bgp instance add name=AS123456 as=123456 router-id=100.100.100.1

    Crear los Filtros de Ruteo para los chain OUT y IN

    Antes de levantar las sesiones BGP es MUY IMPORTANTE crear los filtros de seguridad tanto de entrada como de salida.

    Importante: en los filtros el orden de los factores si importa, se procesa siempre primero el primer index de cada chain.

    Filtros de salida (OUT) IPv4

    #cambiar el 100.100.100.0/22 con tu prefijo asignado por LACNIC#
     
    /routing filter
    add action=accept chain=IP_TRANSIT_IPv4_OUT prefix=100.100.100.0/22 prefix-length=22
    add action=discard chain=IP_TRANSIT_IPv4_OUT
     
     
    #cambiar el 100.100.100.0/22 con tu prefijo asignado por LACNIC. Importante que al IX vamos a enviarle prefijos más específicos, en este caso /24s#
     
    /routing filter
    add action=accept chain=PIT_PERU_sac_IPv4_OUT prefix=100.100.100.0/22 prefix-length=22-24
    add action=discard chain=PIT_PERU_sac_IPv4_OUT

    Filtros de salida (OUT) IPv6

    #cambiar el 2803:cd10::/32 con tu prefijo IPv6 asignado por LACNIC#
     
    /routing filter
    add action=accept chain=IP_TRANSIT_IPv6_OUT prefix=2803:cd10::/32 prefix-length=32
    add action=discard chain=IP_TRANSIT_IPv6_OUT
     
     
    #cambiar el 2803:cd10::/32 con tu prefijo IPv6 asignado por LACNIC. Importante que al IX vamos a enviarle prefijos más específicos, en este caso /48s#
     
    /routing filter
    add action=accept chain=PIT_PERU_sac_IPv6_OUT prefix=2803:cd10::/32 prefix-length=32-48
    add action=discard chain=PIT_PERU_sac_IPv6_OUT

    ¿Por qué al Proveedor de IP transit le anunciamos /22 (un prefijo menos específico) y al Perú IX (PIT Peru sac) múltiples /24 (más específicos)?

    Esto es importante para asegurarnos que así el camino vía el Perú IX (PIT Peru sac) sea preferido vs el IP transit, y así evitar que tráfico que podría ser servido vía Perú IX (PIT Peru sac) sea en cambio servido vía IP transit

    Filtros de entrada (IN) IPv4

    Aquí debemos tomar la decisión si le pedimos al proveedor de IP transit que nos envíe la ruta por defecto solamente o si le pedimos la DFZ (tabla BGP completa sin ruta por defecto, también conocida como Full BGP)

    #esta primera línea sólo la usaremos si estamos aceptando ruta por defecto#
     
    /routing filter
    add action=accept chain=IP_TRANSIT_IPv4_IN prefix=0.0.0.0/0
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=45.183.47.0/24 prefix-length=24-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=10.0.0.0/8 prefix-length=8-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=100.64.0.0/10 prefix-length=10-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=127.0.0.0/8 prefix-length=8-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=169.254.0.0/16 prefix-length=16-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=172.16.0.0/12 prefix-length=12-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=192.0.8.0/24 prefix-length=24-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=192.88.99.0/24 prefix-length=24-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=192.168.0.0/16 prefix-length=16-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=198.18.0.0/15 prefix-length=15-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=198.51.0.0/24 prefix-length=24-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=203.0.113.0/24 prefix-length=24-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=224.0.0.0/4 prefix-length=4-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=240.0.0.0/4 prefix-length=4-32
    add action=discard chain=IP_TRANSIT_IPv4_IN prefix=0.0.0.0/0 prefix-length=25-32
    add action=accept chain=IP_TRANSIT_IPv4_IN
     
     
     
    en los filtros del chain de Perú IX (PIT Peru sac) también aplicaremos filtros, aunque los Route Server aplican filtros es importante siempre aplicar filtros de todos modos#
     
    /routing filter
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=0.0.0.0/0
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=45.183.47.0/24 prefix-length=24-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=10.0.0.0/8 prefix-length=8-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=100.64.0.0/10 prefix-length=10-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=127.0.0.0/8 prefix-length=8-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=169.254.0.0/16 prefix-length=16-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=172.16.0.0/12 prefix-length=12-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=192.0.8.0/24 prefix-length=24-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=192.88.99.0/24 prefix-length=24-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=192.168.0.0/16 prefix-length=16-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=198.18.0.0/15 prefix-length=15-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=198.51.0.0/24 prefix-length=24-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=203.0.113.0/24 prefix-length=24-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=224.0.0.0/4 prefix-length=4-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=240.0.0.0/4 prefix-length=4-32
    add action=discard chain=PIT_PERU_sac_IPv4_IN prefix=0.0.0.0/0 prefix-length=25-32
    add action=accept chain=PIT_PERU_sac_IPv4_IN

    Filtros de entrada (IN) IPv6

    Aquí debemos aceptar todos los prefijos que nos envíe el Perú IX (PIT Peru sac) excepto aquellos que se recomiendan en el filtrado de buenas prácticas

    #la primera línea sólo se usará si aceptamos la ruta por defecto#
     
    /routing filter
    add action=accept chain=IP_TRANSIT_IPv6_IN prefix=::/0
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=100::/64 prefix-length=64-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=2001:2::/48 prefix-length=48-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=2001:10::/28 prefix-length=28-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=2001:db8::/32 prefix-length=32-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=2002::/16 prefix-length=16-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=3ffe::/16 prefix-length=16-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=fc00::/7 prefix-length=7-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=fe80::/10 prefix-length=10-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=fec0::/10 prefix-length=10-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=ff00::/8 prefix-length=8-128
    add action=discard chain=IP_TRANSIT_IPv6_IN prefix=::/0 prefix-length=65-128
    add action=accept chain=IP_TRANSIT_IPv6_IN
     
    #en los filtros del chain de Perú IX (PIT Peru sac) también aplicaremos filtros, aunque los Route Server aplican filtros es importante siempre aplicar filtros de todos modos#
    /routing filter
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=::/0
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=100::/64 prefix-length=64-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=2001:2::/48 prefix-length=48-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=2001:10::/28 prefix-length=28-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=2001:db8::/32 prefix-length=32-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=2002::/16 prefix-length=16-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=3ffe::/16 prefix-length=16-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=fc00::/7 prefix-length=7-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=fe80::/10 prefix-length=10-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=fec0::/10 prefix-length=10-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=ff00::/8 prefix-length=8-128
    add action=discard chain=PIT_PERU_sac_IPv6_IN prefix=::/0 prefix-length=65-128
    add action=accept chain=PIT_PERU_sac_IPv6_IN

    Crear el Peer BGP con tu Proveedor de IP transit

    En nuestro ejemplo nuestro Proveedor de IP transit tiene el ASN 1200, quien en nuestro ejemplo usará la IP 198.51.100.1. Se deberá reemplazar el 1200 por el ASN de tu proveedor de IP transit y el 198.51.100.1 por la IP para el BGP del gateway que te da tu proveedor de IP transit.

    #Cambiar la instancia por la que corresponde en tu caso, lo mismo en la remote-address y remote-as#
    /routing bgp peer add name=IP_TRANSIT_IPv4 instance=AS123456 remote-address=198.51.100.1 remote-as=1200 in-filter=IP_TRANSIT_IPv4_IN out-filter=IP_TRANSIT_IPv4_OUT remove-private-as=yes
    #Cambiar la instancia por la que corresponde en tu caso, lo mismo en la remote-address y remote-as#
    /routing bgp peer add name=IP_TRANSIT_IPv6 instance=AS123456 remote-address=2803:dd99:1111::1 remote-as=1200 in-filter=IP_TRANSIT_IPv6_IN out-filter=IP_TRANSIT_IPv6_OUT remove-private-as=yes address-families=ipv6

    Crear los Peers BGP con los Route Server del Perú IX (PIT Peru sac) (pitperu.net)

    En este ejemplo vamos a configurar ambos Route Server IPv4 e IPv6 de Perú IX (PIT Peru sac), es decir, el RS1 y el RS2, en nuestro ejemplo se nos asignó la contraseña BGP “peeringinperu”

    /routing bgp peer
    add name=PERU_IX_RS1_IPv4 instance=AS123456 remote-address=45.183.47.1 remote-as=64115 tcp-md5-key=peeringinperu max-prefix-limit=12000 max-prefix-restart-time=360 in-filter=PIT_PERU_sac_IPv4_IN out-filter=PIT_PERU_sac_IPv4_OUT remove-private-as=yes
    add name=PERU_IX_RS2_IPv4 instance=AS123456 remote-address=45.183.47.2 remote-as=64115 tcp-md5-key=peeringinperu max-prefix-limit=12000 max-prefix-restart-time=360 in-filter=PIT_PERU_sac_IPv4_IN out-filter=PIT_PERU_sac_IPv4_OUT remove-private-as=yes
     
    add name=PERU_IX_RS1_IPv6 instance=AS123456 remote-address=2803:cd60:6411:5::1 remote-as=64115 tcp-md5-key=peeringinperu max-prefix-limit=12000 max-prefix-restart-time=360 in-filter=PIT_PERU_sac_IPv6_IN out-filter=PIT_PERU_sac_IPv6_OUT remove-private-as=yes address-families=ipv6
    add name=PERU_IX_RS2_IPv6 instance=AS123456 remote-address=2803:cd60:6411:5::2 remote-as=64115 tcp-md5-key=peeringinperu max-prefix-limit=12000 max-prefix-restart-time=360 in-filter=PIT_PERU_sac_IPv6_IN out-filter=PIT_PERU_sac_IPv6_OUT remove-private-as=yes address-families=ipv6

    Definir los prefijos que vas a anunciar

    Aquí deberemos cambiar los prefijos por los que nos asignó LACNIC y lo anunciaremos tanto como /22 como en /24s. En IPv6 lo anunciaremos por ahora sólo como un /32.

    /routing bgp network
    add network=100.100.100.0/22 synchronize=no
    add network=100.100.100.0/24 synchronize=no
    add network=100.100.101.0/24 synchronize=no
    add network=100.100.102.0/24 synchronize=no
    add network=100.100.103.0/24 synchronize=no
    add network=2803:cd10::/32 synchronize=no 

    Comprobar funcionamiento

    Comprobar el estado de los Peers BGP, si están operacionales deben decir status Established, si dice Connect o Idle quiere decir que algo no está bien configurado en tu lado o el del proveedor.

       /routing bgp peer print

    Espero esta guía les sirva para entrar en el lindo mundo de BGP de manera fácil y segura. Hice mi mejor esfuerzo para que este documento esté libre de errores, pero entre tanta línea si pueden haber algunos. Si encuentras alguno agradeceré me lo puedas comentar a [email protected] para así corregirlo.

    Limitaciones de BGP en Mikrotik RouterOS

    Debido al gran número de preguntas les comparto una lista de las limitaciones que RouterOS tiene, al menos en su versión 6.x.x con BGP

    • Cambios en filtros BGP no se reflejan en las rutas recibidas o enviadas a un Peer BGP
      Para resolver esto pueden apagar y volver a encender los filtros del chain correspondiente, en caso que no funcione, se puede cambiar el orden de los filtros. Y recordar hay que tener paciencia con BGP en RouterOS, ya que es un proceso single-core solamente. No afecta el ruteo en si, pero si es importante comprobar luego de hacer un cambio para asegurarse que lo efectuó.
    • No muestra la lista de Advertisements en la GUI de Winbox, esto es otra limitación bien conocida, la forma de resolverlo es abrir el Terminal y escribir el comando “/routing bgp advertisements print”
    • Tiempo de convergencia lento, esto debido a que BGP en RouterOS 6.x es un proceso single-core, y por lo tanto no puede aprovechar los múltiples núcleos del CPU.
    • Cuando se obtiene la tabla completa BGP (DFZ) desde un Peer BGP, es muy lento al mostrar todas las rutas en la GUI de Winbox. Mi consejo usar regex y usar el comando “/ip route print…” en vez de ver las rutas vía GUI.
    • Estos puntos no quieren decir que BGP ande mal en RouterOS para nada, simplemente que hay que aprender a vivir con estas limitaciones y tenerlas presentes.