docs/docs/routing/bird/old-configuration.md

5.7 KiB

Configuring Bird2

We now need to configure the routing daemon for your router which will allow you to exchange routes with other routers over the tunnels you will setup later. This is at the core of what makes CRXN an inter-network.

The software we use for this procedure is known as BIRD or BIRD Internet Routing Daemon, of which there are two versions:

  1. Bird 1.6
  2. Bird 2

You can use Bird 1.6 but you are on your own then in terms of configuration, the syntax differs slightly but we recommend (and for the rest of this document we will be) using Bird 2 as it comes with many bug fixes and improvements and most distributions (including Debian) now have support for it.

Alternative bird configuration

A guide to an alternative configuration with similar functionality can be found at here.

The old configuration can be found here

Installation

In order to install the BIRD daemon on your machine you should look for a package named bird2 or something similar (some repositories name it slightly differently - such as just bird). On a Debian-based system you can use:

sudo apt install bird2 -y

You can confirm that the version of BIRD you installed is version 2 with the command bird -v. If that shows the correct version number then continue to the next step:

sudo systemctl enable --now bird

This will ensure that the routing daemon starts on boot.

Configuration

In this section we will be configuring two files:

  1. bird.conf
    • For general BIRD configuration e.g. router IDs, device protocol and includes
  2. crxn.conf
    • For CRXN-specific details

Basics

There are some basic definition that we are required to add to our configuration file. BIRD is normally configured to use the base configuration stored at something like /etc/bird/bird.conf or /etc/bird.conf, so open that file up and add the following to it.

Router ID

Every BIRD daemon is required to have what is known as a router ID which is written in the form of an IPv4 address. Now this does not actually need to be a valid IPv4 address in the sense of one you actually use but rather it just needs to follow the format, hence a router ID such as 1.1.1.1 is fine, despite you not "owning it".

Define the router ID as the first line in the configuration file like so:

router id 1.1.1.1;

TODO: These need to be unique - check how much this applies etc

These router IDs are required to be unique as they are used in the various protocols that BIRD supports in order to determine where a route advertisement came from - see them as a unique identifier of your BIRD router. Failing to do so will cause issues when routing on CRXN and a banning (TODO: see how we can enforce this).

Device protocol

BIRD supports many protocols which are used to import routing data from and export routing data to. However, the most basic of protocols which BIRD supports is known as the device protocol. The job of this protocol is just to provide basic device information to BIRD over time, it is required but luckily does not require much setup.

All that is required for this protocol to work is the following:

protocol device
{
    # Optional parameters go here
}

You can adjust scan times and such but the kernel normally will signal any changes to BIRD.

Includes

BIRD allows one to source configuration file contents from other files. Seeing that we will configure the CRXN-specific parts next we will want to include that file in the main entry file (bird.conf), this can be accomplished by placing this line at the bottom of said file:

include "/etc/crxn.conf";

CRXN-specific setup

The below sections all apply to the CRXN-specific configuration and are to be placed in the file /etc/crxn.conf.

Tables

We need to define the routing tables that BIRD will use in its process to store the routes that we want to learn from other routers and also advertise. Such a definition looks as follows:

# Define the IPv6 BIRD table
ipv6 table crxn;

You can choose any name for the table you want but you will just need to remember it such that you can refer to it later when it is needed.

Filters

We need to define a filter which will be used to filter out any incorrect routes we want to advertise to the network but also prevents any incorrect routes that are being propagated from any misconfigured BIRD instances on the network:

filter crxnFilter
{
    if (net ~ fd00::/8) then accept;
    reject;
}

TODO: Add a check about not installing RTD_UNREACHABLEs which babel will generate sometimes and which BIRD reportedly has undefined behavior with

Direct protocol

This provides BIRD with a manner of picking up the subnet/prefix pair that is assigned to local interfaces such that these can be imported into BIRD and later advertised.

protocol direct crxnDirect
{
    ipv6
    {
        table crxn;
        import filter crxnFilter;
    };

    # Interfaces to find neighbors on
    interface "eth*";
}

Kernel protocol

We need to sync the routes from the BIRD routing table crxn to the actual kernel's routing table such that it can be used in forwarding decisions. This is accomplished with the following declaration:

protocol kernel crxnKernel
{
    ipv6 {
        # bird's crxn table -> kernel
        table crxn;
        export filter crxnFilter;
    };

    persist;
}
  1. The persist option means that when BIRD exits it will not flush the routing table. This is useful if you want to do maintenance and still want to allow forwarding of traffic for a little while (of course other routers may expire routes to you but at least not that fast)