概要

BGPルートフィルタのフィルタリストの設定と確認コマンドについて解説します。フィルタリストは、AS_PATH ACLによってフィルタするBGPルートを特定します。AS_PATH ACLでは、フィルタ対象のBGPルートのAS_PATHアトリビュートを正規表現により特定します。

フィルタリストの設定の流れ

フィルタリストでBGPルートをフィルタするための設定の流れは、以下の通りです。

  1. AS_PATH ACLでフィルタするルート情報を特定する
  2. 特定のネイバーへAS_PATH ACLを適用する
  3. BGPルートを再送受信する

フィルタリストの設定コマンド

フィルタリスト(AS_PATH ACL)を作成して、BGPネイバーに適用するためのコマンドは以下の通りです。

フィルタリスト設定コマンド

(config)#ip as-path access-list <num> {permit|deny} <regular-expression>
(config)#router bgp <AS>
(config-router)#neighbor <ip-address> filter-list <as-path-acl-num> {in|out}

<as-path-acl-num>:AS_PATH ACL番号
<regular-expression>:AS_PATHアトリビュートの正規表現
<AS>:AS番号
<ip-address>:ネイバーのIPアドレス
<as-path-acl-num>:適用するAS_PATH ACL番号

AS_PATH ACLでは、BGPルートのAS_PATHアトリビュートをチェックしてBGPルートを特定します。AS_PATHアトリビュートは、BGPルートがアドバタイズされてきたAS番号がリストされています。AS_PATHアトリビュートの正規表現によりBGPルートを特定することがフィルタリストの一番のポイントです。AS_PATHアトリビュートをどのように正規表現で表すかは後述します。

そして、特定したBGPルートについてpermitまたはdenyの動作を決めます。permitはルート情報を許可します。すなわち、outで適用しているときは該当のBGPルートをアドバタイズします。inで適用すればBGPルートを受信します。denyは、ルート情報を拒否します。つまり、outで適用していると該当のBGPルートをアドバタイズしません。inで適用していると該当のBGPルートを受信しません。

AS_PATH ACLも通常のACLやプレフィクスリストと同様に、最後には「暗黙のdeny」があることも忘れないでください。

図 BGPルートフィルタ フィルタリスト(AS_PATH ACL)
図 BGPルートフィルタ フィルタリスト(AS_PATH ACL)

AS_PATHアトリビュートの正規表現の考え方

AS_PATHアトリビュートの例

BGPルートには必ずAS_PATHアトリビュートが付加されています。AS_PATHアトリビュートはWell known Mandatoryアトリビュートです。

AS_PATHアトリビュートには、BGPルートがアドバタイズされてきたAS番号がリストされています。以下のネットワーク構成で具体的にAS_PATHアトリビュートの例を考えます。

図 AS_PATHアトリビュートの例
図 AS_PATHアトリビュートの例

EBGPネイバーへBGPルートをアドバタイズするときにAS_PATHアトリビュートの先頭に自AS番号を付加します。この動作をプリペンド(prepend)と呼んでいます。

AS100内の「100.100.100.0/24」というルートは、BGPルートとして生成したときにはAS_PATHはカラです。そして、AS100からAS200へアドバタイズされるとAS_PATHは「100」になります。さらに、「100.100.100.0/24」のBGPルートは、AS200からAS2へアドバタイズされるとAS_PATHの先頭に200が追加されて「200 100」になります。同様にAS2からAS1へ 「100.100.100.0/24」のBGPルートがアドバタイズされると、「100.100.100.0/24」に付加されているAS_PATHは「2 200 100」となります。

このようなAS_PATHプリペンドの動作から、AS_PATHアトリビュート内のAS番号は次のような意味を持っています。

  • リストの最後のAS番号 : ルートの生成元AS
  • リストの先頭のAS番号 : ネイバーAS

この例のBGPルートのAS_PATHアトリビュートの意味は以下のようになります。

AS_PATHアトリビュートの意味

BGPルート「100.100.100.0/24」 AS_PATH 2 200 100

「100.100.100.0/24」というBGPルートはAS100で生成されています。そして、AS200を経由してAS2からAS1へとアドバタイズされています。

図のR1で受信するBGPルート「100.100.100.0/24」をキャプチャすると、以下のようになっています。

図 AS_PATHアトリビュート パケットキャプチャ
図 AS_PATHアトリビュート パケットキャプチャ

