BGPコミュニティとは?基礎から設定までを徹底解説(Ciscoルータ)

BGP のコミュニティは、経路(プレフィックス)に付けられる「タグ」のような属性です。同じタグを付けた経路をまとめて扱えるので、複数の経路に同じポリシーを効率よく適用できます。コミュニティを使うと、経路ごとに異なるルーティングの動作を、柔軟に指定できます。

この記事では、コミュニティの基本を説明したあと、Cisco ルータでコミュニティを付け、受け取った側でコミュニティに応じて AS プリペンドする設定を確認します。

この記事でわかること
  1. コミュニティの表記と、主なウェルノウンコミュニティ
  2. R1 で、経路ごとに違うコミュニティを付けて送る
  3. R2 で、コミュニティに応じて AS プリペンドの内容を変える

コミュニティの基本

コミュニティの表記

コミュニティは 4 バイト(32 ビット)の値です。表記には、4 バイトを 1 つの 10 進数で書く形と、上位 2 バイトと下位 2 バイトを「:」で区切って書く形(AA:NN)があります。AA:NN の形では、通常、前半の 2 バイトに AS 番号を入れ、後半の 2 バイトは各 AS が意味を決めて使います。

  • 例:1:100 は、AS 1 が決めた「100」という意味のタグです。AS 1 との間で「1:100 が付いた経路にはこの処理をする」と決めておくと、AS をまたいで同じポリシーを適用できます。

ウェルノウンコミュニティ

決まった動作が定義されている、特別なコミュニティもあります。よく使うものを覚えておくと便利です。

コミュニティ動作
no-exportAS の外(eBGP のピア)には広告しない
no-advertiseどのピアにも広告しない
local-ASコンフェデレーションの中で、自分のサブ AS の外には広告しない(RFC 1997 の NO_EXPORT_SUBCONFED)

>> 参考:no-export の記事/no-advertise の記事

使いどころ

コミュニティは、大規模なネットワークやインターネットサービスプロバイダー(ISP)で広く使われています。たとえば、次のような場面で役立ちます。

  • AS プリペンド:コミュニティで指示された経路だけ、AS_PATH に AS 番号を重ねて長くし、経路を選ばれにくくする。
  • 経路のフィルタリング:特定のコミュニティが付いた経路だけを受け取らない、または広告しないようにする。

検証構成

R1 が、3 つのループバックの経路に、それぞれ違うコミュニティを付けて R2 に広告します。R2 は、受け取った経路のコミュニティに応じて AS プリペンドの内容を変え、R3 に広告します。

AS 1 AS 2 AS 3 R1 R2 R3 .1 .2 .2 .3 192.168.12.0/24 192.168.23.0/24 コミュニティ付き 1:1 / 1:11 / 1:111 AS プリペンド コミュニティごとに変える 1.1.1.1/32 → 1:1 11.11.11.11/32 → 1:11 111.111.111.111/32 → 1:111 AS_PATH を確認
図1 検証構成
プレフィックスコミュニティ
(R1 で付ける)
R2 で行う処理
1.1.1.1/321:11 をプリペンド
11.11.11.11/321:111 と 11 をプリペンド
111.111.111.111/321:1111 と 11 と 111 をプリペンド

BGP の基本設定をする

まず、各ルータで AS 番号とネイバーを設定します。R1 は、3 つのループバックを作り、network コマンドで BGP に載せます。

R1

R1(config)# interface Loopback0 
R1(config-if)#  ip address 1.1.1.1 255.255.255.255 
R1(config)# interface Loopback11 
R1(config-if)#  ip address 11.11.11.11 255.255.255.255 
R1(config)# interface Loopback111 
R1(config-if)#  ip address 111.111.111.111 255.255.255.255 

R1(config)#router bgp 1
R1(config-router)# network 1.1.1.1 mask 255.255.255.255
R1(config-router)# network 11.11.11.11 mask 255.255.255.255
R1(config-router)# network 111.111.111.111 mask 255.255.255.255
R1(config-router)# neighbor 192.168.12.2 remote-as 2

R2

R2(config)#router bgp 2
R2(config-router)# neighbor 192.168.12.1 remote-as 1
R2(config-router)# neighbor 192.168.23.3 remote-as 3

R3

R3(config)#router bgp 3
R3(config-router)# neighbor 192.168.23.2 remote-as 2

設定が終わると、ネイバーがアップします。

R1 でコミュニティを付ける

R1 で、各プレフィックスにコミュニティを付けます。

まず、コミュニティを AA:NN の形で表示するように、ip bgp-community new-format を設定します。

R1

R1(config)# ip bgp-community new-format

次に、コミュニティを付ける各プレフィックスを、プレフィックスリストで指定します。

R1

R1(config)# ip prefix-list LOOPBACK_1 seq 5 permit 1.1.1.1/32
R1(config)# ip prefix-list LOOPBACK_11 seq 5 permit 11.11.11.11/32
R1(config)# ip prefix-list LOOPBACK_111 seq 5 permit 111.111.111.111/32

