Konfiguracja BGP pod usługi EPIX – Bird

Często pytacie mnie o udostępnienie przykładowego pliku konfiguracyjnego dla routera BGP. Najlepiej pod usługi świadczone przez EPIX. Poniżej przedstawiam podstawową konfigurację dla Birda. 

W kolejnych wpisach postaram się rozbudować poniższy przykład o inne przydatne opcje jak np. obsługa BGP Blackholing czy wykorzystanie communities w filtrach.

Adresacja dla naszej przykładowej konfiguracji:

Nasz prefix do rozgłaszania: 15.15.15.0/24
Nasz ASN: 65456
Nasz adres w usłudze EPIX OpenPeering: 11.11.11.2/24
ASN EPIX OpenPeering: 62047
Nasz adres w usłudze Polmix: 12.12.12.2/30
ASN Polmix: 201054
Nasz adres w usłudze Global: 13.13.13.2/30
ASN Global: 50607

router id 15.15.15.1;

log "/var/log/bird_info.log" { info };
log "/var/log/bird_error.log" { error };
log "/var/log/bird_fatal.log" { fatal };

timeformat base iso long;
timeformat log iso long;
timeformat protocol iso long;
timeformat route iso long;

protocol device IFACES {
scan time 20;
}

protocol kernel RIB {
persist;
scan time 360;
import none;
export filter {
krt_prefsrc = 15.15.15.1;
accept;
};
}

protocol static PREFIX {
route 15.15.15.0/24 reject;
#alternatywnie w zależności od potrzeb:
# route 15.15.15.0/24 via 192.168.0.2;
}

filter EPIX_IN {
if (net ~ [ 169.254.0.0/16+, 172.16.0.0/12+, 192.168.0.0/16+, 10.0.0.0/8+, 224.0.0.0/4+, 15.15.15.0/24+ ]) then reject;
if net.ip = 0.0.0.0 then reject;
if (net.len < 8) || (net.len > 32) then reject; #UWAGA, ten if powoduje, ze akceptujecie każdą długość prefixu!
if ( bgp_path.len > 50 ) then reject;
accept;
}

filter EPG_IN {
if (net ~ [ 169.254.0.0/16+, 172.16.0.0/12+, 192.168.0.0/16+, 10.0.0.0/8+, 224.0.0.0/4+, 15.15.15.0/24+ ]) then reject;
if net.ip = 0.0.0.0 then reject;
if (net.len < 8) || (net.len > 24) then reject;
if ( bgp_path.len > 50 ) then reject;
accept;
}

filter POLMIX_IN {
if (net ~ [ 169.254.0.0/16+, 172.16.0.0/12+, 192.168.0.0/16+, 10.0.0.0/8+, 224.0.0.0/4+, 15.15.15.0/24+ ]) then reject;
if net.ip = 0.0.0.0 then reject;
if (net.len < 8) || (net.len > 24) then reject;
if ( bgp_path.len > 50 ) then reject;
accept;
}

filter EPIX_OUT {
if proto="PREFIX" then { accept; }
reject;
}

filter EPG_OUT {
bgp_path.prepend(65456);
bgp_path.prepend(65456);
if proto="PREFIX" then { accept; }
reject;
}

filter POLMIX_OUT {
bgp_path.prepend(65456);
if proto="PREFIX" then { accept; }
reject;
}

protocol bgp EPIX_RS1 {
neighbor 11.11.11.1 as 62047;
local 11.11.11.2 as 65456;
description "EPIX-RS1";
import filter EPIX_IN;
export filter EPIX_OUT;
default bgp_local_pref 300;
}

protocol bgp EPIX_RS2 {
neighbor 11.11.11.1 as 62047;
local 11.11.11.2 as 65456;
description "EPIX-RS2";
import filter EPIX_IN;
export filter EPIX_OUT;
default bgp_local_pref 300;
}

protocol bgp GLOBAL {
neighbor 13.13.13.1 as 50607;
local 13.13.13.2 as 65456;
description "EP-GLOBAL";
import filter EPG_IN;
export filter EPG_OUT;
default bgp_local_pref 100;
}

protocol bgp POLMIX {
neighbor 12.12.12.1 as 201054;
local 12.12.12.2 as 65456;
description "EP-POLMIX";
import filter POLMIX_IN;
export filter POLMIX_OUT;
default bgp_local_pref 200;
}