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 ASN192.0.2.1→ IP del neighbor OuiHeberg208226→ ASN OuiHeberg (AS208226), già fornito203.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 ASN2001:db8::1→ IP IPv6 del neighbor OuiHeberg208226→ ASN OuiHeberg (AS208226), già fornito2001: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:
| Colonna | Valore atteso |
|---|---|
| State/PfxRcd | Established / numero di rotte ricevute |
| Up/Down | durata della sessione (es: 00:05:32) |
| MsgRcvd/Sent | contatori 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
| Misura | Comando FRR | Effetto |
|---|---|---|
| Autenticazione MD5 | neighbor X password <secret> | Autentica i pacchetti BGP TCP |
| GTSM (TTL Security) | neighbor X ttl-security hops 1 | Blocca i pacchetti fuori segmento di rete |
| Maximum-prefix | neighbor X maximum-prefix 100 | Protegge contro i route leaks massivi |
| Prefix-list in uscita | neighbor X prefix-list ALLOW-OUT out | Impedisce l'annuncio di prefissi non autorizzati |
| Firewall porta 179 | iptables | Blocca 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:
| Fornitore | Host | Porta |
|---|---|---|
| Cloudflare | rpki.cloudflare.com | 8282 |
| RIPE NCC | rtr.rpki.cloudflare.com | 8282 |
| NTT | rtr.rpki.ntt.net | 8282 |
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
| Sintomo | Probabile causa | Diagnosi | Soluzione |
|---|---|---|---|
Sessione in Active | Neighbor irraggiungibile o porta 179 bloccata | telnet 192.0.2.1 179 | Verificare firewall, routing, IP neighbor |
Sessione in Connect | TCP SYN inviato ma nessuna risposta | tcpdump -i eth0 port 179 | Verificare ASN remoto, IP sorgente, MD5 |
Sessione Established ma 0 prefissi ricevuti | Prefix-list troppo restrittiva lato peer | show bgp neighbors X received-routes | Regolare BOGON-IN o contattare OuiHeberg |
| Prefisso non visibile su bgp.tools | network assente o rotta kernel mancante | show ip bgp 203.0.113.0/24 | Verificare che l'IP esista sull'interfaccia (ip route) |
| FRR non si avvia | bgpd=yes non attivato in daemons | journalctl -u frr | Modificare /etc/frr/daemons, riavviare |
| Sessione flapping | Timer BGP troppo breve o collegamento instabile | show bgp neighbors X → Hold time | Aumentare 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).
