Enrutamiento BGP con FRRouting en Linux

FRRouting (FRR) es la suite de protocolos de enrutamiento dinámico de código abierto más utilizada en Linux, que permite implementar BGP para conectividad multi-homed, anuncio de prefijos y enrutamiento avanzado. Esta guía cubre la configuración de BGP con FRRouting, incluyendo la gestión de sistemas autónomos, peering, filtrado de rutas, comunidades BGP y la configuración de un Looking Glass.

Requisitos Previos

  • Ubuntu 20.04/22.04 o Debian 11/12 (FRRouting tiene paquetes oficiales)
  • Acceso root al servidor
  • Número de Sistema Autónomo (ASN) propio o asignado para eBGP
  • Al menos una interfaz de red con conectividad al peer BGP
  • Conocimientos básicos de redes IP y CIDR

Instalación de FRRouting

# Añadir el repositorio oficial de FRRouting
curl -s https://deb.frrouting.org/frr/keys.gpg | \
  gpg --dearmor > /usr/share/keyrings/frrouting.gpg

# Ubuntu 22.04 (jammy)
FRRVER="frr-stable"
echo "deb [signed-by=/usr/share/keyrings/frrouting.gpg] \
  https://deb.frrouting.org/frr \
  $(lsb_release -cs) ${FRRVER}" \
  > /etc/apt/sources.list.d/frr.list

# Instalar FRRouting con los daemons necesarios
apt update
apt install -y frr frr-pythontools

# Habilitar los daemons necesarios en /etc/frr/daemons
sed -i 's/^bgpd=no/bgpd=yes/' /etc/frr/daemons
# Si también necesitas OSPF:
# sed -i 's/^ospfd=no/ospfd=yes/' /etc/frr/daemons

# Iniciar FRRouting
systemctl enable frr
systemctl start frr

# Verificar que los daemons están corriendo
systemctl status frr
vtysh -c "show version"

Configuración Básica de BGP

FRRouting se configura mediante la shell interactiva vtysh:

# Entrar a la shell de FRRouting
vtysh

# O ejecutar comandos directamente sin entrar a la shell
vtysh -c "show bgp summary"

Configuración inicial del router BGP:

# Entrar en modo de configuración en vtysh
vtysh

configure terminal

# Configurar el nombre del router (identificador)
hostname mi-router-bgp

# Habilitar el reenvío de paquetes IP a nivel de sistema
# (también necesario en /etc/sysctl.conf)

# Configurar el proceso BGP con nuestro ASN
router bgp 65001

  # Identificador único del router (generalmente la IP del loopback)
  bgp router-id 10.0.0.1

  # Deshabilitar la verificación de primera hop (necesario en ciertos entornos)
  no bgp ebgp-requires-policy

  # Configurar las redes que anunciamos (ver sección de anuncio de prefijos)
  network 192.168.1.0/24

exit

# Guardar la configuración
write memory
exit

Activar el reenvío IP en el sistema:

# Activar el reenvío de paquetes IPv4
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# Verificar que está activo
sysctl net.ipv4.ip_forward

Establecimiento de Sesiones de Peering

vtysh

configure terminal

router bgp 65001
  bgp router-id 10.0.0.1

  # Configurar un peer eBGP (ASN diferente al nuestro)
  neighbor 203.0.113.1 remote-as 65002
  neighbor 203.0.113.1 description "Upstream Provider - AS65002"

  # Establecer contraseña MD5 para autenticación de la sesión BGP
  neighbor 203.0.113.1 password MiContraseñaSegura

  # Keepalive cada 10 segundos, timeout de 30 segundos
  neighbor 203.0.113.1 timers 10 30

  # Configurar un peer iBGP (mismo ASN, dentro de nuestra red)
  neighbor 10.0.0.2 remote-as 65001
  neighbor 10.0.0.2 description "Peer interno - Router 2"
  neighbor 10.0.0.2 update-source loopback0

  # Para iBGP, necesitamos especificar el next-hop
  neighbor 10.0.0.2 next-hop-self

  # Habilitar IPv4 para el address-family
  address-family ipv4 unicast
    neighbor 203.0.113.1 activate
    neighbor 10.0.0.2 activate
  exit-address-family

exit

write memory
exit

Verificar el estado de las sesiones:

# Ver el resumen de sesiones BGP
vtysh -c "show bgp summary"

# Ver los detalles de un peer específico
vtysh -c "show bgp neighbor 203.0.113.1"

# Ver las rutas recibidas de un peer
vtysh -c "show bgp neighbor 203.0.113.1 received-routes"

# Ver las rutas anunciadas a un peer
vtysh -c "show bgp neighbor 203.0.113.1 advertised-routes"

Anuncio de Prefijos

vtysh

configure terminal

router bgp 65001

  address-family ipv4 unicast
    # Anunciar un prefijo de nuestra propiedad
    network 192.168.100.0/24
    network 10.10.0.0/16

    # Anunciar un agregado (summarización de rutas)
    aggregate-address 192.168.0.0/20 summary-only
  exit-address-family

exit

# También puedes anunciar rutas usando route redistribution
# (redistribuir rutas estáticas en BGP)
configure terminal
router bgp 65001
  address-family ipv4 unicast
    redistribute static
    redistribute connected
  exit-address-family
