BGP では、正規表現を使うと AS_PATH を条件にして経路を探したり、フィルタしたりできます。Cisco ルータでは show ip bgp regexp で BGP テーブルを検索でき、同じ書き方を AS_PATH フィルタ(ip as-path access-list)でも使います。この記事では、BGP でよく使う正規表現の書き方と、実際の検索例を紹介します。
- BGP で使う正規表現の主な記号
_^$で AS 番号を区切って指定する方法show ip bgp regexpで経路を検索する例
正規表現の基本構文
BGP の経路を操作するときによく使う記号と、その意味です。正規表現は、AS_PATH を「1 1 10 11」のような、AS 番号をスペースで区切った文字列として扱います。
| 記号 | 意味 |
|---|---|
| _(アンダースコア) | カンマ、波かっこ、丸かっこ、スペース、文字列の先頭、文字列の末尾のどれかに一致する。AS_PATH では、主に AS 番号の区切りとして使う |
| ^(キャレット) | 文字列の先頭に一致する |
| $(ドル) | 文字列の末尾に一致する |
| .(ピリオド) | 任意の 1 文字に一致する(スペースも含む) |
| *(アスタリスク) | 直前の文字の 0 回以上の繰り返しに一致する |
| +(プラス) | 直前の文字の 1 回以上の繰り返しに一致する |
| ?(クエスチョン) | 直前の文字の 0 回または 1 回に一致する |
| [ ](角かっこ) | かっこの中の文字のどれか 1 文字に一致する。[1-3] のようにハイフンで範囲を書ける |
正規表現は、AS_PATH の中の一部分に一致すれば「一致」になります。そのため、10 と書くと AS 10 だけでなく、AS 1000 の「10」の部分にも一致します。AS 番号ちょうどを指定したいときは、_10_ のように前後を _ で区切ります。
よく使う正規表現の例
BGP の経路操作でよく使う正規表現の例です。次の章で、実際にこれらで検索します。
| 正規表現 | 意味 |
|---|---|
| 10 | 「10」という文字を含む(AS 10 のほか、AS 1000 や AS 110 にも一致) |
| _10 | 区切りのすぐ後に「10」がある(AS 10 のほか、AS 1000 にも一致) |
| _10_ | 前後が区切りの「10」がある。AS 10 を通過した経路 |
| ^1_ | 先頭の AS が 1。隣接する AS 1 から広告された経路 |
| _13$ | 最後の AS が 13。AS 13 で生成された経路 |
| 1[13] | 「11」または「13」という文字を含む |
| [1-3]0 | 「10」「20」「30」のどれかの文字を含む |
| ^[12]_[23]_ | 先頭の AS が 1 か 2 で、その次の AS が 2 か 3 |
| _1[23]$ | 最後の AS が 12 か 13 |
| _1.$ | 最後の AS が 10〜19(1 の後に任意の 1 文字) |
| ^$ | 空の文字列。AS_PATH が空の、自 AS 内で生成された経路 |
記号の詳しい説明は、Cisco のドキュメントを参考にしてください。
>> 参考:Terminal Services Configuration Guide, Cisco IOS XE Release 16.x – Regular Expressions
活用例:BGP テーブルを使った検索
R5 の次の BGP テーブルを使って、正規表現で検索した例を見ていきます。show ip bgp regexp 正規表現 で、AS_PATH が正規表現に一致する経路だけを表示できます。
R5
R5# show ip bgp
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 i
*> 2.2.2.2/32 192.168.25.2 0 0 2 2 20 1000 12 i
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 i
*> 4.4.4.4/32 192.168.45.4 0 0 4 i
*> 5.5.5.5/32 0.0.0.0 0 32768 i
特定の AS を通過した経路を検索
AS 10 を通過した経路を検索します。正規表現を 10 だけにすると、AS 10 だけでなく、AS 1000 を含む経路も一致します。
R5
R5# show ip bgp regexp 10
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 i
*> 2.2.2.2/32 192.168.25.2 0 0 2 2 20 1000 12 i
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 I
_10 にすると、「10」の前が区切りであることも条件になります。ただし、AS 1000 の先頭の「10」も条件を満たすので、結果は変わりません。
R5
R5# show ip bgp regexp _10
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 i
*> 2.2.2.2/32 192.168.25.2 0 0 2 2 20 1000 12 i
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 I
AS 10 を通過した経路だけを検索するには、「10」の前後を区切りにする必要があるので、_10_ で検索します。
R5
R5# show ip bgp regexp _10_
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 I
隣接 AS から広告された経路を検索
隣接する AS 1 から広告された経路を検索するには、先頭が「1」で、その後が区切りという条件にします。AS_PATH の先頭は、R5 から見て最後に通った AS、つまり隣接する AS です。
R5
R5# show ip bgp regexp ^1_
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 I
特定の AS で生成された経路を検索
AS 13 で生成された経路は、末尾が「13」で、その前が区切りという条件で検索します。AS_PATH の末尾は、経路を最初に広告した(生成した)AS です。
R5
R5# show ip bgp regexp _13$
BGP table version is 12, local router ID is 5.5.5.5
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
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 i
複数の AS の条件を組み合わせて検索
AS_PATH に「11」または「13」という文字を含む経路を検索します。
R5
R5# show ip bgp regexp 1[13]
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 i
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 I
AS_PATH に「10」「20」「30」のどれかの文字を含む経路を検索します。2.2.2.2/32 と 3.3.3.3/32 は、AS 20、AS 30 のほか、AS 1000 の「10」でも一致しています。
R5
R5# show ip bgp regexp [1-3]0
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 i
*> 2.2.2.2/32 192.168.25.2 0 0 2 2 20 1000 12 i
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 i
AS_PATH の先頭の AS 番号が 1 か 2 で、次の AS 番号が 2 か 3 である経路を検索します。1.1.1.1/32 は先頭が「1 1」で、次の AS が 2 でも 3 でもないので一致しません。
R5
R5# show ip bgp regexp ^[12]_[23]_
BGP table version is 12, local router ID is 5.5.5.5
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
*> 2.2.2.2/32 192.168.25.2 0 0 2 2 20 1000 12 i
AS_PATH の最後の AS 番号が 12 か 13 である経路を検索します。
R5
R5# show ip bgp regexp _1[23]$
BGP table version is 12, local router ID is 5.5.5.5
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
*> 2.2.2.2/32 192.168.25.2 0 0 2 2 20 1000 12 i
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 i
AS_PATH の最後の AS 番号が 10〜19 である経路を検索します。. は任意の 1 文字なので、1. は 10〜19 の 2 桁の番号に一致します。
R5
R5# show ip bgp regexp _1.$
BGP table version is 12, local router ID is 5.5.5.5
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
*> 1.1.1.1/32 192.168.15.1 0 0 1 1 10 11 i
*> 2.2.2.2/32 192.168.25.2 0 0 2 2 20 1000 12 i
*> 3.3.3.3/32 192.168.35.3 0 0 3 3 30 1000 13 I
自 AS 内で生成された経路を検索
自分の AS の中で生成された経路は、AS_PATH が空です。そのため、空の文字列を表す ^$ で検索できます。
R5
R5# show ip bgp regexp ^$
BGP table version is 12, local router ID is 5.5.5.5
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
*> 5.5.5.5/32 0.0.0.0 0 32768 i
BGP では、同じ AS の中のピア(iBGP)に経路を送るとき、AS_PATH に自分の AS 番号を付けません。そのため、^$ には自分で生成した経路のほか、iBGP で受け取った同じ AS 内の経路も一致します。
まとめ
| 正規表現 | 探したい経路 |
|---|---|
| _10_ | AS 10 を通過した経路 |
| ^1_ | 隣接する AS 1 から広告された経路 |
| _13$ | AS 13 で生成された経路 |
| ^$ | 自 AS 内で生成された経路 |
AS 番号を指定するときは、_ で前後を区切るのが基本です。区切らないと、AS 1000 のように番号の一部が同じ AS にも一致します。show ip bgp regexp で結果を確かめてから、AS_PATH フィルタなどの設定に使うと安全です。
コメント