Linux8 de junio de 2026 10 vistas

Configurar una sesión BGP con FRRouting en un VPS Linux

Configurar una sesión BGP con FRRouting en un VPS Linux

Requisitos

Antes de comenzar, debe disponer de:

  • Un VPS Linux (Debian 12 o Ubuntu 22.04/24.04 recomendado) con acceso root
  • Su propio ASN (número de sistema autónomo): privado (64512–65534) o público (RIPE NCC)
  • Su propio bloque IP (/24 IPv4 mínimo, o /48 IPv6)
  • Las informaciones de sesión BGP proporcionadas por OuiHeberg: IP del vecino, ASN remoto, contraseña MD5 (opcional)
  • En un VPS OuiHeberg, la IP y el bloque enrutado son asignados automáticamente por cloud-init durante el aprovisionamiento (no se requiere configuración de red manual)

Nota: Para obtener un ASN público y un bloque IP portátil, debe adherirse al RIPE NCC o pasar por un LIR (Registro de Internet Local). Para uso privado o de laboratorio, un ASN privado (64512–65534) es suficiente.


1. Instalar FRRouting (FRR)

No utilizar los paquetes de la distribución: la versión en los repositorios de Debian/Ubuntu a menudo está obsoleta (FRR 8.x vs 10.x actual).

Utilizar el repositorio oficial de FRRouting:

# Añadir la clave GPG oficial de FRR
curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null

# Definir la versión objetivo (frr-stable = última estable)
FRRVER="frr-stable"

# Añadir el repositorio APT
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

# Instalar FRR y las herramientas de Python
sudo apt install -y curl lsb-release ca-certificates gnupg sudo apt update && sudo apt install -y frr frr-pythontools

Verificar la instalación:

vtysh --version
# Esperado: frr versión 10.x.x

2. Activar el daemon BGP

Por defecto, todos los daemons de FRR están desactivados. Activar solo bgpd:

sudo nano /etc/frr/daemons

Modificar la línea:

bgpd=yes

Activar y reiniciar FRR:

sudo systemctl enable frr
sudo systemctl restart frr
sudo systemctl status frr   # Verificar: activo (en ejecución)

3. Configurar la sesión BGP en vtysh

vtysh es el shell de configuración unificado de FRRouting. Funciona como un CLI de Cisco/Juniper.

Entrar en vtysh:

sudo vtysh

Configuración completa

! Entrar en modo configuración
configure terminal

! Declarar su ASN
router bgp 65001

  ! Router-ID = IP principal de su VPS (asignada por cloud-init)
  bgp router-id 203.0.113.1

  ! Desactivar el intercambio de rutas por defecto (seguridad)
  no bgp default ipv4-unicast

  ! Declarar el vecino OuiHeberg (AS208226)
  neighbor 192.0.2.1 remote-as 208226
  neighbor 192.0.2.1 description OuiHeberg-upstream

  ! GTSM: TTL Security, protege contra ataques fuera de segmento
  neighbor 192.0.2.1 ttl-security hops 1

  ! Autenticación MD5 (si es proporcionada por OuiHeberg)
  neighbor 192.0.2.1 password SuContraseñaMD5

  ! Address-family IPv4
  address-family ipv4 unicast

    ! Activar el vecino en IPv4
    neighbor 192.0.2.1 activate

    ! Anunciar su bloque
    network 203.0.113.0/24

    ! Aplicar los filtros (definidos a continuación)
    neighbor 192.0.2.1 prefix-list ALLOW-OUT out
    neighbor 192.0.2.1 prefix-list BOGON-IN in

    ! Limitar las rutas recibidas (protección contra filtraciones de rutas)
    neighbor 192.0.2.1 maximum-prefix 100

  exit-address-family

exit

! Prefix-list saliente: no anunciar SOLO su propio bloque
ip prefix-list ALLOW-OUT seq 10 permit 203.0.113.0/24

! Prefix-list entrante: rechazar los bogons y RFC1918
ip prefix-list BOGON-IN seq 5  deny 0.0.0.0/0
ip prefix-list BOGON-IN seq 10 deny 10.0.0.0/8 le 32
ip prefix-list BOGON-IN seq 20 deny 172.16.0.0/12 le 32
ip prefix-list BOGON-IN seq 30 deny 192.168.0.0/16 le 32
ip prefix-list BOGON-IN seq 40 deny 127.0.0.0/8 le 32
ip prefix-list BOGON-IN seq 50 deny 169.254.0.0/16 le 32
ip prefix-list BOGON-IN seq 100 permit 0.0.0.0/0 le 32

