Hi Lukas, Two questions. You add dummy interface on another node that propagates it via ospf to your border? And the most important one - you use bird version 1?
Regards, Alexander On Mon, Jan 15, 2024 at 6:23 AM Lukas Haase <lukasha...@gmx.at> wrote: > > Hi Alexander, > > Thank you again, this is really promising and I think I get the gist of it. > I have just one issue left: The /24 prefix keeps showing as unreachable. > > I have set up a test peer (both sides) to verify that routes come through. > > Here is my config: > > protocol bgp test > { > local as 64512; > source address 10.55.55.251; > import none; > export filter { > # announce all of our sub-prefixes > if(net ~ [192.0.2.0/24{25,32}]) then accept; > > # if at least one of them is reachable, announce the entire > /24 > if(net = 192.0.2.0/24 && dest != RTD_UNREACHABLE) then accept; > > reject; > }; > neighbor 10.55.55.250 as 65534; > password "xyz"; > multihop 2; > } > > protocol static prefix_aggregation > { > route 192.0.2.0/24 recursive 192.0.2.0; > route 192.0.2.0/24 recursive 192.0.2.1; > route 192.0.2.0/24 recursive 192.0.2.2; > route 192.0.2.0/24 recursive 192.0.2.3; > route 192.0.2.0/24 recursive 192.0.2.4; > route 192.0.2.0/24 recursive 192.0.2.5; > route 192.0.2.0/24 recursive 192.0.2.6; > route 192.0.2.0/24 recursive 192.0.2.7; > route 192.0.2.0/24 recursive 192.0.2.8; > route 192.0.2.0/24 recursive 192.0.2.9; > route 192.0.2.0/24 recursive 192.0.2.10; > route 192.0.2.0/24 recursive 192.0.2.11; > route 192.0.2.0/24 recursive 192.0.2.12; > route 192.0.2.0/24 recursive 192.0.2.13; > route 192.0.2.0/24 recursive 192.0.2.14; > route 192.0.2.0/24 recursive 192.0.2.15; > route 192.0.2.0/24 recursive 192.0.2.16; > route 192.0.2.0/24 recursive 192.0.2.17; > route 192.0.2.0/24 recursive 192.0.2.18; > route 192.0.2.0/24 recursive 192.0.2.19; > route 192.0.2.0/24 recursive 192.0.2.20; > route 192.0.2.0/24 recursive 192.0.2.21; > route 192.0.2.0/24 recursive 192.0.2.22; > route 192.0.2.0/24 recursive 192.0.2.23; > route 192.0.2.0/24 recursive 192.0.2.24; > route 192.0.2.0/24 recursive 192.0.2.25; > route 192.0.2.0/24 recursive 192.0.2.26; > route 192.0.2.0/24 recursive 192.0.2.27; > route 192.0.2.0/24 recursive 192.0.2.28; > route 192.0.2.0/24 recursive 192.0.2.29; > route 192.0.2.0/24 recursive 192.0.2.30; > route 192.0.2.0/24 recursive 192.0.2.31; > route 192.0.2.0/24 recursive 192.0.2.32; > route 192.0.2.0/24 recursive 192.0.2.33; > route 192.0.2.0/24 recursive 192.0.2.34; > route 192.0.2.0/24 recursive 192.0.2.35; > route 192.0.2.0/24 recursive 192.0.2.36; > route 192.0.2.0/24 recursive 192.0.2.37; > route 192.0.2.0/24 recursive 192.0.2.38; > route 192.0.2.0/24 recursive 192.0.2.39; > route 192.0.2.0/24 recursive 192.0.2.40; > route 192.0.2.0/24 recursive 192.0.2.41; > route 192.0.2.0/24 recursive 192.0.2.42; > route 192.0.2.0/24 recursive 192.0.2.43; > route 192.0.2.0/24 recursive 192.0.2.44; > route 192.0.2.0/24 recursive 192.0.2.45; > route 192.0.2.0/24 recursive 192.0.2.46; > route 192.0.2.0/24 recursive 192.0.2.47; > route 192.0.2.0/24 recursive 192.0.2.48; > route 192.0.2.0/24 recursive 192.0.2.49; > route 192.0.2.0/24 recursive 192.0.2.50; > route 192.0.2.0/24 recursive 192.0.2.51; > route 192.0.2.0/24 recursive 192.0.2.52; > route 192.0.2.0/24 recursive 192.0.2.53; > route 192.0.2.0/24 recursive 192.0.2.54; > route 192.0.2.0/24 recursive 192.0.2.55; > route 192.0.2.0/24 recursive 192.0.2.56; > route 192.0.2.0/24 recursive 192.0.2.57; > route 192.0.2.0/24 recursive 192.0.2.58; > route 192.0.2.0/24 recursive 192.0.2.59; > route 192.0.2.0/24 recursive 192.0.2.60; > route 192.0.2.0/24 recursive 192.0.2.61; > route 192.0.2.0/24 recursive 192.0.2.62; > route 192.0.2.0/24 recursive 192.0.2.63; > route 192.0.2.0/24 recursive 192.0.2.64; > route 192.0.2.0/24 recursive 192.0.2.65; > route 192.0.2.0/24 recursive 192.0.2.66; > route 192.0.2.0/24 recursive 192.0.2.67; > route 192.0.2.0/24 recursive 192.0.2.68; > route 192.0.2.0/24 recursive 192.0.2.69; > route 192.0.2.0/24 recursive 192.0.2.70; > route 192.0.2.0/24 recursive 192.0.2.71; > route 192.0.2.0/24 recursive 192.0.2.72; > route 192.0.2.0/24 recursive 192.0.2.73; > route 192.0.2.0/24 recursive 192.0.2.74; > route 192.0.2.0/24 recursive 192.0.2.75; > route 192.0.2.0/24 recursive 192.0.2.76; > route 192.0.2.0/24 recursive 192.0.2.77; > route 192.0.2.0/24 recursive 192.0.2.78; > route 192.0.2.0/24 recursive 192.0.2.79; > route 192.0.2.0/24 recursive 192.0.2.80; > route 192.0.2.0/24 recursive 192.0.2.81; > route 192.0.2.0/24 recursive 192.0.2.82; > route 192.0.2.0/24 recursive 192.0.2.83; > route 192.0.2.0/24 recursive 192.0.2.84; > route 192.0.2.0/24 recursive 192.0.2.85; > route 192.0.2.0/24 recursive 192.0.2.86; > route 192.0.2.0/24 recursive 192.0.2.87; > route 192.0.2.0/24 recursive 192.0.2.88; > route 192.0.2.0/24 recursive 192.0.2.89; > route 192.0.2.0/24 recursive 192.0.2.90; > route 192.0.2.0/24 recursive 192.0.2.91; > route 192.0.2.0/24 recursive 192.0.2.92; > route 192.0.2.0/24 recursive 192.0.2.93; > route 192.0.2.0/24 recursive 192.0.2.94; > route 192.0.2.0/24 recursive 192.0.2.95; > route 192.0.2.0/24 recursive 192.0.2.96; > route 192.0.2.0/24 recursive 192.0.2.97; > route 192.0.2.0/24 recursive 192.0.2.98; > route 192.0.2.0/24 recursive 192.0.2.99; > route 192.0.2.0/24 recursive 192.0.2.100; > route 192.0.2.0/24 recursive 192.0.2.101; > route 192.0.2.0/24 recursive 192.0.2.102; > route 192.0.2.0/24 recursive 192.0.2.103; > route 192.0.2.0/24 recursive 192.0.2.104; > route 192.0.2.0/24 recursive 192.0.2.105; > route 192.0.2.0/24 recursive 192.0.2.106; > route 192.0.2.0/24 recursive 192.0.2.107; > route 192.0.2.0/24 recursive 192.0.2.108; > route 192.0.2.0/24 recursive 192.0.2.109; > route 192.0.2.0/24 recursive 192.0.2.110; > route 192.0.2.0/24 recursive 192.0.2.111; > route 192.0.2.0/24 recursive 192.0.2.112; > route 192.0.2.0/24 recursive 192.0.2.113; > route 192.0.2.0/24 recursive 192.0.2.114; > route 192.0.2.0/24 recursive 192.0.2.115; > route 192.0.2.0/24 recursive 192.0.2.116; > route 192.0.2.0/24 recursive 192.0.2.117; > route 192.0.2.0/24 recursive 192.0.2.118; > route 192.0.2.0/24 recursive 192.0.2.119; > route 192.0.2.0/24 recursive 192.0.2.120; > route 192.0.2.0/24 recursive 192.0.2.121; > route 192.0.2.0/24 recursive 192.0.2.122; > route 192.0.2.0/24 recursive 192.0.2.123; > route 192.0.2.0/24 recursive 192.0.2.124; > route 192.0.2.0/24 recursive 192.0.2.125; > route 192.0.2.0/24 recursive 192.0.2.126; > route 192.0.2.0/24 recursive 192.0.2.127; > route 192.0.2.0/24 recursive 192.0.2.128; > route 192.0.2.0/24 recursive 192.0.2.129; > route 192.0.2.0/24 recursive 192.0.2.130; > route 192.0.2.0/24 recursive 192.0.2.131; > route 192.0.2.0/24 recursive 192.0.2.132; > route 192.0.2.0/24 recursive 192.0.2.133; > route 192.0.2.0/24 recursive 192.0.2.134; > route 192.0.2.0/24 recursive 192.0.2.135; > route 192.0.2.0/24 recursive 192.0.2.136; > route 192.0.2.0/24 recursive 192.0.2.137; > route 192.0.2.0/24 recursive 192.0.2.138; > route 192.0.2.0/24 recursive 192.0.2.139; > route 192.0.2.0/24 recursive 192.0.2.140; > route 192.0.2.0/24 recursive 192.0.2.141; > route 192.0.2.0/24 recursive 192.0.2.142; > route 192.0.2.0/24 recursive 192.0.2.143; > route 192.0.2.0/24 recursive 192.0.2.144; > route 192.0.2.0/24 recursive 192.0.2.145; > route 192.0.2.0/24 recursive 192.0.2.146; > route 192.0.2.0/24 recursive 192.0.2.147; > route 192.0.2.0/24 recursive 192.0.2.148; > route 192.0.2.0/24 recursive 192.0.2.149; > route 192.0.2.0/24 recursive 192.0.2.150; > route 192.0.2.0/24 recursive 192.0.2.151; > route 192.0.2.0/24 recursive 192.0.2.152; > route 192.0.2.0/24 recursive 192.0.2.153; > route 192.0.2.0/24 recursive 192.0.2.154; > route 192.0.2.0/24 recursive 192.0.2.155; > route 192.0.2.0/24 recursive 192.0.2.156; > route 192.0.2.0/24 recursive 192.0.2.157; > route 192.0.2.0/24 recursive 192.0.2.158; > route 192.0.2.0/24 recursive 192.0.2.159; > route 192.0.2.0/24 recursive 192.0.2.160; > route 192.0.2.0/24 recursive 192.0.2.161; > route 192.0.2.0/24 recursive 192.0.2.162; > route 192.0.2.0/24 recursive 192.0.2.163; > route 192.0.2.0/24 recursive 192.0.2.164; > route 192.0.2.0/24 recursive 192.0.2.165; > route 192.0.2.0/24 recursive 192.0.2.166; > route 192.0.2.0/24 recursive 192.0.2.167; > route 192.0.2.0/24 recursive 192.0.2.168; > route 192.0.2.0/24 recursive 192.0.2.169; > route 192.0.2.0/24 recursive 192.0.2.170; > route 192.0.2.0/24 recursive 192.0.2.171; > route 192.0.2.0/24 recursive 192.0.2.172; > route 192.0.2.0/24 recursive 192.0.2.173; > route 192.0.2.0/24 recursive 192.0.2.174; > route 192.0.2.0/24 recursive 192.0.2.175; > route 192.0.2.0/24 recursive 192.0.2.176; > route 192.0.2.0/24 recursive 192.0.2.177; > route 192.0.2.0/24 recursive 192.0.2.178; > route 192.0.2.0/24 recursive 192.0.2.179; > route 192.0.2.0/24 recursive 192.0.2.180; > route 192.0.2.0/24 recursive 192.0.2.181; > route 192.0.2.0/24 recursive 192.0.2.182; > route 192.0.2.0/24 recursive 192.0.2.183; > route 192.0.2.0/24 recursive 192.0.2.184; > route 192.0.2.0/24 recursive 192.0.2.185; > route 192.0.2.0/24 recursive 192.0.2.186; > route 192.0.2.0/24 recursive 192.0.2.187; > route 192.0.2.0/24 recursive 192.0.2.188; > route 192.0.2.0/24 recursive 192.0.2.189; > route 192.0.2.0/24 recursive 192.0.2.190; > route 192.0.2.0/24 recursive 192.0.2.191; > route 192.0.2.0/24 recursive 192.0.2.192; > route 192.0.2.0/24 recursive 192.0.2.193; > route 192.0.2.0/24 recursive 192.0.2.194; > route 192.0.2.0/24 recursive 192.0.2.195; > route 192.0.2.0/24 recursive 192.0.2.196; > route 192.0.2.0/24 recursive 192.0.2.197; > route 192.0.2.0/24 recursive 192.0.2.198; > route 192.0.2.0/24 recursive 192.0.2.199; > route 192.0.2.0/24 recursive 192.0.2.200; > route 192.0.2.0/24 recursive 192.0.2.201; > route 192.0.2.0/24 recursive 192.0.2.202; > route 192.0.2.0/24 recursive 192.0.2.203; > route 192.0.2.0/24 recursive 192.0.2.204; > route 192.0.2.0/24 recursive 192.0.2.205; > route 192.0.2.0/24 recursive 192.0.2.206; > route 192.0.2.0/24 recursive 192.0.2.207; > route 192.0.2.0/24 recursive 192.0.2.208; > route 192.0.2.0/24 recursive 192.0.2.209; # <-- this one should be reachable > route 192.0.2.0/24 recursive 192.0.2.210; > route 192.0.2.0/24 recursive 192.0.2.211; > route 192.0.2.0/24 recursive 192.0.2.212; > route 192.0.2.0/24 recursive 192.0.2.213; > route 192.0.2.0/24 recursive 192.0.2.214; > route 192.0.2.0/24 recursive 192.0.2.215; > route 192.0.2.0/24 recursive 192.0.2.216; > route 192.0.2.0/24 recursive 192.0.2.217; > route 192.0.2.0/24 recursive 192.0.2.218; > route 192.0.2.0/24 recursive 192.0.2.219; > route 192.0.2.0/24 recursive 192.0.2.220; > route 192.0.2.0/24 recursive 192.0.2.221; > route 192.0.2.0/24 recursive 192.0.2.222; > route 192.0.2.0/24 recursive 192.0.2.223; > route 192.0.2.0/24 recursive 192.0.2.224; > route 192.0.2.0/24 recursive 192.0.2.225; > route 192.0.2.0/24 recursive 192.0.2.226; > route 192.0.2.0/24 recursive 192.0.2.227; > route 192.0.2.0/24 recursive 192.0.2.228; > route 192.0.2.0/24 recursive 192.0.2.229; > route 192.0.2.0/24 recursive 192.0.2.230; > route 192.0.2.0/24 recursive 192.0.2.231; > route 192.0.2.0/24 recursive 192.0.2.232; > route 192.0.2.0/24 recursive 192.0.2.233; > route 192.0.2.0/24 recursive 192.0.2.234; > route 192.0.2.0/24 recursive 192.0.2.235; > route 192.0.2.0/24 recursive 192.0.2.236; > route 192.0.2.0/24 recursive 192.0.2.237; > route 192.0.2.0/24 recursive 192.0.2.238; > route 192.0.2.0/24 recursive 192.0.2.239; > route 192.0.2.0/24 recursive 192.0.2.240; > route 192.0.2.0/24 recursive 192.0.2.241; > route 192.0.2.0/24 recursive 192.0.2.242; > route 192.0.2.0/24 recursive 192.0.2.243; > route 192.0.2.0/24 recursive 192.0.2.244; > route 192.0.2.0/24 recursive 192.0.2.245; > route 192.0.2.0/24 recursive 192.0.2.246; > route 192.0.2.0/24 recursive 192.0.2.247; > route 192.0.2.0/24 recursive 192.0.2.248; > route 192.0.2.0/24 recursive 192.0.2.249; > route 192.0.2.0/24 recursive 192.0.2.250; > route 192.0.2.0/24 recursive 192.0.2.251; > route 192.0.2.0/24 recursive 192.0.2.252; > route 192.0.2.0/24 recursive 192.0.2.253; > route 192.0.2.0/24 recursive 192.0.2.254; > route 192.0.2.0/24 recursive 192.0.2.255; > } > > I then set up a dummy device (and add it to OSPF so that it lands in birds > routing table): > > # ip link add dum0 type dummy > # ip addr add 192.0.2.209/28 dev dum0 > # ip link set dev dum0 up > # ping -c1 192.0.2.209 > PING 192.0.2.209 (192.0.2.209) 56(84) bytes of data. > 64 bytes from 192.0.2.209: icmp_seq=1 ttl=64 time=0.022 ms > > --- 192.0.2.209 ping statistics --- > 1 packets transmitted, 1 received, 0% packet loss, time 0ms > rtt min/avg/max/mdev = 0.022/0.022/0.022/0.000 ms > > But then: > > # birdc show route | grep '^192\.0\.2\.' > 192.0.2.208/28 dev dum0 [ospf 04:57:58] * I (150/10) [14x.xxx.223.80] > 192.0.2.0/24 unreachable [prefix_aggregation 04:57:57] * (200) > # > > The 192.0.2.208/28 shows up in the routing table, so it IS reachable and > hence at least one of the 192.0.2.0/24 route entries much be reachable. Yet, > 192.0.2.0/24 shows up as unreachable. > > > > Thanks, > Luke > > > > > > > > Gesendet: Sonntag, 14. Januar 2024 um 00:24 Uhr > > Von: "Alexander Zubkov" <gr...@qrator.net> > > An: "Lukas Haase" <lukasha...@gmx.at> > > Cc: bird-users@network.cz > > Betreff: Re: Exporting a larger prefix if a smaller prefix is being exported > > > > Hi Lukas, > > > > On Sun, Jan 14, 2024 at 6:23 AM Lukas Haase <lukasha...@gmx.at> wrote: > > > > > > Hi Alex, > > > > > > > Gesendet: Samstag, 13. Januar 2024 um 06:31 Uhr > > > > Von: "Alexander Zubkov" <gr...@qrator.net> > > > > An: "Lukas Haase" <lukasha...@gmx.at> > > > > Cc: bird-users@network.cz > > > > Betreff: Re: Exporting a larger prefix if a smaller prefix is being > > > > exported > > > > > > > > Hi, > > > > > > > > You cannot do "direct" prefix aggregation to a lager prefix in Bird > > > > yet. But there are some ways to workaround it. You can define a static > > > > route with recursive nex-hop like 192.0.2.x, and filter it out when it > > > > is not reachable, but for any subprefix in /24 you would need to > > > > define 256 of such static routes. So it is up to you how practical it > > > > is. > > > > > > Interesting idea, this would be practical for me but I do not completely > > > understand yet what you mean. > > > Which routes would I define and what would be the next hop ("like > > > 192.0.2.x")? > > > > > > As an example, suppose the following prefixes are in my routing table and > > > are directly or indirectly reachable: 192.0.2.208/28, 192.0.2.250/31, > > > 192.0.2.184/29, 192.0.2.254/31, 192.0.2.176/29. > > > > > > Are you proposing? > > > > > > protocol static prefix_aggregation > > > { > > > route 192.0.2.0/24 via 192.0.2.209; > > > route 192.0.2.0/24 via 192.0.2.250; > > > route 192.0.2.0/24 via 192.0.2.285; > > > route 192.0.2.0/24 via 192.0.2.254; > > > route 192.0.2.0/24 via 192.0.2.177; > > > } > > > > Yes, something like that. But it needs to be "recursive" not "via". > > And your routes need not to be recursive already (for example iBGP > > makes such routes by default), because double recursion won't work. > > > > > > > > If so, how do I avoid that 192.0.2.0/24 will be exported five times? > > > > Yes, you'll have multiple similar routes. But if you do not have > > add-path on your BGP session, only one of them will be exported. Also > > in the recent version there is some aggregation support of same-net > > prefixes, it can be helpful here too. > > > > > And how do I set up an export filter on "next-hop is not reachable"? > > > > You need to check the corresponding attribute of the prefix. See the > > example later. > > > > > > > > By the way, the sub-prefixes, would I just export via a filter like this? > > > > Yes, this filter seems to cover the sub-prefixes. But not sure what is > > the nature of this question. > > > > > > > > export filter { > > > if (net ~ [192.0.2.0/24{25,32}]) then { > > > accept; > > > } > > > reject; > > > } > > > > > > > Here is a config example I can imagine, not tested it at all. > > Something like that works for us. But I would test it first that it > > correctly adds/reverts the "aggregated" prefix. It adds static > > prefixes in a separate table, but it can also be done in the main > > table and reachability tested in bgp export filter for example. > > > > > > ipv4 table aggr; > > > > protocol static prefix_aggregation > > { > > ipv4 { table aggr4; }; > > route 192.0.2.0/24 recursive 192.0.2.209; > > ... > > } > > > > protocol pipe pipe_aggr > > { > > table master4; > > peer table aggr; > > export filter { > > if (net ~ [192.0.2.0/24{25,32}]) then { > > accept; > > } > > reject; > > }; > > import filter { > > if dest = RTD_UNREACHABLE then reject; > > if (net = 192.0.2.0/24) then accept; > > reject; > > }; > > } > > > > > > > > > Thanks, > > > Luke > > > > > > > > > > > > > You can also make some external daemon watching your kernel routes > > > > and adding/deleting the aggregate route to the table. > > > > > > > > Regards, > > > > Alexander > > > > > > > > On Sat, Jan 13, 2024 at 2:05 AM Lukas Haase via Bird-users > > > > <bird-users@network.cz> wrote: > > > > > > > > > > Hi, > > > > > > > > > > Is is somehow possible to export a larger prefix if one or more > > > > > sub-prefixes (subnets) are exported ... but also remove that prefix > > > > > if no smaller subnet exist any more? > > > > > > > > > > Example: As soon as 192.0.2.44/32 or 192.0.2.208/28 (or any other > > > > > prefix inside 192.0.2.0/24) is exported via eBGP, also export prefix > > > > > 192.0.2.0/24. If no sub-prefixes are left, also remove 192.0.2.0/24 > > > > > from export. > > > > > > > > > > Background for my question is BGP. As is well known, the smallest > > > > > prefix I can announce over eBGP is /24. I use bird as a border > > > > > gateway and I announce various smaller prefixes via iBGP. The smaller > > > > > prefixes will take precedence in my peering neighboring AS but the > > > > > /24 is required to announce my network farther out. > > > > > > > > > > But why would I want that? Because there are actually two border > > > > > gateways. If all internal links to one of these gateways breaks, the > > > > > full subnet should not be announced any more (otherwise the traffic > > > > > would be dropped). If at least one subnet is announced, I assume that > > > > > the internal mesh is strong enough to find its way. > > > > > > > > > > > > > > > Thanks, > > > > > Luke > > > > > > > > > > > > > > > >