ルートマップで、プレフィックスリストごとに set community で違うコミュニティを付けます。

R1

R1(config)# route-map SET-COMMUNITY permit 1
R1(config-route-map)#  match ip address prefix-list LOOPBACK_1
R1(config-route-map)#  set community 1:1
R1(config-route-map)#!
R1(config-route-map)# route-map SET-COMMUNITY permit 11
R1(config-route-map)#  match ip address prefix-list LOOPBACK_11
R1(config-route-map)#  set community 1:11
R1(config-route-map)#!
R1(config-route-map)# route-map SET-COMMUNITY permit 111
R1(config-route-map)#  match ip address prefix-list LOOPBACK_111
R1(config-route-map)#  set community 1:111
R1(config-route-map)#!         
R1(config-route-map)# route-map SET-COMMUNITY permit 1000
ポイント

ルートマップの最後には、どのエントリにも一致しない経路を拒否する「暗黙の deny」があります。最後に何もしないシーケンス 1000 の permit を置いておくと、どのプレフィックスリストにも一致しない経路も、そのままネイバーに広告されます。

このルートマップを、ネイバー R2 への送信(out)に適用します。コミュニティを相手に送るには、send-community も必要です。

R1

R1(config)#router bgp 1
R1(config-router)# neighbor 192.168.12.2 send-community
R1(config-router)# neighbor 192.168.12.2 route-map SET-COMMUNITY out

R2 でコミュニティに応じて AS プリペンドする

R2 は、R1 から受け取った経路のコミュニティに応じて、AS プリペンドの内容を変えます。R2 でも、コミュニティを AA:NN の形で表示するように設定します。

R2

R2(config)#ip bgp-community new-format

まず、ip community-list で、受け取るコミュニティをリストにします。

R2

R2(config)#ip community-list 1 permit 1:1
R2(config)#ip community-list 11 permit 1:11
R2(config)#ip community-list 111 permit 1:111

ルートマップで、コミュニティリストごとに set as-path prepend で足す AS 番号を変えます。

R2

R2(config)#route-map AS-PREPEND-COMMUNITY permit 1
R2(config-route-map)# match community 1
R2(config-route-map)# set as-path prepend 1
R2(config-route-map)#!
R2(config-route-map)#route-map AS-PREPEND-COMMUNITY permit 11
R2(config-route-map)# match community 11
R2(config-route-map)# set as-path prepend 1 11
R2(config-route-map)#!
R2(config-route-map)#route-map AS-PREPEND-COMMUNITY permit 111
R2(config-route-map)# match community 111
R2(config-route-map)# set as-path prepend 1 11 111
R2(config-route-map)#!
R2(config-route-map)#route-map AS-PREPEND-COMMUNITY permit 1000
R2(config-route-map)#!

このルートマップを、ネイバー R3 への送信(out)に適用します。

R2

R2(config)#router bgp 2
R2(config-router)#neighbor 192.168.23.3 route-map AS-PREPEND-COMMUNITY out

AS プリペンドで AS_PATH を長くすると、その経路は選ばれにくくなります。コミュニティを使うと、経路ごとに優先度を変えられます。

補足

この検証では、動きがわかりやすいように AS 1、11、111 の番号を足しています。実際の運用では、自分の AS 番号(ここでは 2)を重ねるのが一般的です。AS_PATH にほかの AS の番号を入れると、その AS では自分の AS 番号が含まれた経路としてループと判断され、経路が捨てられます。

BGP のセッションをリセットする

R2 で BGP のセッションをリセットして、新しいポリシーを反映させます。

R2

R2#clear ip bgp *
R2#
%BGP-5-ADJCHANGE: neighbor 192.168.12.1 Down User reset
%BGP_SESSION-5-ADJCHANGE: neighbor 192.168.12.1 IPv4 Unicast topology
 base removed from session  User reset
%BGP-5-ADJCHANGE: neighbor 192.168.23.3 Down User reset
%BGP_SESSION-5-ADJCHANGE: neighbor 192.168.23.3 IPv4 Unicast topology
 base removed from session  User reset

clear ip bgp * は、すべての BGP ネイバーとのセッションを一度切って、つなぎ直します。セッションがつなぎ直されると、次のログが表示されます。R2 が R1 と R3 にもう一度つながったことがわかります。

R2

%BGP-5-ADJCHANGE: neighbor 192.168.12.1 Up 
%BGP-5-ADJCHANGE: neighbor 192.168.23.3 Up 
R2#
注意

運用中のルータでは、セッションを切らない clear ip bgp * soft out などを使います。

>> 参考:clear ip bgp の記事

設定を確認する

R2 で受け取ったコミュニティを確認する

まず、R2 が受け取った経路に、R1 で付けたコミュニティが付いているかを確認します。

R2

