Linux8 giugno 2026 10 visualizzazioni

Configurare una sessione BGP con FRRouting su un VPS Linux

Configurare una sessione BGP con FRRouting su un VPS Linux

Requisiti

Prima di iniziare, è necessario disporre di:

  • Un VPS Linux (Debian 12 o Ubuntu 22.04/24.04 consigliato) con accesso root
  • Il proprio ASN (numero di sistema autonomo): privato (64512–65534) o pubblico (RIPE NCC)
  • Il proprio blocco IP (/24 IPv4 minimo, o /48 IPv6)
  • Le informazioni di sessione BGP fornite da OuiHeberg: IP del neighbor, ASN remoto, password MD5 (opzionale)
  • Su un VPS OuiHeberg, l'IP e il blocco routato sono assegnati automaticamente da cloud-init durante il provisioning (nessuna configurazione di rete manuale richiesta)

Nota: Per ottenere un ASN pubblico e un blocco IP portabile, è necessario aderire al RIPE NCC o passare attraverso un LIR (Local Internet Registry). Per uso privato o laboratorio, un ASN privato (64512–65534) è sufficiente.


1. Installare FRRouting (FRR)

Non utilizzare i pacchetti della distribuzione: la versione nei repository Debian/Ubuntu è spesso obsoleta (FRR 8.x vs 10.x attuale).

Utilizzare il repository ufficiale di FRRouting:

# Aggiungere la chiave GPG ufficiale di FRR
curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null

# Definire la versione target (frr-stable = ultima stabile)
FRRVER="frr-stable"

# Aggiungere il repository 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

# Installare FRR e gli strumenti Python
sudo apt install -y curl lsb-release ca-certificates gnupg sudo apt update && sudo apt install -y frr frr-pythontools

Verificare l'installazione:

vtysh --version
# Atteso: frr versione 10.x.x

2. Attivare il daemon BGP

Per impostazione predefinita, tutti i daemon FRR sono disattivati. Attivare solo bgpd:

sudo nano /etc/frr/daemons

Modificare la riga:

bgpd=yes

Attivare e avviare FRR:

sudo systemctl enable frr
sudo systemctl restart frr
sudo systemctl status frr   # Verificare: attivo (in esecuzione)

3. Configurare la sessione BGP in vtysh

vtysh è la shell di configurazione unificata di FRRouting. Funziona come un CLI Cisco/Juniper.

Entrare in vtysh:

sudo vtysh

Configurazione completa

! Entrare in modalità configurazione
configure terminal

! Dichiarare il proprio ASN
router bgp 65001

  ! Router-ID = IP principale del proprio VPS (assegnato da cloud-init)
  bgp router-id 203.0.113.1

  ! Disattivare lo scambio di rotte predefinito (sicurezza)
  no bgp default ipv4-unicast

  ! Dichiarare il neighbor OuiHeberg (AS208226)
  neighbor 192.0.2.1 remote-as 208226
  neighbor 192.0.2.1 description OuiHeberg-upstream

  ! GTSM: TTL Security, protegge contro gli attacchi fuori segmento
  neighbor 192.0.2.1 ttl-security hops 1

  ! Autenticazione MD5 (se fornita da OuiHeberg)
  neighbor 192.0.2.1 password LaTuaPasswordMD5

  ! Address-family IPv4
  address-family ipv4 unicast

    ! Attivare il neighbor in IPv4
    neighbor 192.0.2.1 activate

    ! Annunciare il proprio blocco
    network 203.0.113.0/24

    ! Applicare i filtri (definiti di seguito)
    neighbor 192.0.2.1 prefix-list ALLOW-OUT out
    neighbor 192.0.2.1 prefix-list BOGON-IN in

    ! Limitare le rotte ricevute (protezione contro route leaks)
    neighbor 192.0.2.1 maximum-prefix 100

  exit-address-family

exit

! Prefix-list in uscita: annunciare SOLO il proprio blocco
ip prefix-list ALLOW-OUT seq 10 permit 203.0.113.0/24

! Prefix-list in entrata: rifiutare i bogon e 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

! Salvare
write memory
end

Sostituire:

  • 65001 → il proprio ASN
  • 192.0.2.1 → IP del neighbor OuiHeberg
  • 208226 → ASN OuiHeberg (AS208226), già fornito
  • 203.0.113.0/24 → il proprio blocco IP reale

4. Configurazione IPv6 (opzionale)

Se si dispone di un blocco 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

Sostituire:

  • 65001 → il proprio ASN
  • 2001:db8::1 → IP IPv6 del neighbor OuiHeberg
  • 208226 → ASN OuiHeberg (AS208226), già fornito
  • 2001:db8:1::/48 → il proprio blocco IPv6 reale

5. Verificare la sessione BGP

Comandi vtysh essenziali

! Panoramica di tutte le sessioni
show bgp summary

! Dettagli di un peer specifico
show bgp neighbors 192.0.2.1

! Rotte annunciate
show ip bgp

! Rotte ricevute dal peer
show ip bgp neighbors 192.0.2.1 received-routes

Stato atteso in show bgp summary:

ColonnaValore atteso
State/PfxRcdEstablished / numero di rotte ricevute
Up/Downdurata della sessione (es: 00:05:32)
MsgRcvd/Sentcontatori crescenti

Se lo stato mostra Active o Connect → vedere la sezione Risoluzione dei problemi.

Verifica esterna

