Bird6 picking up /128 routes from the routing cache

Tore Anderson tore at fud.no
Fri Oct 21 12:50:26 CEST 2016


Hi,

I noticed something a bit spooky in my lab. Bird6 appears to pick up
and export routes that are added to the Linux kernel's routing cache.

That is, with a bird6.conf as shown below, if I fire up bird6 in debug
mode, and ping a destination with a reduced MTU (to get an ICMPv6 PTB
back to trigger caching of the host route due to its lower PMTU):

$ ping6 -M do -s 1452 2a01:79d:1234:: # Norwegian ISP using 6RD
PING 2a01:79d:1234::(2a01:79d:1234::) 1452 data bytes
>From 2a01:798:0:416::a1b:1 icmp_seq=1 Packet too big: mtu=1480

I see the following show up in bird6's stderr:

$ /usr/sbin/bird6 -d -u bird -g bird
bird: Started
bird: Exporting external route ::/0; next-hop=fe80::e611:5bff:fe9b:90e1; source=kernel1
bird: Exporting external route 2a01:79d:1234::/128; next-hop=fe80::e611:5bff:fe9b:90e1; source=kernel1

This route does however *not* show up in Linux' "main" routing table,
only in the cache one:

$ ip -6 route show table cache
2a01:79d:1234:: via fe80::e611:5bff:fe9b:90e1 dev eth0  metric 0 
    cache  expires 28sec mtu 1480 hoplimit 64

I've seen this both with bird 1.5.0 and 1.6.2, and on Ubuntu kernels
3.13.0 and 4.4.0.

Question is, why does this happen? I certainly wouldn't expect it to
and if it means that this router would start attracting traffic
destined for the host in question I fear it'll create a blackhole/loop.

If I change the kernel table number from 254 ("main") to some other
random table number, it doesn't happen anymore.

To complicate matters further I only see this in my lab. Even though I
have the same versions and config in production I cannot see that the
same thing happens there. One difference I can think of is that in
production the default route is learned from OSPF while in the lab it
is learned from SLAAC (and picked up by bird6 that way as shown in the
debug output). Not sure if that makes any difference (and if so why).

Tore

$ cat /etc/bird/bird6.conf
router id 192.0.2.1;

protocol device {}

protocol kernel {
  learn;
  export all;
  import all;
  kernel table 254; # "main"
}

protocol ospf {
  export filter {
    printn "Exporting external route ";
    printn net;
    if defined(gw) then {
      printn "; next-hop=";
      printn gw;
    }
    if defined(proto) then {
      printn "; source=";
      printn proto;
    }
    print "";
    accept;
  };
  area 0.0.0.0 {
    interface "eth0" {
      type broadcast;
    };
  };
}



More information about the Bird-users mailing list