Introduction
FRRouting (FRR) is the open-source routing daemon that inherits from Quagga, itself the Zebra heir. Its hallmark: CLI very close to Cisco IOS. Under the hood, FRR powers Cumulus Linux, SONiC, and many DC/cloud stacks.
Compared to BIRD:
- Cisco-like syntax vs declarative
- Multi-process (one per protocol: bgpd, ospfd, etc.)
- More protocols supported (LDP, IS-IS, EIGRP, etc.)
- Slightly more RAM usage
For simple IP transit, both work. Pick by preference.
Prerequisites
- A Linux server with an up tunnel to VeryCloud
- VeryCloud's technical email:
169.254.X.1,2a0e:XXXX:XXXX::0, MD5 if chosen - Your ASN
- Your IPv4/IPv6 prefixes
- FRR installed
Step 1: Install FRR
# Debian / Ubuntu: official FRR repo
curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null
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
sudo apt update
sudo apt install -y frr frr-pythontools
# RHEL / Rocky / Alma
sudo dnf install -y frr
Step 2: Enable required daemons
Edit /etc/frr/daemons:
bgpd=yes
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
bfdd=no
Only bgpd (plus zebra by default) needed.
sudo systemctl enable --now frr
Step 3: Enter FRR CLI
sudo vtysh
You drop into a familiar routerXX# prompt. Same modes as Cisco.
Step 4: Base BGP config
configure terminal
!
router bgp 65000
bgp router-id 192.0.2.1
no bgp default ipv4-unicast
bgp log-neighbor-changes
timers bgp 30 90
!
Step 5: Declare neighbors
router bgp 65000
!
neighbor 169.254.X.1 remote-as 198825
neighbor 169.254.X.1 description "VeryCloud Transit v4"
neighbor 169.254.X.1 password MD5_SECRET
neighbor 169.254.X.1 timers 30 90
!
neighbor 2a0e:XXXX:XXXX::0 remote-as 198825
neighbor 2a0e:XXXX:XXXX::0 description "VeryCloud Transit v6"
neighbor 2a0e:XXXX:XXXX::0 password MD5_SECRET
neighbor 2a0e:XXXX:XXXX::0 timers 30 90
!
Step 6: Address-families and announced prefixes
router bgp 65000
!
address-family ipv4 unicast
network 192.0.2.0/24
network 198.51.100.0/24
neighbor 169.254.X.1 activate
neighbor 169.254.X.1 soft-reconfiguration inbound
neighbor 169.254.X.1 route-map FROM-VC in
neighbor 169.254.X.1 route-map TO-VC out
neighbor 169.254.X.1 maximum-prefix 5000
exit-address-family
!
address-family ipv6 unicast
network 2001:db8::/32
neighbor 2a0e:XXXX:XXXX::0 activate
neighbor 2a0e:XXXX:XXXX::0 soft-reconfiguration inbound
neighbor 2a0e:XXXX:XXXX::0 route-map FROM-VC6 in
neighbor 2a0e:XXXX:XXXX::0 route-map TO-VC6 out
neighbor 2a0e:XXXX:XXXX::0 maximum-prefix 1000
exit-address-family
!
Step 7: Static routes for announced prefixes
For network to announce, the route must exist locally:
ip route 192.0.2.0/24 Null0
ip route 198.51.100.0/24 Null0
ipv6 route 2001:db8::/32 Null0
Step 8: Prefix-lists and route-maps
Outbound (what you announce):
ip prefix-list MY-PREFIXES-V4 seq 10 permit 192.0.2.0/24
ip prefix-list MY-PREFIXES-V4 seq 20 permit 198.51.100.0/24
ipv6 prefix-list MY-PREFIXES-V6 seq 10 permit 2001:db8::/32
route-map TO-VC permit 10
match ip address prefix-list MY-PREFIXES-V4
exit
route-map TO-VC6 permit 10
match ipv6 address prefix-list MY-PREFIXES-V6
exit
Inbound (what you accept):
ip prefix-list BOGON-V4 seq 5 deny 0.0.0.0/8 le 32
ip prefix-list BOGON-V4 seq 10 deny 10.0.0.0/8 le 32
ip prefix-list BOGON-V4 seq 15 deny 127.0.0.0/8 le 32
ip prefix-list BOGON-V4 seq 20 deny 169.254.0.0/16 le 32
ip prefix-list BOGON-V4 seq 25 deny 172.16.0.0/12 le 32
ip prefix-list BOGON-V4 seq 30 deny 192.0.2.0/24 le 32
ip prefix-list BOGON-V4 seq 35 deny 192.168.0.0/16 le 32
ip prefix-list BOGON-V4 seq 40 deny 198.18.0.0/15 le 32
ip prefix-list BOGON-V4 seq 100 permit 0.0.0.0/0 le 24
route-map FROM-VC permit 10
match ip address prefix-list BOGON-V4
exit
Step 9: Save the config
end
write memory
Config written to /etc/frr/frr.conf.
Step 10: Verify
routerXX# show bgp summary
IPv4 Unicast Summary:
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
169.254.X.1 4 198825 1234 567 45 0 0 01:23:45 1
State/PfxRcd displaying a number = session up.
Routes:
show bgp ipv4 unicast neighbors 169.254.X.1 received-routes
show bgp ipv4 unicast neighbors 169.254.X.1 advertised-routes
show bgp ipv4
show bgp ipv6
Step 11: Routes pushed to kernel
By default FRR (via zebra) installs BGP routes in Linux FIB automatically:
ip route show default
ip -6 route show default
Troubleshooting
Session stays Active — tunnel issue, TCP/179 blocked, MD5 mismatch
Session up but 0 prefixes — VeryCloud not sending, route-map too restrictive
Your prefixes not announced — network X without matching route in RIB → add ip route X Null0No matching route in RIB — network declares but no route exists
Useful commands
show ip bgp summary
show bgp ipv4 unicast neighbors 169.254.X.1
show bgp ipv4 unicast neighbors 169.254.X.1 received-routes
show bgp ipv4 unicast neighbors 169.254.X.1 advertised-routes
show ip bgp
show ip route bgp
clear bgp 169.254.X.1 soft in
clear bgp 169.254.X.1 soft out
clear bgp 169.254.X.1
sudo systemctl restart frr
sudo journalctl -u frr -f
sudo vtysh -c "show bgp summary"
Conclusion
FRR = your bridge between Cisco IOS world and Linux. If you already know Cisco CLI, you're operational in 10 minutes. Concepts (route-map, prefix-list, address-family) are identical. For VeryCloud IP transit, this config covers you.
Going further: RPKI via rpki cache + route-map validation, BFD for fast failover, BGP communities, ECMP with maximum-paths.


















