In this example, a server running BIRD will function as a route-reflector for two MX-routers:

BIRD route-reflector

The BIRD configuration is quite easy to understand and use. There is only one thing about BIRD and BGP that requires additional clarification in advance.

By default, BIRD uses the 'master' table. In this scenario, I created a separate table called 'inet0'. This will be the table that BIRD is going to use to store BGP routes. What BIRD will not do is resolve the next-hop from that same table. By configuring 'igp table master', BIRD will resolve the next-hop by consulting the master table.

BIRD routing tables

Also, since a BIRD RR might be better off placed outside of the forwarding path, the BIRD RR is a non-forwarding RR. I hope the other comments are elaborative enough;

[root@bird ~]# more /etc/bird.bgp
# creating a separate table for BIRD to store BGP routes
table inet0;

# the following is a template. The template needs to be applied to individual neighbors.

template bgp RR {
        debug all;                                  # debug BGP
        description "BIRD RR";
        local as 1;                                 # the AS used by the local BGP speaker
        multihop;                                   # was not default in 1.3.11
        rr client;                                  # make defined neighbors rr clients
        igp table master;                           # necessary to resolve the next-hop
        table inet0;                                # make BGP use this table
        import all;                                 # just accept everything
        export all;                                 # and advertise it to all the neigbors
        connect retry time 10;                      # reconnect try after 10s
        hold time 30;                               # hold time send in BGP messages
        source address 172.30.0.254;                # Source BGP from this IP address
}

# neighbors can be added in the following file:
include "bird.bgp.clients";

The route-reflector clients:

[root@bird ~]# more /etc/bird.bgp.clients
#  from ‘RR’ refers to the template stored in bird.bgp
protocol bgp Tiberius from RR { neighbor 1.1.1.9 as 1; };
protocol bgp Commodus from RR { neighbor 1.1.1.4 as 1; };

After activating this configuration, you can issue the following command to examine the BGP table ‘inet0’;

[root@bird ~]# birdc show route all table inet0
BIRD 1.3.11 ready.
192.168.76.0/24    via 172.30.0.2 on eth1 [Tiberius 14:03 from 1.1.1.9] * (100/?) [i]
        Type: BGP unicast univ
        BGP.origin: IGP
        BGP.as_path:
        BGP.next_hop: 1.1.1.9
        BGP.local_pref: 100

To verify that the route, received from Tiberius, was forwarded by BIRD:

play@MX480-TEST-RE0:Commodus> show route receive-protocol bgp 172.30.0.254 detail

inet.0: 34 destinations, 35 routes (30 active, 0 holddown, 4 hidden)
* 192.168.76.0/24 (1 entry, 1 announced)
     Accepted
     Nexthop: 1.1.1.9
     Localpref: 100
     AS path: I (Originator)
     Cluster list:  172.30.0.254
     Originator ID: 1.1.1.9

A nice thing about BIRD is that it allows you to store the configuration in different files. In this example, I made use of the following files:

BIRD route reflector configuration files

The ‘bird.conf’ file references bird.ospf and bird.bgp. The route-reflector clients are put into a separate file which is referenced by bird.bgp.

First, the content of bird.conf:

router id 172.30.0.254;

debug protocols all;

protocol device {
        scan time 10;
}


include "bird.ospf";

include "bird.bgp";

The OSPF configuration (same as in a previous post):

[root@bird ~]# more /etc/bird.ospf
protocol ospf {
        debug all;
        area 0 {
                interface "eth1" {
                        passwords {
                                password "LaLa" {
                                        id 1;
                                        generate from "01-01-2000 00:00:00";
                                        accept from "01-01-2000 00:00:00";
                                };
                        };
                        cost 5;
                        type pointopoint;
                        hello 5; retransmit 2; wait 10; dead 20;
                        authentication cryptographic;
                };
                interface "lo" {
                        cost 1000;
                        stub;
                };
        };
}