目次
概要
BGPルートフィルタのフィルタリストの設定と確認コマンドについて解説します。フィルタリストは、AS_PATH ACLによってフィルタするBGPルートを特定します。AS_PATH ACLでは、フィルタ対象のBGPルートのAS_PATHアトリビュートを正規表現により特定します。
フィルタリストの設定の流れ
フィルタリストでBGPルートをフィルタするための設定の流れは、以下の通りです。
- AS_PATH ACLでフィルタするルート情報を特定する
- 特定のネイバーへAS_PATH ACLを適用する
- 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」があることも忘れないでください。

AS_PATHアトリビュートの正規表現の考え方
AS_PATHアトリビュートの例
BGPルートには必ずAS_PATHアトリビュートが付加されています。AS_PATHアトリビュートはWell known Mandatoryアトリビュートです。
関連記事
BGPルートに必ず付加されるWell-known Mandatoryアトリビュートについて、以下の記事で詳しく解説しています。
AS_PATHアトリビュートには、BGPルートがアドバタイズされてきたAS番号がリストされています。以下のネットワーク構成で具体的に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アトリビュート パケットキャプチャ
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アトリビュートの文字列の文字の種類としては、以下が考えられます。
- 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アトリビュート |
BGPルートの再送受信
フィルタリストをネイバーに適用するだけでは、ルートフィルタは反映されません。BGPルートの再送受信が必要です。フィルタリストを適用している方向によって、再送または再受信してください。特権EXECモードで次のコマンドを利用します。
BGPルートの再送受信
#clear ip bgp <ip-address> {in|out}
<ip-address> : ネイバーのIPアドレス
フィルタリストの確認コマンド
フィルタリストによるBGPルートフィルタを確認するための主なshowコマンドを以下の表にまとめています。
コマンド | 概要 |
---|---|
#show ip as-path access-list | BGPルートを特定するためのAS_PATH ACLを確認します。 |
#show ip protocols | BGPネイバーに適用されている AS_PATH ACL を確認します。 |
#show ip bgp | BGPテーブルを確認します。 |
#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の仕組み
- BGPの概要 ~AS間でルート情報を交換~
- BGPの動作
- BGPの基本設定と確認コマンド
- BGPピアグループ(Peer Group) ~ネイバーの設定をまとめよう~
- BGPネイバーの状態
- BGPコンフェデレーションの設定
- BGPコンフェデレーションの設定例
- BGPネイバー認証
- BGP Well Known Mandatory アトリビュート -ORIGIN/AS_PATH/NEXT_HOP-
- 図解!BGPベストパス選択アルゴリズム
- BGP 基本的な設定についての演習[Cisco]
- BGPの基本的な設定についての演習 ~トラブルシュート~
- BGP KEEPALIVEタイマ/ホールドタイムの設定
- BGPルート 最小送信間隔の設定
- BGPルートダンプニング
- マルチホーム – インターネット接続の冗長化 –
- マルチホームAS BGPルートフィルタのポイント
- マルチホームAS ベストパス選択のポイント
- マルチホームAS IGPとBGPの連携のポイント
- マルチホームAS BGPの設定例
- IP-VPNでのBGPの利用 設定例
- BGPルートフィルタの種類
- BGPルートフィルタ -ディストリビュートリスト-
- BGPルートフィルタ -ディストリビュートリスト設定例-
- BGPルートフィルタ -プレフィクスリスト-
- BGPルートフィルタ -プレフィクスリスト設定例-
- BGPルートフィルタ -フィルタリスト(AS_PATH ACL)-
- BGPルートフィルタ -フィルタリスト(AS_PATH ACL)設定例-
- BGPルートフィルタ -ルートマップ(route-map)-
- BGPルートフィルタ -ルートマップ(route-map)設定例-
- BGP neighbor allowas-inコマンド
- BGP neighbor as-overrideコマンド
- BGPルート RIB Failure
- BGPルート アドミニストレイティブディスタンスの制御
- BGPルートの負荷分散
- BGPルート 条件付き生成
- BGPルート 条件付きアドバタイズ
- BGP ルート集約 自動集約
- BGPルート集約 networkコマンドによる集約
- BGPルート集約 networkコマンドによる集約 設定例
- BGP ルート集約 aggregate-addressコマンドによる集約
- aggregate-addressコマンドのオプション summary-only
- aggregate-addressコマンドのオプション attribute-map
- aggregate-addressコマンドのオプション as-set
- aggregate-addressコマンドのオプション advertise-map
- aggregate-addressコマンド as-set/attribute-map/advertise-map 設定例
- BGP選択型集約の概要
- BGP選択型集約 suppress-map
- BGP選択型集約 unsuppress-map
- BGP 選択型集約 suppress-map/unsuppress-map 設定例
- BGP local-as ~ネイバーに他のASのように見せる~
- BGP neighbor remove-private-ASコマンド
- bgp fast external-fallover
- BGP プレフィクス数の制限
- BGP COMMUNITYアトリビュートの使い方
- BGP Well-known COMMUNITYのルートフィルタ設定例
- BGP プライベートCOMMUNITYによるルート制御の設定例
- [演習]BGP応用 Part1:BGP基本設定
- [演習]BGP応用 Part2:ルート集約
- [演習]BGP応用 Part3:ポリシーベースルーティング
- [演習]BGP応用 Part4:トラブルシューティング
- BGP 設定ミスの切り分けと修正 Part1
- BGP 設定ミスの切り分けと修正 Part2
- BGP 設定ミスの切り分けと修正 Part3
- BGP 設定ミスの切り分けと修正 Part4
- BGP 設定ミスの切り分けと修正 Part5
- BGP 設定ミスの切り分けと修正 Part6
- BGP 設定ミスの切り分けと修正 Part7
- IPv6 BGPの設定例 Part1
- IPv6 BGPの設定例 Part2
- 2021年10月4日 Facebookに何が起こったか?
- IPv4 BGPネイバーでのIPv6プレフィックスの交換