R2#show ip bgp 1.1.1.1
BGP routing table entry for 1.1.1.1/32, version 2
Paths: (1 available, best #1, table default)
  Advertised to update-groups:
     11        
  Refresh Epoch 1
  1
    192.168.12.1 from 192.168.12.1 (111.111.111.111)
      Origin IGP, metric 0, localpref 100, valid, external, best
      Community: 1:1


R2#show ip bgp 11.11.11.11
BGP routing table entry for 11.11.11.11/32, version 3
Paths: (1 available, best #1, table default)
  Advertised to update-groups:
     11        
  Refresh Epoch 1
  1
    192.168.12.1 from 192.168.12.1 (111.111.111.111)
      Origin IGP, metric 0, localpref 100, valid, external, best
      Community: 1:11

R2#show ip bgp 111.111.111.111 
BGP routing table entry for 111.111.111.111/32, version 4
Paths: (1 available, best #1, table default)
  Advertised to update-groups:
     11        
  Refresh Epoch 1
  1
    192.168.12.1 from 192.168.12.1 (111.111.111.111)
      Origin IGP, metric 0, localpref 100, valid, external, best
      Community: 1:111

1.1.1.1/32 に 1:1、11.11.11.11/32 に 1:11、111.111.111.111/32 に 1:111 が付いています。

R3 で AS_PATH を確認する

次に、R3 が受け取った経路の AS_PATH を確認します。

R3

R3#show ip bgp 1.1.1.1
BGP routing table entry for 1.1.1.1/32, version 30
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  2 1 1
    192.168.23.2 from 192.168.23.2 (2.2.2.2)
      Origin IGP, localpref 100, valid, external, best

R3#show ip bgp 11.11.11.11
BGP routing table entry for 11.11.11.11/32, version 31
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  2 1 11 1
    192.168.23.2 from 192.168.23.2 (2.2.2.2)
      Origin IGP, localpref 100, valid, external, best

R3#show ip bgp 111.111.111.111
BGP routing table entry for 111.111.111.111/32, version 32
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  2 1 11 111 1
    192.168.23.2 from 192.168.23.2 (2.2.2.2)
      Origin IGP, localpref 100, valid, external, best
プレフィックスAS_PATHR2 で足した AS 番号
1.1.1.1/322 1 11 個(1)
11.11.11.11/322 1 11 12 個(1 11)
111.111.111.111/322 1 11 111 13 個(1 11 111)

AS_PATH の最後の 1 は、経路を作った R1 の AS 番号です。先頭の 2 は、R2 が R3 に広告するときに付けた自分の AS 番号です。その間に、R2 がプリペンドで足した AS 番号が入っています。コミュニティに応じて、期待どおりに AS プリペンドされています。

コミュニティが付いていない経路を確認する

最後に、コミュニティが付いていない経路がどう広告されるかを確認します。R1 にループバック 222.222.222.222/32 を足して、BGP で広告します。

R1

R1(config)#interface loopback 222
R1(config-if)#ip address 222.222.222.222 255.255.255.255

R1(config)#router bgp 1
R1(config-router)#network 222.222.222.222 mask 255.255.255.255

R2 で確認すると、この経路にはコミュニティが付いていません。

R2

R2#show ip bgp 222.222.222.222
BGP routing table entry for 222.222.222.222/32, version 5
Paths: (1 available, best #1, table default)
  Advertised to update-groups:
     11        
  Refresh Epoch 1
  1
    192.168.12.1 from 192.168.12.1 (111.111.111.111)
      Origin IGP, metric 0, localpref 100, valid, external, best

R3 で確認すると、AS_PATH は「2 1」で、AS プリペンドされていません。R2 のルートマップのどのコミュニティリストにも一致しないので、シーケンス 1000 の permit でそのまま広告されています。

R3

R3#show ip bgp 222.222.222.222
BGP routing table entry for 222.222.222.222/32, version 33
Paths: (1 available, best #1, table default)
  Not advertised to any peer
  Refresh Epoch 1
  2 1
    192.168.23.2 from 192.168.23.2 (2.2.2.2)
      Origin IGP, localpref 100, valid, external, best
経路コミュニティR3 が受け取る AS_PATH1.1.1.1/321:121111.11.11.11/321:1121111111.111.111.111/321:11121111111222.222.222.222/32なし21R2 がプリペンドで足した AS 番号本来の AS_PATH
図2 R3 が受け取る AS_PATH

まとめ

ルータ設定役割
R1route-map の set community
neighbor … send-community
経路ごとにコミュニティを付けて送る
R2ip community-list
route-map の match community
set as-path prepend
コミュニティに応じて AS プリペンドする

コミュニティを使うと、経路を送る側(R1)がタグを付け、受け取る側(R2)がそのタグを見て処理を変えられます。今回は、コミュニティに応じて AS プリペンドの内容を変え、R3 に対する経路の優先度を経路ごとに変えました。コミュニティが付いていない経路には、プリペンドがかからないことも確認しました。

コメント