Monter une session BGP sur un /32

Pour économiser des adresses IP, une bonne partie de l'infrastructure réseau fonctionne sur des subnet en /32. Lorsqu'on veut monter des sessions BGP avec Bird, ça peut poser problème.

Problème rencontré

La situation est la suivante pour la collecte ADSL d'un membre, par exemple pour Illyse :

  • ajut et loremipsum sont dans le même VLAN collecte
  • ajut et loremipsum ne sont pas dans le même subnet (91.216.110.99/28 pour ajut, 91.216.110.45/32 pour loremipsum), mais peuvent se parler grâce à des routes statiques en /32
  • ajut et loremipsum montent une session eBGP (numéros d'AS privés mais différent de chaque côté)

En configurant la session BGP dans Bird de façon classique, la session ne monte pas avec Bird 1.3.7 (version wheezy). En effet, par défaut en eBGP, Bird attend que le voisin soit directement joignable via une route d'interface, cf. documentation bird, mot-clé direct :

Specify that the neighbor is directly connected. The IP address of the neighbor must be from a directly reachable IP range (i.e. associated with one of your router's interfaces), otherwise the BGP session wouldn't start but it would wait for such interface to appear. The alternative is the multihop option. Default: enabled for eBGP.

Si on ne veut pas changer l'architecture réseau, la solution est de faire croire à Bird que la session BGP est multihop, via l'option multihop; dans la configuration BGP.

Attention, Bird s'attend alors à avoir un IGP qui lui donne un next-hop pour joindre le voisin BGP. C'est possible d'utiliser des routes statiques, mais il faut bien préciser à Bird dans quelle table se trouvent ces routes, en indiquant igp table <table>; dans la configuration BGP.

Note pour jessie : la version de Bird est plus récente (1.4.5) et ne semble plus avoir ce problème.

Configuration Bird fonctionnelle pour wheezy

Cette configuration permet de monter une session eBGP entre le LNS d'un membre et ajut, et devrait s'adapter facilement pour toute session BGP entre des machines qui ne sont pas dans le même subnet.

Côté ajut :

protocol bgp illyse_loremipsum {
    description "Connexion LNS ILLYSE loremipsum";
    table illyse;
    # Nécessaire pour que Bird tente de monter la session
    # (à cause des routes statiques en /32)
    multihop;
    # Nécessaire pour que les routes reçues en BGP par ajut soient valides
    # (lors de la résolution récursive du next-hop grâce l'IGP, si Bird ne
    # trouve pas la route /32 vers le pair, il marque la route "unreachable")
    igp table master;
    local as 65300;
    neighbor 91.216.110.45 as 65301;
    import where is_illyse();
    export all;
}

Côté LNS membre :

protocol bgp collecte_lasotel {
        description "Session ajut, pour annoncer l'IP de collecte ADSL";
        local as 65301;
        # Nécessaire pour que Bird tente de monter la session BGP
        # (à cause des routes statiques en /32 pour parler à ajut)
        multihop;
        neighbor 91.216.110.99 as 65300;
        source address 91.216.110.45;
        export filter filtre_lasotel;
        import filter filtre_lasotel;
}

Configuration Bird fonctionnelle pour jessie

Il suffit de forcer la session en mode direct :

protocol bgp foo {
    ...
    direct;
    gateway direct;
}