Configuración de BGP con FRRouting en un VPS Linux

14 min de lectura·Matthieu·bgpfrroutingfrrnetworkingipv6firewall|

Guía paso a paso para configurar BGP con FRRouting y anunciar tus propios prefijos IPv4 e IPv6 desde un VPS Linux. Incluye instalación, configuración con vtysh, prefix-lists, route-maps, GTSM y reglas de firewall con nftables.

Este tutorial explica cómo configurar FRRouting (FRR) para anunciar tus propios prefijos IPv4 e IPv6 vía BGP desde un VPS Linux. Todos los comandos están probados en Debian 12 y Ubuntu 24.04 con FRR 10.5.

Al finalizar tendrás una sesión eBGP activa con tu proveedor upstream, originación de prefijos dual-stack mediante interfaces dummy persistentes, filtrado de rutas entrante y saliente, seguridad de sesión con GTSM y reglas de firewall nftables protegiendo TCP 179.

Si estas evaluando entre FRR y BIRD2, ambos son opciones sólidas. FRR usa una CLI estilo Cisco (vtysh) que resulta familiar si has trabajado con IOS o JunOS. BIRD2 usa un archivo de configuración declarativo. Esta guia cubre FRR. Para BIRD2, consulta Configuración de BGP con BIRD2 en un VPS Linux.

Para contexto sobre cómo traer tu propio espacio IP a un VPS, consulta BGP y Bring Your Own IP en un VPS: la guía completa.

Requisitos previos

Antes de empezar, necesitas:

  • Un ASN (Autonomous System Number) público. Si no tienes uno, consulta Cómo registrar un ASN en RIPE NCC.
  • Al menos un prefijo IPv4 /24 o IPv6 /48 asignado a tu ASN.
  • Objetos ROA (Route Origin Authorization) creados en el panel RPKI de tu RIR. Consulta RPKI ROA para BGP: crear ROAs, validar rutas en BIRD2 y FRR.
  • Un proveedor upstream que ofrezca una sesión BGP (IP transit o peering). Necesitarás: el ASN del proveedor, las direcciónes IPv4 e IPv6 del peer y una contraseña MD5 acordada si corresponde.
  • Un VPS Linux con Debian 12 (Bookworm) o Ubuntu 24.04 (Noble). Acceso root o sudo.

A lo largo de esta guia, reemplaza estos placeholders con tus valores reales:

Placeholder Significado Ejemplo
YOUR_ASN Tu número de AS 212345
PEER_ASN Numero de AS del proveedor upstream 6939
PEER_IPV4 IPv4 del peer BGP del proveedor 198.51.100.1
PEER_IPV6 IPv6 del peer BGP del proveedor 2001:db8:1::1
YOUR_IPV4 Tu lado del peering BGP (IPv4) 198.51.100.2
YOUR_IPV6 Tu lado del peering BGP (IPv6) 2001:db8:1::2
YOUR_PREFIX_V4 Tu prefijo IPv4 203.0.113.0/24
YOUR_PREFIX_V6 Tu prefijo IPv6 2001:db8:abc::/48
MD5_PASSWORD Contrasena TCP MD5 acordada (de tu proveedor)

Cómo instalar FRRouting en Debian 12 y Ubuntu 24.04

Instala FRR desde el repositorio apt oficial para obtener la última versión estable (10.5.x a marzo de 2026). Los paquetes de las distribuciones Debian y Ubuntu suelen estar varias versiónes principales por detras. El repositorio oficial sigue la rama estable actual y soporta tanto Bookworm cómo Noble.

Agrega la clave GPG de firma:

curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null

Agrega el repositorio. Usa frr-stable para seguir la última rama estable:

FRRVER="frr-stable"
echo deb '[signed-by=/usr/share/keyrings/frrouting.gpg]' https://deb.frrouting.org/frr \
     $(lsb_release -s -c) $FRRVER | sudo tee /etc/apt/sources.list.d/frr.list

Instala FRR y las herramientas Python (necesarias para frr-reload.py):

sudo apt update && sudo apt install -y frr frr-pythontools

Verifica la versión instalada:

sudo vtysh -c "show versión" | head -1

Salida esperada:

FRRouting 10.5.3 (<hostname>) on Linux(6.8.0-xxx-generic).

FRR se instala cómo servicio systemd. Actívalo para que sobreviva a reinicios e inicialo de inmediato:

