Try this: protocol device { scan time 10; # Scan interfaces every 10 seconds primary "lo" 127.0.0.1; } -- Eric Cables On Sun, Aug 3, 2014 at 3:11 PM, Pavlos Parissis <pavlos.parissis@gmail.com> wrote:
Hi,
I am building a solution where I have N HAProxy servers which have BGP and BFD sessions with 2 upstream routers. Bird runs on all HAProxy servers and announces the same prefixes via BGP. I am using ECMP on upstream routes to balance incoming traffic to these HAProxy servers, which balance traffic to N backend servers.
I need to advertise/withdraw several IP prefixes within the same range (192.168.200.0/24) based on the health of a service, in this case the frontend on HAProxy. These IPs are assigned only the loopback interface.
The problem I am facing is that when I adjust a filter in order to withdraw the route, all routes are withdrawn and the remaining are announced again. According to the doc if a reload on bird brings a new configuration for a protocol, that protocol will be restarted. So, it is expected behavior.
Below is the log[1] after I removed '192.168.200.1' from prefix set anycast_prefixes in loopback_ACL filter and reloaded bird. I was monitoring BGP protocols in a loop running bird show protocols all "bgp8" and saw that 'export updates' counter was increased from 2 to 3 and 'export withdraws' counter was increased from 0 to 2.
Is there a way to withdraw to a route from a list without effecting the rest routes from the list?
The only way I have found so far, it was by removing the specific IP from the loopback interface. But, this solution prevents a reload/restart on HAProxy as it can't bind anymore to the socket
Cheers, Pavlos
[1] 23:37:52 <INFO> Reconfiguration requested by SIGHUP 23:37:52 <INFO> Reconfiguring 23:37:52 <TRACE> direct1: Reconfigured 23:37:52 <INFO> Reloading protocol direct1 23:37:52 <INFO> Restarting protocol direct1 23:37:52 <TRACE> direct1: Shutting down 23:37:52 <TRACE> direct1: State changed to flush 23:37:52 <TRACE> bgp_peer1: Reconfigured 23:37:52 <TRACE> bgp_peer2: Reconfigured 23:37:52 <INFO> Reconfigured 23:37:52 <TRACE> direct1 > removed [sole] 192.168.200.1/32 dev lo 23:37:52 <TRACE> direct1 > removed [sole] 192.168.200.2/32 dev lo 23:37:52 <TRACE> direct1: State changed to down 23:37:52 <TRACE> direct1: Starting 23:37:52 <TRACE> direct1: Connected to table master 23:37:52 <TRACE> direct1: State changed to feed 23:37:52 <TRACE> direct1 < primary address 192.168.200.1/32 on interface lo added 23:37:52 <TRACE> direct1 > filtered out 192.168.200.1/32 dev lo 23:37:52 <TRACE> direct1 < secondary address 127.0.0.0/8 on interface lo added 23:37:52 <TRACE> direct1 < secondary address 192.168.200.2/32 on interface lo added 23:37:52 <TRACE> direct1 > added [best] 192.168.200.2/32 dev lo 23:37:52 <TRACE> bgp_peer2 < filtered out 192.168.200.2/32 dev lo 23:37:52 <TRACE> bgp_peer1 < filtered out 192.168.200.2/32 dev lo 23:37:52 <TRACE> direct1 < primary address 192.168.80.0/20 on interface eth0 added 23:37:52 <TRACE> direct1: State changed to up 23:37:54 <TRACE> bgp_peer2: Sending KEEPALIVE 23:37:54 <TRACE> bgp_peer1: Sending KEEPALIVE 23:37:54 <TRACE> bgp_peer2: Got KEEPALIVE 23:37:56 <TRACE> bgp_peer1: Got KEEPALIVE
bird.conf # Override router ID router id 192.168.88.194;
# Listens only on eth0's IP listen bgp address 192.168.88.194;
filter loopback_ACL prefix set anycast_prefixes; { anycast_prefixes = [ 192.168.200.1/32, 192.168.200.2/32 ]; if net ~ anycast_prefixes then accept; else reject; }
filter anycast_range { if net ~ [ 192.168.200.0/24 ] then accept; else reject; }
protocol direct { interface "lo"; debug all; import filter loopback_ACL; export none; }
protocol kernel kernel1 { disabled yes; }
protocol device { scan time 10; # TODO do I need this? }
protocol static { disabled yes; }
protocol bfd { interface "eth0" { min rx interval 500 ms; min tx interval 500 ms; idle tx interval 1000 ms; multiplier 3; }; }
template bgp BGP_PEERS { bfd on; debug all; import none; export filter anycast_range; direct; hold time 30; startup hold time 240; connect retry time 120; keepalive time 10; start delay time 5; error wait time 60, 300; error forget time 300; disable after error off; next hop self; path metric 1; default bgp_med 0; default bgp_local_pref 0; }
protocol bgp bgp_peer1 from BGP_PEERS { disabled no; description "My-BGP-Peer1"; local as 46111; neighbor 192.168.95.252 as 46111; source address 192.168.88.194; }
protocol bgp bgp_peer2 from BGP_PEERS { disabled no; description "My-BGP-Peer2"; local as 46111; neighbor 192.168.95.253 as 46111; source address 192.168.88.194; }