AS_PATHアトリビュート パケットキャプチャ

Frame 12: 139 bytes on wire (1112 bits), 139 bytes captured (1112 bits) on interface -, id 0
Ethernet II, Src: aa:bb:cc:00:02:00 (aa:bb:cc:00:02:00), Dst: aa:bb:cc:00:01:00 (aa:bb:cc:00:01:00)
Internet Protocol Version 4, Src: 10.0.0.2, Dst: 10.0.0.1
Transmission Control Protocol, Src Port: 51245, Dst Port: 179, Seq: 43, Ack: 24, Len: 85
Border Gateway Protocol - UPDATE Message
    Marker: ffffffffffffffffffffffffffffffff
    Length: 62
    Type: UPDATE Message (2)
    Withdrawn Routes Length: 0
    Total Path Attribute Length: 35
    Path attributes
        Path Attribute - ORIGIN: IGP
        Path Attribute - AS_PATH: 2 200 100 
            Flags: 0x40, Transitive, Well-known, Complete
            Type Code: AS_PATH (2)
            Length: 14
            AS Path segment: 2 200 100
                Segment type: AS_SEQUENCE (2)
                Segment length (number of ASN): 3
                AS4: 2
                AS4: 200
                AS4: 100
        Path Attribute - NEXT_HOP: 10.0.0.2 
            Flags: 0x40, Transitive, Well-known, Complete
            Type Code: NEXT_HOP (3)
            Length: 4
            Next hop: 10.0.0.2
        Path Attribute - MULTI_EXIT_DISC: 0
    Network Layer Reachability Information (NLRI)
        100.100.100.0/24
            NLRI prefix length: 24
            NLRI prefix: 100.100.100.0
Border Gateway Protocol - ROUTE-REFRESH Message

AS_PATHアトリビュートと正規表現

正規表現とは、文字列を表現する形式です。AS_PATHアトリビュートを正規表現で表すためにはAS_PATHアトリビュートを文字列とします。スペースで区切って、AS_PATHアトリビュートのAS番号を文字列にします。

図 AS_PATHを文字列に
図 AS_PATHを文字列に

AS_PATHアトリビュートの文字列の文字の種類としては、以下が考えられます。

  • 1から9の数字の文字列
  • ( )
  • { }
  • スペース

( )は、コンフェデレーションの設定をしているときにAS_PATHアトリビュートの文字列に現れてきます。また、{ }は、集約ルートでas-setの設定をしているときにAS_PATHアトリビュートの文字列に現れてきます。

正規表現の特殊文字

1つの形式で複数の文字列を表現するために、正規表現には特殊文字(メタ文字)があります。正規表現の特殊文字と通常の文字を組み合わせて利用します。主な正規表現の特殊文字をまとめたものが次の表です。

特殊文字意味
.任意の1文字
^文字列の先頭
$文字列の最後
_文字以外の先頭、最後、空白、タブ、コンマ
*直前の文字がないか1つ以上連続
?直前の文字がないか1つある
+直前の文字が1つ以上ある
|ORの条件
[ ][ ]内の文字のどれか
( )( )内の文字列を1つの文字として扱う
\直後の特殊文字を通常の文字として扱う
表 正規表現の特殊文字(メタ文字)

リンク

正規表現について、以下のWebサイトが参考になります。

AS_PATHアトリビュートの文字列の正規表現の例

AS_PATHアトリビュートの文字列を正規表現で表す例をいくつか考えます。

^1.

「^」は文字列の先頭を表しています。つまり、AS_PATHアトリビュートの先頭の文字が「1」です。そのあとの「.」は任意の1文字です。この正規表現に該当するAS_PATHアトリビュートとして、“10” “191 20” “15 10 20”などがあります。この正規表現は先頭の2文字分だけ指定していることになります。ですから、該当するAS_PATHアトリビュートの先頭のAS番号は、2桁だけかもしれませんし、3桁以上のものであるかもしれません。

AS_PATHアトリビュートの先頭はネイバーのAS番号が入ります。そのため、^の特殊文字はネイバーASを表すために使います。

^1._

上の正規表現の例とよく似ていますが、最後に「_」がついています。「_」は空白や最後などを表す特殊文字です。この正規表現は先頭のAS番号が10~19であるAS_PATHアトリビュートを示していることになります。_があるので先頭部分のAS番号は2桁です。つまり、該当するAS_PATHアトリビュートとしては、”11” “12 13 15” “19 1”などがあります。

