ExaBGP ou comment forcer BIRD à prendre son envole

Le but ici est d'anoncer à l'aide d'ExaBGP que l'ip 172.32.255.254/32 se trouve sur la machine (qui sert de routeur) 10.69.200.22/16.

Soit:

  • un routeur findus: 10.69.255.254/16
  • un routeur ouranos: 10.69.200.22/16
  • un machine routeur exabgp (qui fait tourner exabgp (non, vraiment ?)): 10.69.200.5/16

Ci dessous les differents fichiers de configurations:

findus

log syslog all;
debug protocols all;

router id 10.69.255.254;

protocol direct {
    interface "*", "*";
}

protocol kernel {
    learn;
    persist;
    scan time 20;
    import all;
    export all;
}

protocol device {
    scan time 10;
}

protocol bgp exabgp {
    debug all;
    export none;
    import all;
    local as 65042;
    neighbor 10.69.200.5 as 65042;
}

A noter que si vous vous retrouvez avec ce genre de messages:

12-10-2014 18:30:39 <TRACE> exabgp: Got UPDATE
12-10-2014 18:30:39 <TRACE> exabgp > added [best] 172.31.255.254/32 unreachable
12-10-2014 18:30:39 <TRACE> kernel1 < added 172.31.255.254/32 unreachable
12-10-2014 18:30:39 <TRACE> exabgp < rejected by protocol 172.31.255.254/32 unreachable

c'est que les routes locales de la machine ne sont pas importées dans BIRD (ce qui est le cas par default). C'est à ça que servent les protocols direct et kernel dans la configuration bird ci-dessus.

exabgp

neighbor 10.69.255.254 {
    router-id 10.69.200.5;
    local-address 10.69.200.5;
    local-as 65042;
    peer-as 65042;

    process import {
        run /etc/exabgp/process/import_announces;
    }
}

Et voici le script import_announces:

#!/usr/bin/env python3

import sys
import time

routes = [
    'announce route 172.31.255.254/32 next-hop 10.69.200.22'
]

time.sleep(10)
for route in routes:
    sys.stdout.write(route)
    sys.stdout.flush()

ouranos

Cette machine routeur ne fait pas tourner de daemon BGP. Une simple configuration reseau sous debian suffit:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

auto eth0:0
allow-hotplug eth0:0
iface eth0:0 inet static
    address 172.31.255.254
    netmask 255.255.255.255