【図解/BGP】コミュニティ属性の使い方,種類,フォーマット~Extended(拡張),Large_Community~ | SEの道標
BGP

【図解/BGP】コミュニティ属性の使い方,種類,フォーマット~Extended(拡張),Large_Community~

BGP コミュニティとは

COMMUNITIES 属性とは、BGP で広報されるルートに付けるタグです。

COMMUNITIES 属性のサイズは 4 Bytes で、フォーマットは [2 Bytes の10進数]  の間にコロンを付けます。一般には [ AS 番号 ] : [ルートの種類に応じた任意の数字] というように割り当てます。

Cisco ではコマンド投入時はこの [aa:nn] の形式でコマンド投入できますが、show コマンド等で表示すると 4 Bytes の 10 進数で表示され、識別が難しいです。ip bgp community new-format コマンドを投入すると、[aa:nn] 形式で表示されます。

例えば Microsoft が提供する Azure クラウドサービスは、Express Route と呼ばれる特殊ルートを BGP で受け取り、企業と Azure をショートカットで繋げることができますが、Azure から広報される BGP ルートには『エリア』や『サービス』の種類に応じた COMMUNITIES 属性が付与されます。

例えば『東日本エリア』であれば 12076:51012、『西日本エリア』であれば 12076:51013、『Exchange Onlineサービス』であれば 12076:5010、『SharePoint Online サービス』であれば 12076:5020、といった感じです。

Azure ExpressRoute: ルーティングの要件
このページでは、ExpressRoute 回線のルーティングを構成および管理する...

以下に 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
0x000000000:0INTERNETRFC1997
0x00000001 - 0x0000FFFF0:1 - 0:65535予約RFC1997
0x00010000 - 0xFFFEFFFF1:0 - 65534:65535プライベート利用RFC1997
0xFFFF000065535:0GRACEFUL_SHUTDOWNRFC8326
0xFFFF029A65535:666BLACKHOLERFC7999
0xFFFFFF0165535:65281NO_EXPORTRFC1997
0xFFFFFF0265535:65282NO_ADVERTISERFC1997
0xFFFFFF0365535:65283NO_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

コメント

タイトルとURLをコピーしました