BGP コミュニティとは
COMMUNITIES 属性とは、BGP で広報されるルートに付けるタグです。
COMMUNITIES 属性のサイズは 4 Bytes で、フォーマットは [2 Bytes の10進数] の間にコロンを付けます。一般には [ AS 番号 ] : [ルートの種類に応じた任意の数字] というように割り当てます。
例えば Microsoft が提供する Azure クラウドサービスは、Express Route と呼ばれる特殊ルートを BGP で受け取り、企業と Azure をショートカットで繋げることができますが、Azure から広報される BGP ルートには『エリア』や『サービス』の種類に応じた COMMUNITIES 属性が付与されます。
例えば『東日本エリア』であれば 12076:51012、『西日本エリア』であれば 12076:51013、『Exchange Onlineサービス』であれば 12076:5010、『SharePoint Online サービス』であれば 12076:5020、といった感じです。
以下に COMMUNITIES 属性のパケットキャプチャを示します。Azure の Exchange Online のルート『13.107.6.152/31』に対し、Exchange Online サービスのコミュニティ属性値『12076:5010』が付与された例です。
コミュニティのメリット
BGP ルータは COMMUNITIES 属性値の単位で一括操作ができるようになります。
例えば前述の Express Route を使う企業が BGP で自社グローバルアドレスを広報する場合、Microsoft (Azure) から受け取ったルートをインターネットに広報しないように route-map と community-list を使って設定することができます。
[RT2 config]
RT2(config)# ip bgp-community new-format RT2(config)# ip community-list 1 permit 12076:5010 RT2(config)# route-map INET deny 10 RT2(config-route-map)# match community 1 RT2(config)# route-map INET permit 20 RT2(config)# router bgp 20 RT2(config-router)# neighbor 10.1.24.4 remote-as 40 RT2(config-router)# neighbor 10.1.24.4 route-map INET out
[RT4 show ip bgp]
>RT4# show ip bgp
BGP table version is 5, local router ID is 10.1.24.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 198.51.100.0/24 10.1.24.2 0 20 12076 i
*> 203.0.113.0/24 10.1.24.2 0 20 12076 i
ただし、コミュニティは主に ISP やクラウド事業者などの大きな BGP AS を運用する事業者にとってはメリットが大きいですが、企業などのエンタープライズ系ネットワークではあまり使われません。
Well-known COMMUNITIES
コミュニティは 4 Bytes で表現されますが、そのうちいくつかは予約されています。
前述のように企業や ISP 、クラウド事業者が自由に使ってよい領域は 1:0 ~ 65534:65535 の範囲です。(下表のプライベート利用)
コミュニティ属性値 (16進数) | コミュニティ属性値 (aa:nn) | アサイン / Well-known コミュニティ | RFC |
---|---|---|---|
0x00000000 | 0:0 | INTERNET | RFC1997 |
0x00000001 - 0x0000FFFF | 0:1 - 0:65535 | 予約 | RFC1997 |
0x00010000 - 0xFFFEFFFF | 1:0 - 65534:65535 | プライベート利用 | RFC1997 |
0xFFFF0000 | 65535:0 | GRACEFUL_SHUTDOWN | RFC8326 |
0xFFFF029A | 65535:666 | BLACKHOLE | RFC7999 |
0xFFFFFF01 | 65535:65281 | NO_EXPORT | RFC1997 |
0xFFFFFF02 | 65535:65282 | NO_ADVERTISE | RFC1997 |
0xFFFFFF03 | 65535:65283 | NO_EXPORT_SUBCONFED (local-as) | RFC1997 |
また、『Well-known コミュニティ』というものがあります。Well-known コミュニティでは、受け取ったときの動作が決められています。
例えば NO_EXPORT では『他の AS に広報してはならない (ただし、Confederation のサブ AS には広報してよい)』、NO_ADVERTISE では『他の BGP スピーカに広報してはならない』、NO_EXPORT_SUBCONFED (local-as) では『Confederation のサブ AS 含め、他の AS に広報してはならない』、といったものが RFC 1997 で規定されています。
RFC7999 では BLACKHOLE が定められています。これは『このルートは破棄する』という動作が定められています。主に悪意あるサイトの IP アドレスが広報されます。(余談ですが、0x029A = 666 は新約聖書 "ヨハネの黙示録" に出てくる『獣の数』だとか。)
GRACEFUL_SHUTDOWN はメンテナンス前に『このルートをそろそろ落とすよ』という予告を通知するものです。BGP はベストパスのみをピアに通知するため、切り替わりまで時間が掛かってしまいます。なので例えば『GRACEFUL_SHUTDOWN コミュニティが付与されたルートは LOCAL_PREF 属性を下げる』といったことを実装すれば、メンテナンスでルータをシャットダウンする前に無停止でルートを切り替えることができます。(通知されたルータがどのように振舞うか、までは定められていないため、各々の実装に任されます。)
INTERNET はデフォルトのコミュニティです。つまり、COMMUNITY 属性無しの場合は INTERNET コミュニティに属しているのと同じ扱いとなります。
Cisco のエンタープライズ向けルータでは NO_EXPORT, NO_ADVERTISE, NO_EXPORT_SUBCONFED (local-AS), INTERNET, GRACEFUL_SHUTDOWN (gshut) を Well-known として設定できます。
それぞれがどのように広報されるかを下図に示します。
どのルートにどのコミュニティが付与されているかを見るには show ip bgp detail を使います。
ちなみに、RT4 では gshut が no-export に変わっています。これによりスムーズな経路切替を期待するのでしょう。
RT4# show ip bgp detail BGP routing table entry for 1.1.4.0/24, version 2 Paths: (1 available, best #1, table default) Not advertised to any peer Refresh Epoch 1 23 10 10.1.24.2 from 10.1.24.2 (10.1.12.2) Origin IGP, localpref 100, valid, external, best Community: internet rx pathid: 0, tx pathid: 0x0 BGP routing table entry for 1.1.5.0/24, version 3 Paths: (1 available, best #1, table default, not advertised to EBGP peer) Not advertised to any peer Refresh Epoch 1 23 10 10.1.24.2 from 10.1.24.2 (10.1.12.2) Origin IGP, localpref 100, valid, external, best Community: no-export rx pathid: 0, tx pathid: 0x0
拡張コミュニティとラージコミュニティ
2000 年になるとインターネットと BGP の世界的な支持に伴い、IPv4 アドレスだけでなく AS 番号やコミュニティも不足が懸念され始めました。
そこで 2006 年に RFC4360 にて『拡張コミュニティ (Extended Communities)』が定義されました。
今まで 4 Bytes だったコミュニティが 6 Bytes に拡張しました。Extended Communities は従来のようなルートのタグ付けとして使うこともできますし、それだけでなく MPLS-VPN の Route-Target のような、特殊用途として使う仕組みも定められています。(ただしルータによっては特殊用途としてしか設定できない)
ですが AS 番号の不足に起因し翌年 2007 年に RFC4893 にて『BGP Support for Four-octet AS Number Space』が定義されました。これは AS 番号を従来の 2 Bytes から 4 Bytes に拡張するものです。
一方、コミュニティの前半 2 Bytes は AS 番号を使う想定であったため、段々と拡張コミュニティのサイズでも適合しなくなってきました。
そこで今度は 2017 年に RFC8092 で『ラージコミュニティ (Large Communities)』が定義されました。サイズが一気に 12 Bytes まで引き上げられましたので、これで当面、新たな定義は不要になるでしょう。
Ciscoのコミュニティ設定
コミュニティは主に route-map を使って設定しますが、設定 (set) するだけではネイバーに送信されません。ネイバーに送信するためには neighbor ~ send-community コマンドを設定する必要があります。
以下に『ルート 13.107.6.152/31 に対してコミュニティ 12076:5010 を送信』する設定例を示します。
RT1(config)# ip prefix-list 1 permit 13.107.6.152/31 RT1(config)# route-map SC permit 10 RT1(config-route-map)# match ip address prefix-list 1 RT1(config-route-map)# set community 12076:5010 RT1(config)# route-map SC permit 20 RT1(config)# router bgp 12076 RT1(config-router)# network 13.107.6.152 mask 255.255.255.254 RT1(config-router)# neighbor 10.1.12.2 remote-as 20 RT1(config-router)# neighbor 10.1.12.2 route-map SC out RT1(config-router)# neighbor 10.1.12.2 send-community
なお、拡張コミュニティを送付するときは send-community extended または send-community both を使います。
RT1(config-router)# neighbor 10.1.12.2 send-community extended
コメント