sudo systemctl enable --now frr

Verifica que está corriendo:

systemctl status frr

Deberías ver active (running) en la salida. FRR ejecuta múltiples daemons (zebra, bgpd, etc.) gestionados por un único proceso padre.

Cómo activar el daemon BGP en FRR

FRR viene con todos los daemons de protocolo desactivados excepto zebra. Debes activar explícitamente bgpd en el archivo daemons antes de que FRR inicie un proceso BGP. El archivo daemons se encuentra en /etc/frr/daemons.

Edita el archivo daemons:

sudo nano /etc/frr/daemons

Busca la línea bgpd y ponla en yes:

bgpd=yes

Los demás daemons (ospfd, isisd, etc.) pueden quedarse en no a menos que los necesites. Zebra siempre está activado y gestiona la tabla de rutas del kernel.

Esto es lo que hace cada daemon:

Daemon Función Por defecto
zebra Gestion de rutas del kernel, seguimiento de interfaces siempre activo
bgpd Protocolo BGP no
ospfd OSPFv2 no
ospf6d OSPFv3 (IPv6) no
ripd RIP no
isisd IS-IS no
staticd Rutas estáticas via vtysh no

Reinicia FRR para aplicar el cambio:

sudo systemctl restart frr

Verifica que bgpd está corriendo:

sudo vtysh -c "show bgp summary"

Deberías ver % BGP instance not found. Eso es normal: bgpd está ejecutándose, pero no se ha configurado ningun router bgp todavía. Lo haremos a continuación.

Conceptos básicos de vtysh

vtysh es la shell integrada de FRR. Proporciona una CLI estilo Cisco para configurar todos los daemons de FRR desde una sola interfaz. Algunos aspectos esenciales antes de empezar a configurar.

Entra a vtysh:

sudo vtysh

Ahora estas en la CLI de FRR. El prompt muestra el hostname. Los modos que usarás:

Modo Entrar con Prompt Propósito
Exec (por defecto) # Comandos show, verificación
Config configure terminal (config)# Configuración global
Router BGP router bgp ASN (config-router)# Configuración BGP
Address-family address-family ipv4 únicast (config-router-af)# Configuración por AFI/SAFI

Para guardar la configuración en ejecucion a disco:

write memory

Esto escribe en /etc/frr/frr.conf. FRR usa un modelo de configuración integrado por defecto: todas las configuraciónes de los daemons residen en un único archivo.

Sal de vtysh con exit o end (vuelve al modo exec desde cualquier submodo).

Cómo configurar una sesión BGP con el proveedor upstream

Entra a vtysh y al modo configure terminal para establecer la configuración base de BGP. Esto crea el proceso router, define el router ID, desactiva IPv4 únicast automático (para que controles exactamente que address families se activan por vecino) y define el peer upstream.

sudo vtysh
configure terminal

router bgp YOUR_ASN
 bgp router-id YOUR_IPV4
 no bgp default ipv4-únicast

 neighbor PEER_IPV4 remote-as PEER_ASN
 neighbor PEER_IPV4 description Upstream-v4
 neighbor PEER_IPV4 password MD5_PASSWORD
 neighbor PEER_IPV4 ttl-security hops 1
 neighbor PEER_IPV4 soft-reconfiguration inbound

 neighbor PEER_IPV6 remote-as PEER_ASN
 neighbor PEER_IPV6 description Upstream-v6
 neighbor PEER_IPV6 password MD5_PASSWORD
 neighbor PEER_IPV6 ttl-security hops 1
 neighbor PEER_IPV6 soft-reconfiguration inbound

Que hace cada directiva:

  • bgp router-id: Un identificador de 32 bits, típicamente tu dirección IPv4 principal. Debe ser único en el peering.
  • no bgp default ipv4-únicast: Evita que FRR active automáticamente IPv4 únicast para cada vecino. Activas las address families explícitamente. Esta es la practica estándar para configuraciónes dual-stack.
  • ttl-security hops 1: Activa GTSM (RFC 5082). Requiere que los paquetes lleguen con TTL 254 (a un salto de distancia). Descarta paquetes BGP falsificados de fuentes remotas. Mutuamente excluyente con ebgp-multihop.
  • password: Establece autenticación TCP MD5 (RFC 2385). Ambos lados deben coincidir en la misma cadena. No todos los proveedores usan esto. Omítelo si tu proveedor no lo requiere.
  • soft-reconfiguration inbound: Almacena las rutas recibidas en memoria para poder aplicar cambios de politica sin reiniciar la sesión. Usa más RAM pero evita caidas de sesión al actualizar filtros.