! Guardar
write memory
end

Reemplazar:

  • 65001 → su ASN
  • 192.0.2.1 → IP del vecino OuiHeberg
  • 208226 → ASN OuiHeberg (AS208226), ya indicado
  • 203.0.113.0/24 → su bloque IP real

4. Configuración IPv6 (opcional)

Si dispone de un bloque IPv6 (/48 o /56):

configure terminal

router bgp 65001

  neighbor 2001:db8::1 remote-as 208226
  neighbor 2001:db8::1 description OuiHeberg-upstream-v6
  neighbor 2001:db8::1 ttl-security hops 1

  address-family ipv6 unicast
    neighbor 2001:db8::1 activate
    network 2001:db8:1::/48
    neighbor 2001:db8::1 prefix-list ALLOW-OUT-V6 out
    neighbor 2001:db8::1 maximum-prefix 50
  exit-address-family

exit

ipv6 prefix-list ALLOW-OUT-V6 seq 10 permit 2001:db8:1::/48

write memory
end

Reemplazar:

  • 65001 → su ASN
  • 2001:db8::1 → IP IPv6 del vecino OuiHeberg
  • 208226 → ASN OuiHeberg (AS208226), ya indicado
  • 2001:db8:1::/48 → su bloque IPv6 real

5. Verificar la sesión BGP

Comandos vtysh esenciales

! Vista general de todas las sesiones
show bgp summary

! Detalle de un peer específico
show bgp neighbors 192.0.2.1

! Rutas anunciadas
show ip bgp

! Rutas recibidas del peer
show ip bgp neighbors 192.0.2.1 received-routes

Estado objetivo en show bgp summary:

ColumnaValor esperado
State/PfxRcdEstablished / número de rutas recibidas
Up/Downduración de la sesión (ej: 00:05:32)
MsgRcvd/Sentcontadores crecientes

Si el estado muestra Active o Connect → ver sección de Solución de Problemas.

Verificación externa

Utilizar un looking glass para confirmar que su prefijo es visible en Internet público:

  • bgp.tools: buscar su prefijo o ASN, vista en tiempo real de los anuncios BGP

6. Asegurar la sesión BGP

Firewall iptables: restringir el puerto BGP

Autorizar el puerto 179 (BGP) únicamente desde la IP del vecino OuiHeberg:

# Autorizar loopback
sudo iptables -A INPUT -i lo -j ACCEPT

# Autorizar las sesiones establecidas
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# BGP: únicamente desde el vecino OuiHeberg
sudo iptables -A INPUT -p tcp -s 192.0.2.1 --dport 179 -j ACCEPT

# SSH (ajustar el puerto si es necesario)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Política por defecto: bloquear todo lo demás (colocar al final)
sudo iptables -P INPUT DROP

Persistir las reglas:

sudo apt install iptables-persistent
sudo netfilter-persistent save

Resumen de medidas de seguridad

MedidaComando FRREfecto
Autenticación MD5neighbor X password <secret>Autentica los paquetes BGP TCP
GTSM (TTL Security)neighbor X ttl-security hops 1Bloquea los paquetes fuera de segmento de red
Maximum-prefixneighbor X maximum-prefix 100Protege contra filtraciones masivas de rutas
Prefix-list salienteneighbor X prefix-list ALLOW-OUT outEvita el anuncio de prefijos no autorizados
Firewall puerto 179iptablesBloquea las conexiones BGP no legítimas

7. RPKI / ROA: validación de origen de las rutas

RPKI (Infraestructura de Clave Pública de Recursos) permite validar que los prefijos BGP recibidos son anunciados por su propietario legítimo. Sin RPKI, su VPS acepta rutas potencialmente secuestradas.

En 2026, no activar RPKI en una sesión BGP pública es dejar una puerta abierta a los secuestros de rutas. La excusa "es complejo" ya no es válida con un servidor RTR público gratuito.

Configurar el servidor RTR Cloudflare

configure terminal

! Añadir la caché RTR Cloudflare (gratuita, pública)
rpki
  rpki add cache rpki.cloudflare.com 8282
  rpki start
exit

! Activar la validación en BGP
router bgp 65001
  address-family ipv4 unicast
    bgp bestpath prefix-validate allow-invalid
  exit-address-family
exit

write memory
end

Verificar la conexión RTR:

show rpki cache-connection
show rpki prefix-table

Servidores RTR públicos alternativos:

ProveedorHostPuerto
Cloudflarerpki.cloudflare.com8282
RIPE NCCrtr.rpki.cloudflare.com8282
NTTrtr.rpki.ntt.net8282

