For a better understanding here are the picture of my iBGP Mesh:
Every Peering has its own Bird Routing Table and i use pipes to leak from the Peering Tables to master. Following are the details of my iBGP Peerings/Templates and Filters. The lines indicates WireGuard VPN Links (purple) and iBGP Peerings (green dotted).
Used Bird Templates for iBGP Peerings and Pipes
# Template for iBGP Peerings
template bgp iBGP_Peer {
local as MYAS;
# Table should be set within each Peer to T_PEERNAME
igp table T_OSPF;
path metric on; # Enable comparison of path lengths when deciding which BGP route is the best one
import keep filtered; # Keep Filtered Routes for this peering.
import where iBGP_import_peer_policy(); # iBGP Import Peer Policy
export where iBGP_export_peer_policy(); # iBGP Export Peer Policy
source address MYIPv4; # iBGP Peering with MYIPv4 to add backup pathes
next hop self; # Set Next Hop Self for clean routing
};
# Template Pipe for iBGP Peerings
template pipe iBGP_Pipe {
# Table had to be set in each Peer Definition to T_IBGP_PEERNAME
peer table master;
import where iBGP_routing_policy();
export where iBGP_routing_policy();
};
With these Templates, a iBGP Peering consists of one file in peers4/6 directory, for example Peering Definition on dn42-uk01 for dn42-de02 aka dn42-gw:
table T_IBGP_DE02;
protocol bgp B_IBGP_DE02 from iBGP_Peer {
table T_IBGP_DE02;
neighbor 172.20.175.211 as 4242423905;
};
protocol pipe P_IBGP_DE02 from iBGP_Pipe {
table T_IBGP_DE02;
};
BGP Communities for AS4242423905
I added the following communities to routes i learned:
BGP Community | Desription |
---|---|
MYPeerID | PeerID of System who learns the route( PeerID == iBGP Loopback IP) |
1000 + MYPeerID | Peering Originates from an Peer on System with PeerID |
7000 + MYPeerID | Route was learned from a "Customer/Peering" on System with PeerID |
8000 + MYPeerID | Route was learned from an IXP on System with PeerID |
9000 + MYPeerID | Route was learned from an "Upstream" on System with PeerID |
.
Based on this communities i update local_pref on iBGP egress per System. Below you find my current Filter/Routing Polica on iBGP Links.
iBGP Routing Policy and import/export filter
#
##
## iBGP Policies
##
#
# iBGP Peer Policies
function iBGP_import_peer_policy() {
if bgp_path.len > 64 then return false; # Reject too long BGP Paths
if local_nets() then return false; # Reject local used networks (IXP, Peerings) from iBGP Peers
if ( bgp_local_pref > 1000 ) then { # Reset local pref on iBGP Links, to do AS Path Metric only
bgp_local_pref = 100;
}
return true; # Allow all on iBGP Links
};
function iBGP_export_peer_policy() {
if proto = "dn42_static" then return true; # Allow Static announced routes, should be renamed to S_STATIC
if source != RTS_BGP then return false;
if bgp_path.len > 64 then return false;
if ( bgp_ext_community ~ [ (rt, MYAS, MYPeerID + 9000 ) ] ) then {
bgp_local_pref = 100;
}
if ( bgp_ext_community ~ [ (rt, MYAS, MYPeerID + 8000 ) ] ) then {
bgp_local_pref = 110;
}
if ( bgp_ext_community ~ [ (rt, MYAS, MYPeerID + 6000 ) ] ) then {
bgp_local_pref = 115;
}
if ( bgp_ext_community ~ [ (rt, MYAS, MYPeerID + 7000 ) ] ) then {
bgp_local_pref = 145;
}
return true; # Allow all on iBGP Links
};
# iBGP Routing Policies
function iBGP_routing_policy() {
if source = RTS_OSPF then return false; # For iBGP i don't want OSPF in my Routing Policy
if source = RTS_DEVICE then return false; # For iBGP i don't want DEVICE ROUTES in my Routing Policy
krt_prefsrc = MYIPv4;
return true; # Allow all on iBGP Links
};