No salgas del modo config todavía. Agregaremos address families y filtros a continuación.

Cómo anunciar tus propios prefijos IPv4 e IPv6

La originación de prefijos en FRR requiere dos cosas: una declaracion network en la configuración BGP y que el prefijo este presente en la tabla de rutas del kernel. La forma más sencilla de inyectar el prefijo en el kernel es mediante una interfaz dummy. Primero configuraremos las interfaces dummy y luego las address families de BGP.

Cómo crear interfaces dummy persistentes para originación de prefijos

Una interfaz dummy es una interfaz tipo loopback que mantiene una dirección IP sin estar vinculada a hardware fisico. El daemon zebra de FRR recoge las rutas del kernel, asi que si tu prefijo esta asignado a una interfaz dummy, zebra lo instala y bgpd puede anunciarlo.

Crea las interfaces dummy usando systemd-networkd para que persistan entre reinicios.

Crea el archivo netdev:

sudo tee /etc/systemd/network/10-dummy-bgp.netdev > /dev/null << 'EOF'
[NetDev]
Name=dummy-bgp
Kind=dummy
EOF

Crea el archivo network con tus prefijos:

sudo tee /etc/systemd/network/10-dummy-bgp.network > /dev/null << 'EOF'
[Match]
Name=dummy-bgp

[Address]
Address=YOUR_PREFIX_V4

[Address]
Address=YOUR_PREFIX_V6
EOF

Para la dirección IPv4, usa la primera IP utilizable de tu prefijo (ej., 203.0.113.1/24). Para IPv6, usa cualquier dirección dentro de tu prefijo (ej., 2001:db8:abc::1/48).

Activa systemd-networkd si no está activo y reinicialo:

sudo systemctl enable --now systemd-networkd
sudo systemctl restart systemd-networkd

Verifica que la interfaz dummy está activa:

ip addr show dummy-bgp

Deberías ver ambas direcciónes IPv4 e IPv6 asignadas a la interfaz.

Verifica que las rutas están en el kernel:

ip route show dev dummy-bgp
ip -6 route show dev dummy-bgp

Configuración de address-family

De vuelta en el modo config de vtysh (o vuelve a entrar con sudo vtysh luego configure terminal y router bgp YOUR_ASN):

 address-family ipv4 únicast
  network YOUR_PREFIX_V4
  neighbor PEER_IPV4 activate
  neighbor PEER_IPV4 route-map EXPORT-V4 out
  neighbor PEER_IPV4 route-map IMPORT-V4 in
  neighbor PEER_IPV4 prefix-list BOGONS-V4 in
  neighbor PEER_IPV4 maximum-prefix 500000 80
 exit-address-family

 address-family ipv6 únicast
  network YOUR_PREFIX_V6
  neighbor PEER_IPV6 activate
  neighbor PEER_IPV6 route-map EXPORT-V6 out
  neighbor PEER_IPV6 route-map IMPORT-V6 in
  neighbor PEER_IPV6 prefix-list BOGONS-V6 in
  neighbor PEER_IPV6 maximum-prefix 200000 80
 exit-address-family

Detalles:

  • activate activa el vecino dentro de esta address family. Necesario porque desactivamos bgp default ipv4-únicast.
  • network indica a bgpd que origine este prefijo. El prefijo debe existir en la tabla de rutas del kernel (zebra lo recoge de la interfaz dummy).
  • maximum-prefix 500000 80 cierra la sesión si el peer envia más de 500.000 prefijos IPv4. El 80 genera una advertencia al 80% (400.000). Ajusta segun recibas tabla completa o solo ruta por defecto. Para sesión solo con ruta por defecto, establece 10.
  • Las referencias a route-map y prefix-list apuntan a filtros que definiremos a continuación.

Cómo filtrar rutas BGP con prefix-lists y route-maps

El filtrado de rutas no es opcional. Sin filtros de salida, un error de configuración podria filtrar prefijos que no te pertenecen. Sin filtros de entrada, aceptas rutas bogon y potencialmente haces blackhole del trafico. Esto sigue RFC 7454 (BGP Operations and Security).

Para un análisis más detallado de estrategias de filtrado, consulta Filtrado de rutas BGP: Prefix Lists, Filtros AS-Path, Rechazo de Bogons y GTSM.

