domingo, 28 de junio de 2015

Script para ruta default en entornos BGP Multihomed.

    Hay mil maneras de configurar un entorno con mas de una salida a Internet. La mas usual (o la mas efectíva) es BGP (Multihomed). En mi escenario, tengo 2 routers MIKROTIK haciendo eBGP, cada uno en un extremo de la red. Con route-policy de BGP ajusto la entrada de tráfico (Down de clientes), pero la salida se la publico a toda mi red a través de OSPF. O dicho de otra manera, hacia dentro de mi red no se publica el Full Route a ningún router (soy pequeño y solo tengo 2 carriers). Únicamente se publica la ruta default via OSPF.
    Con este escenario, puede darse algún caso concreto, en el que los routers BGP estén activos, pero la sesion eBGP caida. Con este escenario concreto estaríamos publicando todavía la ruta default hacia dentro, pero en realidad no tenemos salida. Para solucionar esto me he tenido que currar un pequeño script que detecte el estado del peer BGP, y si está activo, que levante la ruta default.
 
Lo primero es decirle a OSPF que distribuya la ruta default solo en caso de tenerla instalada y activa.


/routing ospf instance
set distribute-default=if-installed-as-type-1 numbers=0

Después creamos la ruta default (estática), con un comentario (route_default), que es el que usará el script para activar o desactivar la ruta.

/ip route add dst-address=0.0.0.0/0 gateway=X.X.X.X comment="route_default" disabled=no

X.X.X.X Será la dirección de nuestro gateway. Normalmente la misma que la de nuestro peer BGP (excepto en peers Multihop).

Debemos configurar el peering eBGP con nuestro peer. Al nombre del peer le daremos el nombre "peerBGP1" . Nos aseguraremos de que conecte bien.

Con todo esto hecho, creamos un script como este:

/system script add name="Check_BGP" owner="admin" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive last-started=jun/28/2015 21:45:47 run-count=378 source=
       #Declare Variable. Nom del PEER BGP
       :global PeerName "peerBGP1";
       
       #Declare Variable. Nom de l'ultim estat conegut del peer BGP.
              :global BgpLastState
       
       #Declare Variable. Estat acutal del PeerBGP.
              :global BgpCurrentState [/routing bgp peer get [:pick [find name=$PeerName] 0] state];
       
       #Declare variable. Comentari que ha de tindre la ruta default.
              :global RouteComment "route_default";
       
       #Comprobe que el peer no estiga deshabilitat.
         :if ([:len $BgpCurrentState] = 0 ) do={:global BgpCurrentState "peer_disabled"};
       
       
       #Comprobe si hi han canvis d'estat i aplique configuracions.
              :if \
                  ($BgpLastState != $BgpCurrentState) do=\
                        {\
                             :if ($BgpCurrentState = "established")\
                                                                                  do=\
                                                                                               {\
                                                                                                  [ip route enable [find comment=$RouteComment]];\
                                                                                                  [:set BgpLastState $BgpCurrentState];\
                                                                                                  [:log info "peering BGP established";];\
                                                                                                  [:log warning  "ruta 0.0.0.0/0 habilitada";];\
                                                                                                 }\
                                                                                  else=\
                                                                                                {\
                                                                                                  [ip route disable [find comment=$RouteComment]];\
                                                                                                  [:set BgpLastState $BgpCurrentState];\
                                                                                                  [:log warning  "peering BGP caigut";];\
                                                                                                  [:log error  "ruta 0.0.0.0/0 deshabilitada";];\
                                                                                                 }                                        
              } 

Con el script funcionando solo nos queda añadirlo al Scheduler para que se ejecute cada 10 segundos.

/system scheduler add interval=10s on-event=Check_BGP name= schedule_bgp_script.

Todas las configuraciones las hago en los dos routers que hacen el eBGP.

De momento tengo el script en el escenario de pruebas, y funciona a la perfección. En breve pasará al entorno de producción. Se aceptan mejoras (y hasta críticas).

2 comentarios:

  1. Después de algún tiempo, y tras algún que otro curso de formación específico en BGP, detecto (mejor dicho, aprendo) que este escenario es mejorable. Básicamente se trataría de sumarizar mis rutas de IP's públicas activas via OSPF (en los Area Borders), y publicar las "networks" con el "Shincronyze" para forzar que solo se publiquen si me llegan (via OSPF). Con esto tendríamos el mismo efecto, que sería publicar de manera dinámica, sin la necesidad del Script. Lo tengo de momento pendiente de afinar en el simulador GNS3. En cuanto esté listo se verá por aquí.

    ResponderEliminar
  2. Buen artículo colega estoy aprendiendo de esto tengo un escenario similar tengo IPS públicas que mediante vlan de servicio se las doy al cliente, y tengo un fulltable del proveedor si quiero darle la ruta por default Al cliente le debo anunciar la IP con la que hago peering hacia el proveedor?

    ResponderEliminar