概要

BGPルートに任意のCOMMUNITYアトリビュート(プライベートCOMMUNITY)を付加して、ルート制御を行う設定例です。

Well-known COMMUNITYでは自動的なルートのフィルタが可能ですが、その影響範囲が限定的です。COMMUNITYを付加するASと実際にフィルタするASの間に他のASが含まれている場合、Well-known COMMUNITYではフィルタできません。また、Well-known COMMUNITYではフィルタ以外の動作もできません。

離れたAS間でルートフィルタや他のアトリビュートのセットなどの制御を行うためにプライベートCOMMUNITYを利用します。

ネットワーク構成

次のネットワーク構成でプライベートCOMMUNITYを利用したルート制御を行います。

図 COMMUNITYによるルート制御の構成図
図 COMMUNITYによるルート制御の構成図
R1-R3、R3-R2のEBGPネイバーはそれぞれループバックインタフェースのIPアドレスで確立しています。

ルート制御の内容と付加するCOMMUNITY

この図のAS1とAS300で次のようにルートを制御します。

  • 111.1.1.0/24と150.1.0.0/16はAS200へ送信しない
  • 100.1.1.0/24にはMED 10を付加してAS200へ送信する
  • 100.1.2.0/24にはAS300を追加でプリペンドしてAS200へ送信する
  • 100.1.3.0/24には追加のCOMMUNITY 10:3を付加してAS200へ送信する

ルートを制御するためにISP1でCOMMUNITYを付加します。付加するCOMMUNITYは自由に決められます。今回は下記の表ように各ルートにCOMMUNITYを付加します。

BGPルート付加するCOMMUNITY
111.1.1.0/241:1000
150.1.0.0/161:1000
100.1.1.0/241:1
100.1.2.0/241:2
100.1.3.0/241:3
表 ISP1で付加するCOMMUNITY

プライベートCOMMUNITYの設定と動作の確認

ISP1 BGPルートにCOMMUNITYを付加

COMMUNITYによってルートをグループ化するので、同じ制御を行いたいルートには同じCOMMUNITYを付加します。今回は、111.1.1.0/24と150.1.0.0/16は同じ制御を行うため同じ値のCOMMUNITYを付加します。それ以外の3つのルートはそれぞれ異なる制御なので、個別にCOMMUNITYを付加します。

ISP1でのCOMMUNITY付加の設定は次の通りです。

ISP1 COMMUNITY付加の設定

ip bgp-community new-format
!
access-list 1 permit 111.11.1.0
access-list 1 permit 150.1.0.0
access-list 10 permit 100.1.1.0
access-list 20 permit 100.1.2.0
access-list 30 permit 100.1.3.0
!
route-map COMMUNITY2 permit 10
 match ip address 1
 set community 1:1000
!
route-map COMMUNITY2 permit 20
 match ip address 10
 set community 1:1
!
route-map COMMUNITY2 permit 30
 match ip address 20
 set community 1:2
!
route-map COMMUNITY2 permit 40
 match ip address 30
 set community 1:3
!
route-map COMMUNITY permit 1000
!
router bgp 1
 neighbor 172.16.1.1 route-map COMMUNITY2 out

COMMUNITYを「AS番号:識別子」のフォーマットで扱うためにip bgp-community new-formatを設定しています。他のルータも同様です。
ルートマップを反映させるために#clear ip bgp * outでBGPルートを再送信します。

今回の設定では、各ルータのネイバーの設定にneighbor send-communityをすでに入れています。実際にCOMMUNITYによる制御を行うR3において、ISP1で付加したCOMMUNITYを確認します。

R3 COMMUNITYの確認

R3#sh ip bgp community 1:1000
~省略~

   Network          Next Hop            Metric LocPrf Weight Path
*> 111.1.1.0/24     1.1.1.1                                0 100 1 i
*> 150.1.0.0        1.1.1.1                                0 100 1 i
R3#sh ip bgp community 1:1
~省略~

   Network          Next Hop            Metric LocPrf Weight Path
*> 100.1.1.0/24     1.1.1.1                                0 100 1 i
R3#sh ip bgp community 1:2
~省略~

   Network          Next Hop            Metric LocPrf Weight Path
*> 100.1.2.0/24     1.1.1.1                                0 100 1 i
R3#sh ip bgp community 1:3
~省略~

   Network          Next Hop            Metric LocPrf Weight Path
*> 100.1.3.0/24     1.1.1.1                                0 100 1 i

R3 COMMUNITYを参照してルートを制御

R3で、付加されているCOMMUNITYを参照してルート制御を行います。そのための設定は次のようになります。