Prefix-lists de salida

Solo anuncia prefijos que te pertenecen. Nada más.

ip prefix-list OUR-PREFIXES-V4 seq 10 permit YOUR_PREFIX_V4
ip prefix-list OUR-PREFIXES-V4 seq 999 deny any

ipv6 prefix-list OUR-PREFIXES-V6 seq 10 permit YOUR_PREFIX_V6
ipv6 prefix-list OUR-PREFIXES-V6 seq 999 deny any

Si anuncias múltiples prefijos, agrega más líneas permit con números de secuencia crecientes.

Prefix-lists de entrada para bogons

Rechaza prefijos que nunca deberían aparecer en internet público. Esta lista sigue la NLNOG BGP Filter Guide:

ip prefix-list BOGONS-V4 seq 10 deny 0.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 20 deny 10.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 30 deny 100.64.0.0/10 le 32
ip prefix-list BOGONS-V4 seq 40 deny 127.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 50 deny 169.254.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 60 deny 172.16.0.0/12 le 32
ip prefix-list BOGONS-V4 seq 70 deny 192.0.2.0/24 le 32
ip prefix-list BOGONS-V4 seq 80 deny 192.88.99.0/24 le 32
ip prefix-list BOGONS-V4 seq 90 deny 192.168.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 100 deny 198.18.0.0/15 le 32
ip prefix-list BOGONS-V4 seq 110 deny 198.51.100.0/24 le 32
ip prefix-list BOGONS-V4 seq 120 deny 203.0.113.0/24 le 32
ip prefix-list BOGONS-V4 seq 130 deny 224.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 140 deny 240.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 999 permit 0.0.0.0/0 le 24

ipv6 prefix-list BOGONS-V6 seq 10 deny ::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 20 deny 100::/64 le 128
ipv6 prefix-list BOGONS-V6 seq 30 deny 2001:2::/48 le 128
ipv6 prefix-list BOGONS-V6 seq 40 deny 2001:10::/28 le 128
ipv6 prefix-list BOGONS-V6 seq 50 deny 2001:db8::/32 le 128
ipv6 prefix-list BOGONS-V6 seq 60 deny 3fff::/20 le 128
ipv6 prefix-list BOGONS-V6 seq 70 deny 2002::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 80 deny 3ffe::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 90 deny 5f00::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 100 deny fc00::/7 le 128
ipv6 prefix-list BOGONS-V6 seq 110 deny fe80::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 120 deny fec0::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 130 deny ff00::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 999 permit ::/0 le 48

La última línea permit de cada lista acepta todo lo que no fue explícitamente denegado. El le 24 (IPv4) y le 48 (IPv6) rechazan prefijos demasiado específicos: nadie debería anunciar un /25 o más largo en IPv4, ni un /49 o más largo en IPv6.

Route-maps

Los route-maps unen las prefix-lists y te dan un lugar para agregar más politicas despues (local-pref, communities, AS-path prepending).

route-map EXPORT-V4 permit 10
 match ip address prefix-list OUR-PREFIXES-V4

route-map EXPORT-V6 permit 10
 match ipv6 address prefix-list OUR-PREFIXES-V6

route-map IMPORT-V4 permit 10
 match ip address prefix-list BOGONS-V4

route-map IMPORT-V6 permit 10
 match ipv6 address prefix-list BOGONS-V6

Los route-maps de exportacion solo permiten tus propios prefijos. Todo lo demás se deniega implicitamente (FRR deniega todo lo que no coincide explícitamente con un route-map). Los route-maps de importacion pasan el trafico a traves de la prefix-list de bogons, que deniega los rangos bogon y permite todo lo demás.

Guarda la configuración:

write memory

Verifica que la config se escribio:

ls -la /etc/frr/frr.conf

El archivo debería mostrar una marca de tiempo de modificacion reciente con propiedad frr:frr y permisos 640.

Cómo proteger la sesión BGP y TCP 179

BGP corre en TCP puerto 179. Cualquier host en internet puede intentar conectarse. Además de GTSM y la autenticación MD5 ya configurados, necesitas reglas de firewall para restringir TCP 179 a las direcciónes de tus peers.

Reglas de firewall con nftables

Instala nftables si no está presente. En instalaciónes minimás de Ubuntu 24.04 no viene incluido por defecto:

sudo apt install -y nftables

