Para el que le pueda interesar el filtrado de rutas BGP se puede realizar utilizando expresiones regulares sobre la cadena as-path que forma parte de todas las rutas propagadas con este protocolo. Este post es un recordatorio de algunas expresiones que suelen ser útiles y algunos ejemplos más rebuscados para quien le pueda interesar.

La mayor parte de los sistemas operativos de los equipos de comunicaciones soportan expresiones POSIX, pero cada versión puede tener un alcance diferente, como ocurre con CISCO. Por el momen

Los caracteres con los que se implementan las funciones básicas son:

  • ^    inicio de cadena
  • $    final de cadena
  • .     cualquier carácter
  • _   cualquiera de los siguientes caracteres: espacio, inicio de cadena, final de cadena, corchete inicial o final, paréntesis inicial o final.
  • []   identifica un carácter dentro de un conjunto de valores ([134] = carácter 1,3 o 4) o un rango (delimitado por “-“)
  • –     delimitador del rango: por ejemplo cualquier número entre el 0 y el 3 [0-3]
  • ()   Agrupación lógica
  • +    Hay una repetición o más de una del último carácter o agrupación de la cadena
  • *     Ninguna repetición, una o más del último carácter o agrupación de la cadena
  • ?    Una instancia o ninguna del último carácter o agrupación de la cadena
  • |     Operador lógico OR

Algunos ejemplos básicos de una lista de prefijos o acceso en nomenclatrura CISCO pero trasladables fácilmente a otras plataformas (el xxx es el número de la access-list):

  • Permitir las rutas que nos anuncia el AS 65000 (en este caso es nuestro peer):
    ip as-path access-list  xxx  permit ^65000_
  • Permitir todas las rutas que se originen en el AS 65000:
    ip as-path access-list xxx  permit _65000$
  • Todas las rutas en las que aparezca el as 65000 en el as-path:
    ip as-path access-list xxx permit _65000_
  • Permitir todas las rutas:
    ip as-path access-list xxx permit .*
  • Permitir únicamente los prefijos locales (as-path vacío):
    ip as-path access-list xxx permit ^$
  • Permitir únicamente rutas de mis peers:
    ip as-path access-list xxx permit ^[0-9]+$
  • Permitir las rutas originadas por un cliente en tránsito – AS 65001 – con cualquier número de prepends:
    ip as-path access-list xxx permit ^(65001_)+$
  • Permitir las rutas originadas por un cliente en tránsito – AS 65001 – y un cliente en tránsito del AS65001 – AS65002 – con cualquier número de prepends:
    ip as-path access-list xxx permit ^(65001_)+(65002_)+$
  • Permitir las rutas que nos anuncia un determinado AS y cualquier número de prepends de ese mismo AS ( * incluye también ningún prepend):
    ip as-path access-list xxx permit ^65000(_65000)*$
  • Permitir las rutas que tienen su origen en el AS 65000 o el 65001:
    ip as-path access-list  xxx  permit _(65000|65001)$
  • Permitir las rutas que tienen su origen en el AS6501 y nos anuncia el 6500, con cualquier número de ASs entre ellos:
  • ip as-path access-list  xxx  permit  ^6500_(.+)_6501$
  • Permitir las rutas que tienen su origen en el AS6501 y nos anuncia el 6500 que transitan por un único AS (sea el que sea):
  • ip as-path access-list  xxx  permit ^6500_[0-9]+)_6501$

 

Esperamos completar este post con más ejemplos en breve.