_100$

「$」は文字列の最後を表す特殊文字です。そのため、この正規表現はAS_PATHアトリビュートの最後のAS番号が100であることを示しています。該当するAS_PATHアトリビュートとしては、”1 2 100” “100” “10 20 30 100”などがあります。

AS_PATHアトリビュートの最後のAS番号は、ルートが生成されたAS番号です。そのため、$の特殊文字はルートの生成元のAS番号を表すために使います。

_100_

「_」は通常の文字以外です。先頭であっても最後であっても空白であってもいいです。すると、この正規表現はAS_PATHアトリビュートのどこかに100があることを示しています。つまり、”1 2 100 200” “100” “100 1 2 3”などが該当します。

^2*3$

「*」は直前の文字がないか1つ以上連続していることを表しています。つまり「2*」は「2」がないか、1つ以上「2」が連続します。この正規表現に該当するAS_PATHアトリビュートは”3” “23” “223” “2223” “22223”があります。

^と$の間にAS番号を入れると、そのAS番号がネイバーASかつルートの生成元であることを意味します。

^2?3$

「?」は直前の文字がないか1つだけあることを表しています。この正規表現に該当するAS_PATHアトリビュートは”3” “23”です。

^2+3$

「+」は直前の文字が1つ以上あることを表しています。この正規表現に該当するAS_PATHアトリビュートは、”23” “223” “2223” “22223”があります。

^[123]1$

[ ]は[ ]内の文字のいずれかを表す特殊文字です。[123]は、1か2か3という意味です。そのため、この正規表現に該当するAS_PATHアトリビュートは”11” “21” “31”です。

連続した文字列であれば、-を使って表現できます。たとえば[0-9]は0から9のうちのいずれかという意味になります。

^(12)?1$

( )内を1つの文字として扱います。(12)は12をひとまとまりにするので、この正規表現に該当するAS_PATHアトリビュートは”1” “121”です。

(^10_)|(^20_)

|はその前後の文字のいずれかを表しています。この正規表現では|の前後を( )でグループ化しています。該当するAS_PATHアトリビュートは、”10 1” “20 10 1” “10” “20”などがあります。

\(65001\)_

\はそのあとの特殊文字を通常の文字として扱います。そのため、この正規表現に該当するAS_PATHアトリビュートは”(65001)” “(65001) 123”などがあります。

コンフェデレーションを利用しているとAS_PATHアトリビュートに( )が表れます。

^$

文字列の先頭と最後の間に何も文字が入っていないということは、AS_PATHアトリビュートが空っぽであることを示しています。

networkコマンドなどでBGPルートを生成したときAS_PATHは空っぽです。そのため、この正規表現は自AS内で生成したルートを表します。

.*

この正規表現は文字がまったくないか任意の文字の繰り返しです。つまり、あらゆるAS_PATHアトリビュートに該当する表現方法です。

次の表に正規表現の例と該当するAS_PATHアトリビュートをまとめます。

正規表現の例該当するAS_PATHアトリビュートの文字列
^1.“10” “191 20” “15 10 20”など
^1._”11” “12 13 15” “19 1”など
_100$”1 2 100” “100” “10 20 30 100”など
_100_”1 2 100 200” “100” “100 1 2 3”など
^2*3$”3” “23” “223” “2223” “22223”
^2?3$”3” “23”
^2+3$”23” “223” “2223” “22223”
^[123]1$”11” “21” “31”
^(12)?1$”1” “121”
(^10_)|(^20_)”10 1” “20 10 1” “10” “20”など
\(65001\)_”(65001)” “(65001) 123”など
^$空っぽ(自AS内で生成)
.*すべてのAS_PATHアトリビュート
表 AS_PATHアトリビュートの正規表現の例

BGPルートの再送受信

フィルタリストをネイバーに適用するだけでは、ルートフィルタは反映されません。BGPルートの再送受信が必要です。フィルタリストを適用している方向によって、再送または再受信してください。特権EXECモードで次のコマンドを利用します。

BGPルートの再送受信

#clear ip bgp <ip-address> {in|out}

<ip-address> : ネイバーのIPアドレス

フィルタリストの確認コマンド

フィルタリストによるBGPルートフィルタを確認するための主なshowコマンドを以下の表にまとめています。