Crea el directorio /etc/nftables.d/ para archivos de configuración adicionales y agrega una directiva include al archivo principal de nftables para que las reglas personalizadas persistan entre reinicios:

sudo mkdir -p /etc/nftables.d
echo 'include "/etc/nftables.d/*.conf"' | sudo tee -a /etc/nftables.conf

Crea un archivo de configuración nftables dedicado para BGP:

sudo tee /etc/nftables.d/bgp.conf > /dev/null << 'EOF'
table inet bgp-filter {
    set bgp_peers_v4 {
        type ipv4_addr
        elements = { PEER_IPV4 }
    }

    set bgp_peers_v6 {
        type ipv6_addr
        elements = { PEER_IPV6 }
    }

    chain input {
        type filter hook input priority 0; policy accept;

        # Allow BGP from known peers only
        tcp dport 179 ip saddr @bgp_peers_v4 accept
        tcp dport 179 ip6 saddr @bgp_peers_v6 accept

        # Allow BGP return traffic (our side initiates)
        tcp sport 179 ip saddr @bgp_peers_v4 accept
        tcp sport 179 ip6 saddr @bgp_peers_v6 accept

        # Drop all other BGP attempts
        tcp dport 179 drop
        tcp sport 179 drop
    }
}
EOF

Si ya tienes una configuración nftables existente, integra estas reglas en tu chain input existente en lugar de crear una tabla separada. El enfoque anterior es autocontenido y no interfiere con otras reglas de firewall.

Para agregar múltiples peers, añade sus IPs al set elements:

elements = { 198.51.100.1, 203.0.113.1 }

Activa nftables para que las reglas persistan entre reinicios y recarga para aplicar el nuevo include:

sudo systemctl enable --now nftables
sudo systemctl reload nftables

Verifica que las reglas están cargadas:

sudo nft list table inet bgp-filter

Deberías ver las IPs de tus peers en los sets y las reglas del chain listadas.

Resumen de seguridad

Proteccion Que hace Configurado en
GTSM (ttl-security hops 1) Descarta paquetes BGP que no son de un peer directamente conectado vtysh, por vecino
TCP MD5 (password) Autentica segmentos TCP, previene inyeccion de RST vtysh, por vecino
Prefix-list (salida) Solo anuncia tus propios prefijos vtysh, route-map
Prefix-list (entrada) Rechaza rangos bogon/reservados vtysh, por vecino
maximum-prefix Cierra la sesión si el peer envia demasiadas rutas vtysh, por address-family
nftables Restringe TCP 179 a IPs de peers conocidos /etc/nftables.d/bgp.conf

Cómo verificar la sesión BGP y la propagación de prefijos

Despues de guardar la configuración con write memory, la sesión BGP debería empezar a establecerse. La verificación se hace en tres etapas: comprobaciones locales con vtysh, tabla de rutas del kernel y looking glasses externos.

Comandos de verificación en vtysh

Comando Que muestra
show bgp summary Todos los peers, su estado, prefijos recibidos
show bgp ipv4 únicast Tabla BGP IPv4
show bgp ipv6 únicast Tabla BGP IPv6
show bgp ipv4 únicast neighbors PEER_IPV4 advertised-routes Lo que estas enviando al peer
show bgp ipv4 únicast neighbors PEER_IPV4 received-routes Lo que el peer te envia (requiere soft-reconfiguration inbound)
show ip bgp neighbors PEER_IPV4 Estado detallado del vecino, uptime, capabilities

Comprueba el estado de la sesión:

sudo vtysh -c "show bgp summary"

Salida esperada (recortada):

IPv4 Unicast Summary:
BGP router identifier YOUR_IPV4, local AS number YOUR_ASN, vrf default
Neighbor        V    AS   MsgRcvd  MsgSent  TblVer   InQ  OutQ  Up/Down  State/PfxRcd
PEER_IPV4       4  PEER_ASN   1205     843       0      0     0 01:23:45        12

Observa la columna State/PfxRcd. Un número indica que la sesión está establecida y se recibieron esa cantidad de prefijos. Si ves Active, Connect u OpenSent, la sesión aun no está activa. Consulta la seccion de solución de problemás.

Verifica que tu prefijo se esta anunciando:

sudo vtysh -c "show bgp ipv4 únicast neighbors PEER_IPV4 advertised-routes"

