<div dir="ltr"><div><div><div><div><div><div>I am trying to sort out a chicken-and-egg problem is probably more of a network design question than bird-specific.<br><br></div>I am using bird to announce prefixes from two geographically-separate locations (A and B). I am announcing different prefixes at each, but with the same AS. The problem I am having is how to get these locations to add each other's routes.<br>
<br></div>At location A, I have a pair of bird routers (X and Y), each connected to a different provider. Both routers announce the prefixes for this site over eBGP. These routers have an iBGP session between them.<br><br>
</div>At location B, there is a single router (Z), connected to one ISP. It announces its own prefixes upstream.<br><br></div>Since both sites announce with the same AS, they don't import the other's prefixes. An iBGP full-mesh seems to be the _correct_ solution, but I am having trouble getting this implemented correctly.<br>
<br></div>If I configure the inter-site iBGP sessions to connect between the addresses on the WAN interfaces, I get partial success. At site A, router X correctly adds routes for site B. Router Y establishes a connection to router Z (site B), but adds the B prefixes as unreachable. The difference is that the Y->Z BGP connection (A->B direction) is routed via router X (shorter AS path via X ISP). My configuration files for this setup are below.<br>
<br></div><div>If I attempt to establish the inter-site iBGP between the loopbacks on the routers, I have no success, since the loopback addresses fall with the subnets I announce at each site.<br><br></div><div>Is there some bit of configuration I am missing? Am I going about this the wrong way? Any thoughts are appreciated.<br>
 <br></div>#<br># router Y<br># site A<br>#<br><br>protocol bgp bgp_he {<br>    local as 12345;<br>    neighbor 1.1.2.69 as 6939;<br><br>    # Export exactly what prefixes we want advertised. No surprises.<br>    export filter {<br>
        if proto = "static_bgp" then accept;<br>        if proto = "portable_bgp" then accept;<br>        reject;<br>    };<br>    # Import filtered routes from upstream.<br>    import filter bgp_in_he;<br>
}<br><br>protocol bgp ibgp_border {<br>    local 6.9.5.212 as 12345;<br>    neighbor 6.9.5.213 as 12345;<br>    multihop 2;<br>    import filter { accept; };<br>    export filter {<br>        if source != RTS_BGP then { reject; }<br>
        if proto = "ibgp_border" then { reject; }<br>        accept;<br>    };<br>}<br><br>protocol bgp ibgp_1b {<br>    local 1.1.2.70 as 12345;<br>    neighbor 7.4.2.132 as 12345;<br>    multihop 10;<br>    import filter { accept; };<br>
    export filter {<br>        if proto = "static_bgp" then accept;<br>        if proto = "portable_bgp" then accept;<br>        reject;<br>    };<br>}<br><br><br>protocol ospf {<br>    # *snip*<br>}<br>
<br>#<br># router X<br># site A<br>#<br><br>protocol bgp bgp_cogent {<br>    local as 12345;<br>    neighbor 3.8.1.105 as 174;<br><br>    # Export exactly what prefixes we want advertised. No surprises.<br>    export filter {<br>
        if proto = "static_bgp" then accept;<br>        if proto = "portable_bgp" && net.len <= 24 then accept;<br>        reject;<br>    };<br>    # Import filtered routes from upstream.<br>
    import filter bgp_in_cogent;<br>}<br><br>protocol bgp ibgp_border {<br>    local 6.9.5.213 as 12345;<br>    neighbor 6.9.5.212 as 12345;<br>    multihop 2;<br><br>    # Send all routes learnt via BGP<br>    import filter { accept; };<br>
    export filter {<br>        if source != RTS_BGP then { reject; }<br>        if proto = "ibgp_border" then { reject; }<br>        accept;<br>    };<br>}<br><br>protocol bgp ibgp_1b {<br>    local 3.8.1.106 as 12345;<br>
    neighbor 7.4.2.132 as 12345;<br>    multihop 10;<br>    import filter { accept; };<br>    export filter {<br>        if proto = "static_bgp" then accept;<br>        if proto = "portable_bgp" && net.len <= 24 then accept;<br>
        reject;<br>    };<br>}<br><br>protocol ospf {<br>    # *snip*<br>}<br><br>#<br># router Z<br># site B<br>#<br><br>template bgp ibgp_A {<br>    debug all;<br>    local 7.4.2.132 as 12345;<br>    multihop 10;<br>    import filter { accept; };<br>
    export filter {<br>        if proto = "static_bgp" then accept;<br>        if proto = "standby_bgp" then accept;<br>        if proto = "portable_bgp" then accept;<br>        reject;<br>    };<br>
}<br><br>protocol bgp ibgp_Y from ibgp_A { neighbor 1.1.2.70 as 12345; };<br>protocol bgp ibgp_X from ibgp_A { neighbor 3.8.1.106 as 12345; };<br><br>template bgp B {<br>    # Set our local AS.<br>    local as 12345;<br><br>
    # Export exactly what prefixes we want advertised. No surprises.<br>    export filter {<br>        if proto = "static_bgp" then accept;<br>        if proto = "standby_bgp" then accept;<br>        if proto = "portable_bgp" && net.len <= 24 then accept;<br>
        reject;<br>    };<br>    # Import filtered routes from upstream.<br>    import filter bgp_in_B;<br>}<br><br>protocol bgp bgp_B from B { neighbor 7.4.2.130 as 1212; };<br><div><div><br><br></div></div></div>