http://www.bortzmeyer.org/8092.html
---------------------------- Auteur(s) du RFC: J. Heitz (Cisco), J. Snijders (NTT), K. Patel (Arrcus), I. Bagdonas (Equinix), N. Hilliard (INEX) Chemin des normes ---------------------------- Ce RFC normalise un nouvel attribut des annonces BGP, « "Large Communities" ». Les « communautés » BGP sont des courtes données collées aux annonces BGP et qui permettent d'indiquer certaines caractéristiques des routes. Les décisions des routeurs peuvent utiliser ces caractéristiques. Mais les communautés originales étaient trop courtes (seulement quatre octets) : le nouvel attribut permet des communautés de douze octets. Les « communautés » sont définies dans le RFC 1997. On les apprend via les documentations des opérateurs ou des points d'échange. Par exemple, celle du point d'échange irlandais <https://www.inex.ie/technical/route-servers/> (section « "Community based prefix filtering" »). Un attribut COMMUNITY dans une annonce BGP peut comporter plusieurs communautés. Traditionnellement, les quatre octets des communautés initiales sont utilisées pour représenter le numéro d'AS dans les deux premiers octets (ainsi, une communauté est mondialement unique, par ce système d'allocation à deux niveaux), et des données spécifiques à l'AS dans les deux suivants. Évidemment, avec les numéros d'AS de quatre octets du RFC 6793, ça ne marchait plus. D'où cet attribut LARGE_COMMUNITY, désormais stocké dans le registre IANA <http://www.iana.org/assignments/bgp-parameters/bgp-parameters.xml#bgp-p arameters-2> sous le numéro ("type code") 32. (Il y a bien eu une autre tentative d'augmenter la taille des communautés, dans le RFC 4360, mais pas suffisamment pour que les AS à quatre octets puissent être utilisés partout.) Comme pour les « petites » communautés, ces grandes communautés dans une annonce forment un ensemble (donc, non ordonné) : plusieurs routeurs auront pu ajouter une communauté à cet ensemble. Les communautés sont importantes car elles sont utilisées dans la politique de routage. BGP ne cherche pas à trouver le meilleur chemin : il fait du routage politique, où les décisions sont prises en fonction de choix faits par les opérateurs (privilégier tel ou tel lien pour le trafic entrant, par exemple). Les informations contenues dans une annonce BGP (section 4.3 du RFC 4271) habituelle ne sont pas toujours suffisantes, et c'est pour cela que les communautés ont été introduites par le RFC 1997, pour ajouter des informations utiles, comme l'endroit où telle route a été apprise. L'attribut COMMUNITY (numéro 8) est transitif (section 5 du RFC 4271), ce qui veut dire qu'après réception d'une annonce, il est transmis aux autres routeurs (d'où l'importance de marquer la communauté avec un numéro d'AS, pour que les communautés soient uniques au niveau mondial, sans qu'il existe un registre central des communautés). Le nouvel attribut LARGE_COMMUNITY (numéro 32) est également optionnel et transitif (section 2 de notre RFC). Il se compose d'un ensemble de grandes communautés, chacune étant stockée sur douze octets. L'idée est qu'on utilise les quatre premiers octets pour identifier l'AS (ce qui va bien avec les grands AS du du RFC 6793), ce qui va garantir l'unicité des communautés. Le nombre de communautés dans un attribut LARGE_COMMUNITY est donné par le champ Longueur de l'attribut, les attributs BGP étant encodés en TLV (cf. RFC 4271, section 4.3). En cas d'agrégation de routes (section 3 du RFC), il est recommandé d'utiliser comme communautés l'union des ensembles de communautés des différentes annonces. Et comment on va représenter ces grandes communautés sous forme texte ? (Sur le câble, entre les deux routeurs, c'est du binaire, en gros boutien, cf. RFC 4271, section 4.) On note trois groupes de quatre octets, séparés par un deux-points, par exemple 2914:65400:38016 (section 4 de notre RFC), où le premier champ est presque toujours l'AS. Comme toutes les grandes communautés font exactement douze octets, si le champ Longueur de l'attribut n'est pas un multiple de douze, l'attribut est invalide, et le routeur qui reçoit cette annonce doit la gérer comme étant un retrait de la route (RFC 7606). Un point de sécurité important en section 6 du RFC ; en gros, les grandes communautés ont quasiment les mêmes propriétés de sécurité que les anciennes petites communautés. Notamment, elles ne sont pas protégées contre une manipulation en transit : tout AS dans le chemin peut ajouter des communautés (même « mensongères », c'est-à-dire indiquant un autre AS que le sien) ou retirer des communautés existantes). La section 11 du RFC 7454 donne quelques détails à ce sujet. Ce problème n'est pas spécifique aux communautés, c'est un problème général de BGP. L'Internet n'a pas de chef et il est donc difficile de concevoir un mécanisme permettant de garantir l'authenticité des annonces. Il existe déjà de nombreuses mises en œuvre de BGP qui gèrent ces grandes communautés. Par exemple IOS XR, ExaBGP <https://github.com/Exa-Networks/exabgp/wiki>, BIRD, OpenBGPD, GoBGP <http://osrg.github.io/gobgp/>, Quagga, bgpdump depuis la version 1.5 <https://bitbucket.org/ripencc/bgpdump/commits/fad519504b30fa1a34c673ce7 d1e03532234be05>, pmacct <http://www.pmacct.net/>... Une liste plus complète figure sur le Wiki <https://trac.tools.ietf.org/wg/idr/trac/wiki/draft-ietf-idr-large-commu nity%20implementations>. Mais il y a aussi le site Web du projet <http://largebgpcommunities.net/>, où vous trouverez plein de choses. Si vous avez accès à un routeur BGP, ou à un "looking glass" qui affiche les grandes communautés (c'est le cas de celui du Ring de NLnog <http://lg.ring.nlnog.net/>), les deux préfixes 2001:67c:208c::/48 et 192.147.168.0/24 ont une grande communauté (15562:1:1). Si vous essayez sur un routeur qui a un vieux logiciel, ne comprenant pas ces grandes communautés, vous verrez sans doute quelque chose du genre « "unknown attribute" ». Ici sur IOS à Route Views <http://www.routeviews.org/> : % telnet route-views.oregon-ix.net ... Username: rviews route-views> show ip bgp 192.147.168.0 BGP routing table entry for 192.147.168.0/24, version 37389686 Paths: (41 available, best #21, table default) Not advertised to any peer Refresh Epoch 1 3333 1273 2914 15562 193.0.0.56 from 193.0.0.56 (193.0.0.56) Origin IGP, localpref 100, valid, external Community: 1273:22000 2914:410 2914:1206 2914:2203 2914:3200 unknown transitive attribute: flag 0xE0 type 0x20 length 0xC value 0000 3CCA 0000 0001 0000 0001 ... Ici sur un vieux IOS-XR (le test a été fait à l'époque où l'attribut avait le numéro 30 et pas 32, d'où le 0x1e) : RP/0/RSP0/CPU0:Router# show bgp ipv6 unicast 2001:67c:208c::/48 unknown-attributes BGP routing table entry for 2001:67c:208c::/48 Community: 2914:370 2914:1206 2914:2203 2914:3200 Unknown attributes have size 15 Raw value: e0 1e 0c 00 00 3c ca 00 00 00 01 00 00 00 01 Et ici sur JunOS : user at JunOS-re6> show route 2001:67c:208c::/48 detail 2001:67c:208c::/48 (1 entry, 1 announced) AS path: 15562 I Unrecognized Attributes: 15 bytes Attr flags e0 code 1e: 00 00 3c ca 00 00 00 01 00 00 00 01 Notez que certaines configurations (parfois activées par défaut) du routeur peuvent supprimer l'attribut « grandes communautés ». Pour empêcher cela, il faut, sur JunOS : [edit protocols bgp] user at junos# delete drop-path-attributes 32 Et sur IOS-XR : configure router bgp YourASN attribute-filter group ReallyBadIdea ! avoid creating bogons no attribute 32 ! ! Deux lectures pour finir : * Un bon article sur l'acceptation <https://labs.ripe.net/Members/emileaben/large-bgp-communities-largely-a ccepted-now> des grandes communautés dans la nature et * Un outil (fondé sur Docker) pour expérimenter avec ces grandes communautés <https://labs.ripe.net/Members/pier_carlo_chiodi/the-large-bgp-communiti es-playground>. --------------------------- Liste de diffusion du FRnOG http://www.frnog.org/