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 ASN192.0.2.1→ IP del vecino OuiHeberg208226→ ASN OuiHeberg (AS208226), ya indicado203.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 ASN2001:db8::1→ IP IPv6 del vecino OuiHeberg208226→ ASN OuiHeberg (AS208226), ya indicado2001: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:
| Columna | Valor esperado |
|---|---|
| State/PfxRcd | Established / número de rutas recibidas |
| Up/Down | duración de la sesión (ej: 00:05:32) |
| MsgRcvd/Sent | contadores 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
| Medida | Comando FRR | Efecto |
|---|---|---|
| Autenticación MD5 | neighbor X password <secret> | Autentica los paquetes BGP TCP |
| GTSM (TTL Security) | neighbor X ttl-security hops 1 | Bloquea los paquetes fuera de segmento de red |
| Maximum-prefix | neighbor X maximum-prefix 100 | Protege contra filtraciones masivas de rutas |
| Prefix-list saliente | neighbor X prefix-list ALLOW-OUT out | Evita el anuncio de prefijos no autorizados |
| Firewall puerto 179 | iptables | Bloquea 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:
| Proveedor | Host | Puerto |
|---|---|---|
| Cloudflare | rpki.cloudflare.com | 8282 |
| RIPE NCC | rtr.rpki.cloudflare.com | 8282 |
| NTT | rtr.rpki.ntt.net | 8282 |
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íntoma | Causa probable | Diagnóstico | Solución |
|---|---|---|---|
Sesión en Active | Vecino inalcanzable o puerto 179 bloqueado | telnet 192.0.2.1 179 | Verificar firewall, enrutamiento, IP del vecino |
Sesión en Connect | TCP SYN enviado pero sin respuesta | tcpdump -i eth0 port 179 | Verificar ASN remoto, IP de origen, MD5 |
Sesión Established pero 0 prefijos recibidos | Prefix-list demasiado restrictiva del lado del peer | show bgp neighbors X received-routes | Ajustar BOGON-IN o contactar a OuiHeberg |
| Prefijo no visible en bgp.tools | network ausente o ruta del kernel faltante | show ip bgp 203.0.113.0/24 | Verificar que la IP exista en la interfaz (ip route) |
| FRR no arranca | bgpd=yes no activado en daemons | journalctl -u frr | Editar /etc/frr/daemons, reiniciar |
| Sesión flapping | Temporizador BGP demasiado corto o enlace inestable | show bgp neighbors X → Hold time | Aumentar 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).