R3 COMMUNITYによるルート制御の設定

ip community-list 1 permit 1:1000
ip community-list 2 permit 1:1
ip community-list 3 permit 1:2
ip community-list 4 permit 1:3
!
route-map COMMUNITY_ACTION deny 10
 match community 1
route-map COMMUNITY_ACTION permit 20
 match community 2
 set metric 10
route-map COMMUNITY_ACTION permit 30
 match community 3
 set as-path prepend 300
route-map COMMUNITY_ACTION permit 40
 match community 4
 set community 10:3 additive
route-map COMMUNITY_ACTION permit 1000
!
router bgp 300
 neighbor 2.2.2.2 route-map COMMUNITY_ACTION out

この設定について、もう少し詳しく解説します。まず、付加されているCOMMUNITYを参照するためのコミュニティリストを作成しています。

コミュニティリストの作成

ip community-list 1 permit 1:1000
ip community-list 2 permit 1:1
ip community-list 3 permit 1:2
ip community-list 4 permit 1:3

コミュニティリストをルートマップのmatch条件で指定することで、ルートに付加されているCOMMUNITYの値を参照した制御が可能です。

ルートマップ「COMMUNITY_ACTION」で最初に決めた実際のルート制御を設定しています。まず、シーケンス10ではルートのフィルタです。1:1000(コミュニティリスト1)が付加されているルートはdenyでフィルタします。

route-map COMMUNITY_ACTION deny 10
 match community 1

シーケンス20では1:1(コミュニティリスト2)が付加されているルートにMED 10を付加して送信しています。

route-map COMMUNITY_ACTION permit 20
 match community 2
 set metric 10

シーケンス30は1:2(コミュニティリスト3)が付加されているルートに対して追加のAS_PATHプリペンドを行っています。

route-map COMMUNITY_ACTION permit 30
 match community 3
 set as-path prepend 300

シーケンス40は1:3(コミュニティリスト4)が付加されているルートに対して追加のCOMMUNITY 10:3を付加しています。additiveのオプションがないと、COMMUNITY値が書き換わってしまうので注意してください。

route-map COMMUNITY_ACTION permit 40
 match community 4
 set community 10:3 additive

また、シーケンス1000はそのほかのルートをすべてpermitするためのものです。

route-map COMMUNITY_ACTION permit 1000

今回考えている構成では、扱っているルートが全部で6つしかなく、これまでのシーケンスで処理されているのでシーケンス1000は不要です。ですが、実際の環境では、その他のたくさんのルートがあることがほとんどです。それらを送信するためにシーケンス1000が必要です。

図 COMMUNITY付加と制御の様子
図 COMMUNITY付加と制御の様子

COMMUNITYによるルート制御の確認

R2で実際のBGPテーブルを確認しましょう。

R2 BGPテーブル

R2#show ip bgp
BGP table version is 18, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 100.1.1.0/24     3.3.3.3                 10             0 300 100 1 i
*> 100.1.2.0/24     3.3.3.3                                0 300 300 100 1 i
*> 100.1.3.0/24     3.3.3.3                                0 300 100 1 i
R2#show ip bgp 100.1.1.0
BGP routing table entry for 100.1.1.0/24, version 16
Paths: (1 available, best #1, table Default-IP-Routing-Table)
  Not advertised to any peer
  300 100 1
    3.3.3.3 (metric 2) from 3.3.3.3 (100.100.1.3)
      Origin IGP, metric 10, localpref 100, valid, external, best
      Community: 1:1
R2#show ip bgp 100.1.2.0
BGP routing table entry for 100.1.2.0/24, version 18
Paths: (1 available, best #1, table Default-IP-Routing-Table)
Flag: 0x820
  Not advertised to any peer
  300 300 100 1
    3.3.3.3 (metric 2) from 3.3.3.3 (100.100.1.3)
      Origin IGP, localpref 100, valid, external, best
      Community: 1:2
R2#show ip bgp 100.1.3.0
BGP routing table entry for 100.1.3.0/24, version 17
Paths: (1 available, best #1, table Default-IP-Routing-Table)
  Not advertised to any peer
  300 100 1
    3.3.3.3 (metric 2) from 3.3.3.3 (100.100.1.3)
      Origin IGP, localpref 100, valid, external, best
      Community: 1:3 10:3

R2のBGPテーブルをみると、意図したとおりにルート制御ができていることがわかります。このようにCOMMUNITYを利用すれば、離れたAS間で何らかの条件でルートをグループ化してさまざまな制御を行うことが可能になります。

関連記事

BGPの仕組み