Configuración de BGP con FRRouting en un VPS Linux
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 conebgp-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:
activateactiva el vecino dentro de esta address family. Necesario porque desactivamosbgp default ipv4-únicast.networkindica 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 80cierra la sesión si el peer envia más de 500.000 prefijos IPv4. El80genera una advertencia al 80% (400.000). Ajusta segun recibas tabla completa o solo ruta por defecto. Para sesión solo con ruta por defecto, establece10.- 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:
- La interfaz dummy está activa (
ip addr show dummy-bgp). - La ruta existe en el kernel (
ip route show YOUR_PREFIX_V4). - La declaracion
networkcoincide 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:
- Firewall: ¿¿Puedes alcanzar el peer en TCP 179?
sudo nft list ruleset | grep 179 - 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" - 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.
- GTSM: Si
ttl-security hops 1está configurado pero el peer esta a múltiples saltos (a traves de NAT o tunel), la verificación de TTL falla. Eliminattl-securityy usaebgp-multihopen 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.
-
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.
-
Verifica la ruta en el kernel:
ip route show YOUR_PREFIX_V4Si no aparece, la interfaz dummy está caída o mal configurada.
-
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
- Agregar validacion RPKI: Configura el soporte RPKI integrado de FRR para validar rutas entrantes contra datos ROA. Consulta RPKI ROA para BGP: crear ROAs, validar rutas en BIRD2 y FRR.
- Filtrado avanzado: Construye route-maps más granulares con coincidencia de communities, filtros AS-path y ajuste de local-preference. Consulta Filtrado de rutas BGP: Prefix Lists, Filtros AS-Path, Rechazo de Bogons y GTSM.
- Monitoreo: Configura monitoreo de sesiónes BGP con herramientas cómo Prometheus + bgp_exporter o Zabbix SNMP traps para recibir alertas cuando una sesión cae.
¿Listo para probarlo?
Ejecute sesiones BGP en su propio espacio IP con VPS Virtua.Cloud. →