Tu prefijo debería aparecer en la salida. Si no aparece, verifica que:

  1. La interfaz dummy está activa (ip addr show dummy-bgp).
  2. La ruta existe en el kernel (ip route show YOUR_PREFIX_V4).
  3. La declaracion network coincide con el prefijo y mascara exactos.

Verificacion externa

Comprueba desde fuera de tu red que el prefijo es visible en internet.

Desde tu maquina local (no el VPS):

traceroute YOUR_PREFIX_V4_FIRST_IP

Usa bgp.tools para buscar tu prefijo y verificar:

  • El AS de origen coincide con tu ASN.
  • El estado ROA muestra "Valid" (no "Unknown" ni "Invalid").
  • El prefijo es visible desde múltiples puntos de vista.

También puedes consultar el looking glass de RIPE RIS:

curl -s "https://stat.ripe.net/data/looking-glass/data.json?resource=YOUR_PREFIX_V4" | python3 -m json.tool | head -50

Persistencia de la configuración

FRR guarda su configuración en /etc/frr/frr.conf cuando ejecutas write memory en vtysh. Mientras el servicio FRR este activado (systemctl enable frr), lee este archivo al arrancar.

Verifica ambos mecanismos de persistencia:

sudo systemctl is-enabled frr

Debería devolver enabled.

sudo vtysh -c "show running-config" | head -5

Compara con el archivo guardado:

head -5 /etc/frr/frr.conf

Deberían coincidir. Si difieren, ejecuta write memory de nuevo.

La interfaz dummy persiste a traves de systemd-networkd (configurada antes). Verifica:

sudo systemctl is-enabled systemd-networkd

frr.conf completo y anotado

Aquí tienes una configuración de ejemplo completa cómo referencia. Reemplaza todos los placeholders con tus valores.

frr versión 10.5.3
frr defaults traditional
hostname bgp-vps
log syslog informational
!
! --- Prefix-lists: salida (solo nuestros prefijos) ---
ip prefix-list OUR-PREFIXES-V4 seq 10 permit 203.0.113.0/24
ip prefix-list OUR-PREFIXES-V4 seq 999 deny any
!
ipv6 prefix-list OUR-PREFIXES-V6 seq 10 permit 2001:db8:abc::/48
ipv6 prefix-list OUR-PREFIXES-V6 seq 999 deny any
!
! --- Prefix-lists: filtros bogon de entrada ---
ip prefix-list BOGONS-V4 seq 10 deny 0.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 20 deny 10.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 30 deny 100.64.0.0/10 le 32
ip prefix-list BOGONS-V4 seq 40 deny 127.0.0.0/8 le 32
ip prefix-list BOGONS-V4 seq 50 deny 169.254.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 60 deny 172.16.0.0/12 le 32
ip prefix-list BOGONS-V4 seq 70 deny 192.0.2.0/24 le 32
ip prefix-list BOGONS-V4 seq 80 deny 192.88.99.0/24 le 32
ip prefix-list BOGONS-V4 seq 90 deny 192.168.0.0/16 le 32
ip prefix-list BOGONS-V4 seq 100 deny 198.18.0.0/15 le 32
ip prefix-list BOGONS-V4 seq 110 deny 198.51.100.0/24 le 32
ip prefix-list BOGONS-V4 seq 120 deny 203.0.113.0/24 le 32
ip prefix-list BOGONS-V4 seq 130 deny 224.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 140 deny 240.0.0.0/4 le 32
ip prefix-list BOGONS-V4 seq 999 permit 0.0.0.0/0 le 24
!
ipv6 prefix-list BOGONS-V6 seq 10 deny ::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 20 deny 100::/64 le 128
ipv6 prefix-list BOGONS-V6 seq 30 deny 2001:2::/48 le 128
ipv6 prefix-list BOGONS-V6 seq 40 deny 2001:10::/28 le 128
ipv6 prefix-list BOGONS-V6 seq 50 deny 2001:db8::/32 le 128
ipv6 prefix-list BOGONS-V6 seq 60 deny 3fff::/20 le 128
ipv6 prefix-list BOGONS-V6 seq 70 deny 2002::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 80 deny 3ffe::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 90 deny 5f00::/16 le 128
ipv6 prefix-list BOGONS-V6 seq 100 deny fc00::/7 le 128
ipv6 prefix-list BOGONS-V6 seq 110 deny fe80::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 120 deny fec0::/10 le 128
ipv6 prefix-list BOGONS-V6 seq 130 deny ff00::/8 le 128
ipv6 prefix-list BOGONS-V6 seq 999 permit ::/0 le 48
!
! --- Route-maps ---
route-map EXPORT-V4 permit 10
 match ip address prefix-list OUR-PREFIXES-V4
