BGP のコミュニティは、経路(プレフィックス)に付けられる「タグ」のような属性です。同じタグを付けた経路をまとめて扱えるので、複数の経路に同じポリシーを効率よく適用できます。コミュニティを使うと、経路ごとに異なるルーティングの動作を、柔軟に指定できます。
この記事では、コミュニティの基本を説明したあと、Cisco ルータでコミュニティを付け、受け取った側でコミュニティに応じて AS プリペンドする設定を確認します。
- コミュニティの表記と、主なウェルノウンコミュニティ
- R1 で、経路ごとに違うコミュニティを付けて送る
- 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-export | AS の外(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 に広告します。
| プレフィックス | コミュニティ (R1 で付ける) | R2 で行う処理 |
|---|---|---|
| 1.1.1.1/32 | 1:1 | 1 をプリペンド |
| 11.11.11.11/32 | 1:11 | 1 と 11 をプリペンド |
| 111.111.111.111/32 | 1:111 | 1 と 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#
設定を確認する
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_PATH | R2 で足した AS 番号 |
|---|---|---|
| 1.1.1.1/32 | 2 1 1 | 1 個(1) |
| 11.11.11.11/32 | 2 1 11 1 | 2 個(1 11) |
| 111.111.111.111/32 | 2 1 11 111 1 | 3 個(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
まとめ
| ルータ | 設定 | 役割 |
|---|---|---|
| R1 | route-map の set community neighbor … send-community | 経路ごとにコミュニティを付けて送る |
| R2 | ip community-list route-map の match community set as-path prepend | コミュニティに応じて AS プリペンドする |
コミュニティを使うと、経路を送る側(R1)がタグを付け、受け取る側(R2)がそのタグを見て処理を変えられます。今回は、コミュニティに応じて AS プリペンドの内容を変え、R3 に対する経路の優先度を経路ごとに変えました。コミュニティが付いていない経路には、プリペンドがかからないことも確認しました。
コメント