I apologize for asking a question which in all probability has a really obvious answer. I have a freshly installed FRR 7.2 from sources on Alpine Linux. The 'zebra' process is running as id=frr and I have a working BGP session. The issue is, it's not installing routes into the kernel routing table. Being that zebra and bgpd are running as the 'frr' user, I made sure zebra had cap_net_admin: # getcap zebra zebra = cap_net_admin+p My Running config: # show run Building configuration... Current configuration: ! frr version 7.2 frr defaults datacenter hostname aagico-alpine-mia no ipv6 forwarding ! router bgp 64225 neighbor vultr peer-group neighbor vultr remote-as 64515 neighbor vultr password xxx neighbor vultr ebgp-multihop 2 neighbor 169.254.169.254 peer-group vultr neighbor 2001:19f0:ffff::1 peer-group vultr ! line vty ! end /etc/frr/daemons: # cat /etc/frr/daemons zebra=yes bgpd=yes ospfd=no ospf6d=no ripd=no ripngd=no isisd=no pimd=no ldpd=no nhrpd=no eigrpd=no babeld=no sharpd=no staticd=yes pbrd=no bfdd=yes fabricd=no # # If this option is set the /etc/init.d/frr script automatically loads # the config via "vtysh -b" when the servers are started. # Check /etc/pam.d/frr if you intend to use "vtysh"! # vtysh_enable=yes zebra_options=" -s 90000000 --daemon -A 127.0.0.1" bgpd_options=" --daemon -A 127.0.0.1" ospfd_options=" --daemon -A 127.0.0.1" ospf6d_options=" --daemon -A ::1" ripd_options=" --daemon -A 127.0.0.1" ripngd_options=" --daemon -A ::1" isisd_options=" --daemon -A 127.0.0.1" pimd_options=" --daemon -A 127.0.0.1" ldpd_options=" --daemon -A 127.0.0.1" nhrpd_options=" --daemon -A 127.0.0.1" eigrpd_options=" --daemon -A 127.0.0.1" babeld_options=" --daemon -A 127.0.0.1" sharpd_options=" --daemon -A 127.0.0.1" staticd_options=" --daemon -A 127.0.0.1" pbrd_options=" --daemon -A 127.0.0.1" bfdd_options=" --daemon -A 127.0.0.1" fabricd_options=" --daemon -A 127.0.0.1" #MAX_FDS=1024 # The list of daemons to watch is automatically generated by the init script. #watchfrr_options="" # for debugging purposes, you can specify a "wrap" command to start instead # of starting the daemon directly, e.g. to use valgrind on ospfd: # ospfd_wrap="/usr/bin/valgrind" # or you can use "all_wrap" for all daemons, e.g. to use perf record: # all_wrap="/usr/bin/perf record --call-graph -" # the normal daemon command is added to this at the end.