!
route-map EXPORT-V6 permit 10
 match ipv6 address prefix-list OUR-PREFIXES-V6
!
route-map IMPORT-V4 permit 10
 match ip address prefix-list BOGONS-V4
!
route-map IMPORT-V6 permit 10
 match ipv6 address prefix-list BOGONS-V6
!
! --- Configuración BGP ---
router bgp 212345
 bgp router-id 198.51.100.2
 no bgp default ipv4-únicast
 !
 ! Peer IPv4
 neighbor 198.51.100.1 remote-as 6939
 neighbor 198.51.100.1 description Upstream-v4
 neighbor 198.51.100.1 password SECRET
 neighbor 198.51.100.1 ttl-security hops 1
 neighbor 198.51.100.1 soft-reconfiguration inbound
 !
 ! Peer IPv6
 neighbor 2001:db8:1::1 remote-as 6939
 neighbor 2001:db8:1::1 description Upstream-v6
 neighbor 2001:db8:1::1 password SECRET
 neighbor 2001:db8:1::1 ttl-security hops 1
 neighbor 2001:db8:1::1 soft-reconfiguration inbound
 !
 address-family ipv4 únicast
  network 203.0.113.0/24
  neighbor 198.51.100.1 activate
  neighbor 198.51.100.1 route-map EXPORT-V4 out
  neighbor 198.51.100.1 route-map IMPORT-V4 in
  neighbor 198.51.100.1 prefix-list BOGONS-V4 in
  neighbor 198.51.100.1 maximum-prefix 500000 80
 exit-address-family
 !
 address-family ipv6 únicast
  network 2001:db8:abc::/48
  neighbor 2001:db8:1::1 activate
  neighbor 2001:db8:1::1 route-map EXPORT-V6 out
  neighbor 2001:db8:1::1 route-map IMPORT-V6 in
  neighbor 2001:db8:1::1 prefix-list BOGONS-V6 in
  neighbor 2001:db8:1::1 maximum-prefix 200000 80
 exit-address-family
!

Solución de problemas

Sesión BGP atascada en estado Active o Connect

La sesión intenta establecerse pero TCP 179 no puede conectar. Verifica en orden:

  1. Firewall: ¿¿Puedes alcanzar el peer en TCP 179?
    sudo nft list ruleset | grep 179
    
  2. IP del peer: ¿¿La IP del vecino es correcta? Los errores tipográficos son la causa más común.
    sudo vtysh -c "show bgp neighbors PEER_IPV4" | grep "BGP state"
    
  3. MD5 no coincide: Si usas TCP MD5, ambos lados deben tener exactamente la misma cadena de contraseña. No hay un mensaje de error claro para esto. La sesión simplemente no se establece.
  4. GTSM: Si ttl-security hops 1 está configurado pero el peer esta a múltiples saltos (a traves de NAT o tunel), la verificación de TTL falla. Elimina ttl-security y usa ebgp-multihop en su lugar para sesiónes multi-hop.

Prefijo no visible externamente

Tu sesión está establecida pero el prefijo no aparece en los looking glasses.

  1. Verifica las rutas anunciadas:

    sudo vtysh -c "show bgp ipv4 únicast neighbors PEER_IPV4 advertised-routes"
    

    Si tu prefijo no está listado, el filtro de salida lo está bloqueando. Verifica que la prefix-list coincide con tu prefijo exacto.

  2. Verifica la ruta en el kernel:

    ip route show YOUR_PREFIX_V4
    

    Si no aparece, la interfaz dummy está caída o mal configurada.

  3. Verifica la validez ROA: Si tu ROA no existe o es incorrecto, las redes que validan RPKI descartaran tu anuncio. Verifica en RIPE RPKI Validator.

Lectura de logs

FRR envia logs a syslog por defecto. Para seguir eventos específicos de BGP:

journalctl -u frr -f --grep="bgpd"

Para una salida más detallada, activa debug temporalmente en vtysh:

debug bgp updates
debug bgp keepalives

Desactívalo cuando termines (es muy verboso):

no debug bgp updates
no debug bgp keepalives

Próximos pasos