Utilizzare un looking glass per confermare che il proprio prefisso sia visibile su Internet pubblico:

  • bgp.tools: cercare il proprio prefisso o ASN, vista in tempo reale degli annunci BGP

6. Sicurezza della sessione BGP

Firewall iptables: limitare la porta BGP

Consentire la porta 179 (BGP) solo dall'IP del neighbor OuiHeberg:

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

# Consentire le sessioni stabilite
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# BGP: solo dal neighbor OuiHeberg
sudo iptables -A INPUT -p tcp -s 192.0.2.1 --dport 179 -j ACCEPT

# SSH (adattare la porta se necessario)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Politica predefinita: bloccare tutto il resto (da impostare per ultimo)
sudo iptables -P INPUT DROP

Persistenza delle regole:

sudo apt install iptables-persistent
sudo netfilter-persistent save

Riepilogo delle misure di sicurezza

MisuraComando FRREffetto
Autenticazione MD5neighbor X password <secret>Autentica i pacchetti BGP TCP
GTSM (TTL Security)neighbor X ttl-security hops 1Blocca i pacchetti fuori segmento di rete
Maximum-prefixneighbor X maximum-prefix 100Protegge contro i route leaks massivi
Prefix-list in uscitaneighbor X prefix-list ALLOW-OUT outImpedisce l'annuncio di prefissi non autorizzati
Firewall porta 179iptablesBlocca le connessioni BGP non legittime

7. RPKI / ROA: validazione dell'origine delle rotte

RPKI (Resource Public Key Infrastructure) consente di convalidare che i prefissi BGP ricevuti siano effettivamente annunciati dal loro legittimo proprietario. Senza RPKI, il proprio VPS accetta rotte potenzialmente hijackate.

Nel 2026, non attivare RPKI su una sessione BGP pubblica significa lasciare una porta aperta agli hijack delle rotte. L'escusa "è complesso" non regge più con un server RTR pubblico gratuito.

Configurare il server RTR Cloudflare

configure terminal

! Aggiungere la cache RTR Cloudflare (gratuita, pubblica)
rpki
  rpki add cache rpki.cloudflare.com 8282
  rpki start
exit

! Attivare la validazione in BGP
router bgp 65001
  address-family ipv4 unicast
    bgp bestpath prefix-validate allow-invalid
  exit-address-family
exit

write memory
end

Verificare la connessione RTR:

show rpki cache-connection
show rpki prefix-table

Server RTR pubblici alternativi:

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

8. Configurazione completa: frr.conf annotato

Dopo write memory, la propria configurazione è salvata in /etc/frr/frr.conf. Esempio completo:

frr version 10.1.1
frr defaults traditional
hostname il-mio-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 LaTuaPasswordMD5
 !
 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. Risoluzione dei problemi

SintomoProbabile causaDiagnosiSoluzione
Sessione in ActiveNeighbor irraggiungibile o porta 179 bloccatatelnet 192.0.2.1 179Verificare firewall, routing, IP neighbor
Sessione in ConnectTCP SYN inviato ma nessuna rispostatcpdump -i eth0 port 179Verificare ASN remoto, IP sorgente, MD5
Sessione Established ma 0 prefissi ricevutiPrefix-list troppo restrittiva lato peershow bgp neighbors X received-routesRegolare BOGON-IN o contattare OuiHeberg
Prefisso non visibile su bgp.toolsnetwork assente o rotta kernel mancanteshow ip bgp 203.0.113.0/24Verificare che l'IP esista sull'interfaccia (ip route)
FRR non si avviabgpd=yes non attivato in daemonsjournalctl -u frrModificare /etc/frr/daemons, riavviare
Sessione flappingTimer BGP troppo breve o collegamento instabileshow bgp neighbors X → Hold timeAumentare timers bgp 30 90 in vtysh

FAQ

Qual è la differenza tra FRRouting e BIRD2 per BGP?

FRR utilizza una CLI in stile Cisco/Juniper (vtysh), familiare per gli amministratori di rete. BIRD2 utilizza un linguaggio di configurazione dichiarativo più potente per configurazioni complesse (route reflectors, multi-table). Per una sessione BGP semplice su VPS, FRR è più veloce da apprendere.

Posso utilizzare FRR senza il mio ASN?

No per una sessione BGP pubblica. Per un laboratorio privato, un ASN privato (64512–65534) è sufficiente. Per annunciare i propri prefissi su Internet, è obbligatorio un ASN pubblico RIPE.

FRR consuma molte risorse su un VPS?

Per una sessione BGP che riceve solo una rotta predefinita (default): circa 30–80 MB di RAM e meno dell'1% di CPU in condizioni stabili. Per una full table BGP (circa 900.000 rotte): prevedere 2–4 GB di RAM minimo. Un VPS con 2 GB di RAM è sufficiente per la maggior parte dei casi d'uso (annuncio di prefissi, ricezione di una rotta predefinita, failover).

Posso configurare BGP su un VPS senza un indirizzo IP pubblico dedicato?

No. BGP richiede una connettività TCP diretta (porta 179) tra i due peer. Il proprio VPS deve avere un IP pubblico routabile e un accesso di rete diretto al neighbor OuiHeberg.

Come aggiornare FRRouting senza interrompere le sessioni BGP?

FRR supporta il Graceful Restart (RFC 4724). Attivare con bgp graceful-restart nella configurazione BGP. Durante un apt upgrade frr, le sessioni vengono mantenute durante il riavvio del daemon (circa 30–60 secondi di convergenza).


Fonti utili