Logo

FRRouting (FRR): BGPv4 + BGPv6 sessions to VeryCloud (AS198825)

FRRouting (FRR): BGPv4 + BGPv6 sessions to VeryCloud (AS198825)

Configure FRR (modern Quagga fork) to establish a dual-stack BGP session toward the VeryCloud backbone, with Cisco-like syntax. Ideal if you come from the Cisco IOS world and want familiar CLI on Linux.

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 announcednetwork X without matching route in RIB → add ip route X Null0No matching route in RIBnetwork 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.

Resources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members