1 out of 2 BGP sessions down, all routes become unreachable

Dez C dez at otenet.gr
Fri Apr 9 19:03:23 CEST 2021


Hello,

First message here, although a long-time bird user (not an expert in any 
way). We're using bird as a bgp speaker for all our VMs that either need 
to announce routes or import routes from VRFs etc.

The setup is pretty straight forward I'd guess. The VM has 2 IPv6 BGP 
sessions with 2 L3 switches (one per switch). The VM announces one /128 
route and imports all routes learned from the BGP sessions. The same 
routes are learned from both sessions, so whenever I do a 'ip -6 r' I 
see 2 entries for each route (with different next hops) like:
2a02:xxxx:d00d::/45 via 2a02:xxxx:yyyy:zz::a dev eth2 proto bird metric 
32 pref medium
2a02:xxxx:d00d::/45 via 2a02:xxxx:yyyy:zz::b dev eth2 proto bird metric 
32 pref medium

At some point, both BGP sessions went down and one of them did not 
recover for an hour. Normally, this should not be a problem but in this 
specific case, I could no longer see 2 routes in the kernel table, one 
reachable and another unreachable, just an unreachable one, so even 
though the anycast route was being announced and traffic was reaching 
the VM, it couldn't send the packets to their destination as all routes 
were unreachable in the kernel table:
unreachable 2a02:xxxx:d00d::/45 dev lo proto bird metric 32 error -113 
pref medium .

I'm running 2.0.7 (upgrading soon) on centos7 and here's the relevant 
part of my config:

protocol device {
}
protocol direct direct_v6_lo {
         interface "lo*";  # announce loopback
         ipv6;
}
protocol direct direct_v6_eth {
         interface "eth*";
         ipv6;
}
protocol bgp bgp_v6_a {
         local 2a02:xxxx:yyyy:53::37 as 66666
         neighbor 2a02:xxxx:yyyy:53::a as 66666;  # switch A
         ipv6 {
                export where proto = "direct_v6_lo";
         };
}
protocol bgp bgp_v6_b {
         local 2a02:1388:4000:53::37 as 66666;
         neighbor 2a02:1388:4000:53::b as 66666;  # switch B
         ipv6 {
                 export where proto = "direct_v6_lo";
         };
}
protocol kernel {
     ipv6 {
         export filter {
             if proto = "direct_v6_eth" then reject;
             accept;
         };
     };
    merge paths limit 2;
}

any ideas?
thanks in advance and regards,
Yannis


More information about the Bird-users mailing list