コマンド概要
#show ip as-path access-listBGPルートを特定するためのAS_PATH ACLを確認します。
#show ip protocolsBGPネイバーに適用されている AS_PATH ACL を確認します。
#show ip bgpBGPテーブルを確認します。
#show ip bgp neighbor advertised-routes指定したBGPネイバーへアドバタイズするBGPルートを確認します。
#show ip bgp neighbor routes指定したBGPネイバーから受信したBGPルートを確認します。
表 フィルタリストの主な確認コマンド

show ip as-path access-list

show ip as-path access-listコマンドでAS_PATHアトリビュートの文字列を正規表現で特定してフィルタするためのAS_PATH ACLの内容を表示します。

show ip as-path access-list

R1#show ip as-path-access-list
AS path access list 1
    permit ^$
AS path access list 2
    permit _2$|_20$
AS path access list 3
    deny _2$|_20$
    permit .*

show ip protocols

ネイバーに適用されているフィルタリストを確認するには、show ip protocolsコマンドが便利です。

show ip protocols

R1#show ip protocols
*** IP Routing is NSF aware ***

-- omitted --

Routing Protocol is "bgp 1"
  Outgoing update filter list for all interfaces is not set
  Incoming update filter list for all interfaces is not set
  IGP synchronization is disabled
  Automatic route summarization is disabled
  Neighbor(s):
    Address          FiltIn FiltOut DistIn DistOut Weight RouteMap
    10.0.0.2              2       1
    10.0.0.6              3       1
  Maximum path: 1
  Routing Information Sources:
    Gateway         Distance      Last Update
    10.0.0.2              20      00:02:44
    10.0.0.6              20      00:02:43
  Distance: external 20 internal 200 local 200

show ip bgp

show ip bgpコマンドでBGPテーブルを確認します。意図したようにフィルタがかかっているかをみてください。show ip bgpのあとに正規表現を指定して、BGPテーブルの内容をフィルタして表示することもできます。

show ip bgp

R1#show ip bgp
BGP table version is 8, local router ID is 1.1.1.1
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
 *>  10.2.2.0/24      10.0.0.2                 0             0 2 i
 *>  10.2.20.0/24     10.0.0.2                 0             0 2 20 i
 *>  10.3.3.0/24      10.0.0.6                 0             0 3 i
 *>  10.3.30.0/24     10.0.0.6                 0             0 3 30 i
 *>  192.168.1.0      0.0.0.0                  0         32768 i
 *>  192.168.2.0      0.0.0.0                  0         32768 i
 *>  192.168.3.0      0.0.0.0                  0         32768 i
R1#show ip bgp regexp ^$
BGP table version is 8, local router ID is 1.1.1.1
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
 *>  192.168.1.0      0.0.0.0                  0         32768 i
 *>  192.168.2.0      0.0.0.0                  0         32768 i
 *>  192.168.3.0      0.0.0.0                  0         32768 i

show ip bgp neighbor advertised-routes

show ip bgp neighbor advertised-routesコマンドは特定のネイバーへアドバタイズするBGPルートを表示します。

show ip bgp neighbor advertised-routes

R1#show ip bgp neighbors 10.0.0.2 advertised-routes
BGP table version is 8, local router ID is 1.1.1.1
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
 *>  192.168.1.0      0.0.0.0                  0         32768 i
 *>  192.168.2.0      0.0.0.0                  0         32768 i
 *>  192.168.3.0      0.0.0.0                  0         32768 i

Total number of prefixes 3

show ip bgp neighbor routes

show ip bgp neighbor routesコマンドで特定のネイバーから受信したBGPルートを表示します。

show ip bgp neighbor routes

R1#show ip bgp neighbors 10.0.0.2 routes
BGP table version is 8, local router ID is 1.1.1.1
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
 *>  10.2.2.0/24      10.0.0.2                 0             0 2 i
 *>  10.2.20.0/24     10.0.0.2                 0             0 2 20 i

Total number of prefixes 2

まとめ

ポイント

  • フィルタリストによるBGPルートフィルタの設定の流れは以下の通りです。
    • AS_PATH ACLでフィルタするルート情報を特定する
    • 特定のネイバーへAS_PATH ACLを適用する
  • AS_PATH ACLは、BGPルートのAS_PATHアトリビュートによってフィルタするルート情報を特定します。

BGPの仕組み