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.