exit

write memory
exit

Crear rutas estáticas hacia null para prevenir bucles:

# Añadir rutas null (blackhole) para los agregados que anunciamos
# Esto evita que el tráfico por rutas no específicas cause bucles
vtysh -c "configure terminal" \
  -c "ip route 192.168.100.0/24 null0" \
  -c "write memory"

Filtrado de Rutas y Route-Maps

vtysh

configure terminal

# Crear una prefix-list para filtrar rutas
ip prefix-list RUTAS-ACEPTADAS seq 10 permit 0.0.0.0/0 le 24
ip prefix-list RUTAS-ACEPTADAS seq 20 deny any

ip prefix-list MIS-PREFIJOS seq 10 permit 192.168.100.0/24
ip prefix-list MIS-PREFIJOS seq 20 deny any

# Crear un route-map para aplicar filtros y modificar atributos
route-map FILTRO-ENTRADA permit 10
  # Aceptar solo rutas en la prefix-list
  match ip address prefix-list RUTAS-ACEPTADAS
  # Establecer la preferencia local (mayor = preferida)
  set local-preference 150
  # Establecer el peso (solo local al router)
  set weight 100
exit

route-map FILTRO-SALIDA permit 10
  match ip address prefix-list MIS-PREFIJOS
  # Añadir AS-path prepending para hacer esta ruta menos preferida
  set as-path prepend 65001 65001
exit

# Aplicar los filtros al peer
router bgp 65001
  neighbor 203.0.113.1 route-map FILTRO-ENTRADA in
  neighbor 203.0.113.1 route-map FILTRO-SALIDA out
exit

write memory
exit

Comunidades BGP

Las comunidades BGP permiten etiquetar rutas para que los peers apliquen políticas:

vtysh

configure terminal

# Habilitar el soporte de comunidades extendidas
router bgp 65001
  neighbor 203.0.113.1 send-community both

  address-family ipv4 unicast
    # Habilitar envío de comunidades
    neighbor 203.0.113.1 send-community
  exit-address-family
exit

# Route-map para añadir comunidades a las rutas anunciadas
route-map ANUNCIO-CON-COMUNIDADES permit 10
  # Comunidad no-export: el peer no re-anuncia esta ruta
  set community 65001:100 no-export
exit

# Route-map para aceptar rutas y procesar comunidades
route-map RECIBIR-Y-FILTRAR permit 10
  # Aceptar rutas marcadas con la comunidad de clientes
  match community CLIENTES
  set local-preference 200
exit

# Definir la comunidad de matching
bgp community-list standard CLIENTES permit 65002:200

router bgp 65001
  neighbor 203.0.113.1 route-map RECIBIR-Y-FILTRAR in
exit

write memory
exit

BGP Multihop y eBGP

vtysh

configure terminal

router bgp 65001

  # Peer eBGP multihop (cuando el peer no es directamente adyacente)
  neighbor 203.0.113.10 remote-as 65003
  neighbor 203.0.113.10 description "Peer multihop a traves de firewall"

  # Permitir múltiples saltos (TTL configurable)
  neighbor 203.0.113.10 ebgp-multihop 5

  # Usar la IP del loopback como origen de la sesión
  neighbor 203.0.113.10 update-source lo

  # Para peering con Route Servers de IXP (no verificar AS-path)
  neighbor 203.0.113.20 remote-as 65535
  neighbor 203.0.113.20 description "Route Server IXP"

exit

write memory
exit

Solución de Problemas

# Ver el estado completo de BGP
vtysh -c "show bgp summary"

# Ver la tabla de rutas BGP
vtysh -c "show bgp ipv4 unicast"

# Buscar una ruta específica en la tabla BGP
vtysh -c "show bgp ipv4 unicast 192.168.100.0/24"

# Ver el historial de notificaciones y errores
vtysh -c "show bgp neighbor 203.0.113.1"

# Ver la tabla de enrutamiento del kernel
ip route show

# Depurar sesiones BGP en tiempo real (¡usar con cuidado en producción!)
vtysh -c "debug bgp updates"
vtysh -c "debug bgp neighbor-events"

# Ver los logs de FRRouting
journalctl -u frr -f

# Verificar la configuración activa
vtysh -c "show running-config"

# Hacer un ping desde FRRouting (útil para verificar conectividad al peer)
vtysh -c "ping 203.0.113.1 source 203.0.113.2"

La sesión BGP no sube:

# Verificar conectividad TCP al puerto 179
nc -zv 203.0.113.1 179

# Verificar que el firewall permite BGP
iptables -L | grep 179

# Verificar los logs de conexión
tcpdump -i eth0 host 203.0.113.1 and port 179

Conclusión

FRRouting proporciona una implementación completa y robusta de BGP en Linux, adecuada tanto para proveedores de servicios como para empresas con necesidades de conectividad multi-homed. La combinación de prefix-lists, route-maps y comunidades BGP permite implementar políticas de enrutamiento sofisticadas. Con la práctica, FRRouting y vtysh se vuelven herramientas naturales para gestionar infraestructuras de red complejas en entornos de producción.