8. Configuración completa: frr.conf anotado

Después de write memory, su configuración se guarda en /etc/frr/frr.conf. Ejemplo completo:

frr version 10.1.1
frr defaults traditional
hostname mi-vps-ouiheberg
log syslog informational
no ipv6 forwarding

!
ip prefix-list ALLOW-OUT seq 10 permit 203.0.113.0/24

ip prefix-list BOGON-IN seq 5  deny 0.0.0.0/0
ip prefix-list BOGON-IN seq 10 deny 10.0.0.0/8 le 32
ip prefix-list BOGON-IN seq 20 deny 172.16.0.0/12 le 32
ip prefix-list BOGON-IN seq 30 deny 192.168.0.0/16 le 32
ip prefix-list BOGON-IN seq 40 deny 127.0.0.0/8 le 32
ip prefix-list BOGON-IN seq 50 deny 169.254.0.0/16 le 32
ip prefix-list BOGON-IN seq 100 permit 0.0.0.0/0 le 32

!
router bgp 65001
 bgp router-id 203.0.113.1
 no bgp default ipv4-unicast
 neighbor 192.0.2.1 remote-as 208226
 neighbor 192.0.2.1 description OuiHeberg-upstream
 neighbor 192.0.2.1 ttl-security hops 1
 neighbor 192.0.2.1 password SuContraseñaMD5
 !
 address-family ipv4 unicast
  neighbor 192.0.2.1 activate
  neighbor 192.0.2.1 prefix-list ALLOW-OUT out
  neighbor 192.0.2.1 prefix-list BOGON-IN in
  neighbor 192.0.2.1 maximum-prefix 100
  network 203.0.113.0/24
 exit-address-family
!

9. Solución de problemas

SíntomaCausa probableDiagnósticoSolución
Sesión en ActiveVecino inalcanzable o puerto 179 bloqueadotelnet 192.0.2.1 179Verificar firewall, enrutamiento, IP del vecino
Sesión en ConnectTCP SYN enviado pero sin respuestatcpdump -i eth0 port 179Verificar ASN remoto, IP de origen, MD5
Sesión Established pero 0 prefijos recibidosPrefix-list demasiado restrictiva del lado del peershow bgp neighbors X received-routesAjustar BOGON-IN o contactar a OuiHeberg
Prefijo no visible en bgp.toolsnetwork ausente o ruta del kernel faltanteshow ip bgp 203.0.113.0/24Verificar que la IP exista en la interfaz (ip route)
FRR no arrancabgpd=yes no activado en daemonsjournalctl -u frrEditar /etc/frr/daemons, reiniciar
Sesión flappingTemporizador BGP demasiado corto o enlace inestableshow bgp neighbors X → Hold timeAumentar timers bgp 30 90 en vtysh

FAQ

¿Cuál es la diferencia entre FRRouting y BIRD2 para BGP?

FRR utiliza una CLI estilo Cisco/Juniper (vtysh), familiar para los administradores de red. BIRD2 utiliza un lenguaje de configuración declarativo más potente para configuraciones complejas (reflectores de ruta, multi-tabla). Para una sesión BGP simple en un VPS, FRR es más rápido de aprender.

¿Puedo usar FRR sin mi propio ASN?

No para una sesión BGP pública. Para un laboratorio privado, un ASN privado (64512–65534) es suficiente. Para anunciar sus propios prefijos en Internet, se requiere un ASN público de RIPE.

¿FRR consume muchos recursos en un VPS?

Para una sesión BGP que recibe solo una ruta por defecto (default): alrededor de 30–80 MB de RAM y menos del 1% de CPU en régimen estable. Para una full table BGP (alrededor de 900,000 rutas): prever 2–4 GB de RAM como mínimo. Un VPS de 2 GB de RAM es suficiente para la mayoría de los casos de uso (anuncio de prefijos, recepción de una ruta por defecto, failover).

¿Puedo configurar BGP en un VPS sin una dirección IP pública dedicada?

No. BGP requiere conectividad TCP directa (puerto 179) entre los dos peers. Su VPS debe tener una IP pública enrutada y acceso de red directo al vecino OuiHeberg.

¿Cómo actualizar FRRouting sin interrumpir las sesiones BGP?

FRR soporta el Graceful Restart (RFC 4724). Activar con bgp graceful-restart en la configuración de BGP. Durante un apt upgrade frr, las sesiones se mantienen durante el reinicio del daemon (alrededor de 30–60 segundos de convergencia).


Fuentes útiles