BGPルート操作を効率化!Ciscoでの正規表現の実践例

BGP では、正規表現を使うと AS_PATH を条件にして経路を探したり、フィルタしたりできます。Cisco ルータでは show ip bgp regexp で BGP テーブルを検索でき、同じ書き方を AS_PATH フィルタ(ip as-path access-list)でも使います。この記事では、BGP でよく使う正規表現の書き方と、実際の検索例を紹介します。

この記事でわかること
  1. BGP で使う正規表現の主な記号
  2. _ ^ $ で AS 番号を区切って指定する方法
  3. 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_PATH(␣はスペース)結果 10 2␣2␣20␣1000␣12 一致(1000 の一部) _10 2␣2␣20␣1000␣12 一致(1000 の一部) _10_ 2␣2␣20␣1000␣12 不一致 _10_ 1␣1␣10␣11 一致(AS 10) 枠が太いマスが、正規表現に一致した部分です。_ はスペースのほか、文字列の先頭や末尾にも一致します。
図1 正規表現が AS_PATH のどこに一致するか

隣接 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
^1_ 1␣1␣10␣11 _13$ 3␣3␣30␣1000␣13 先頭(^)=隣接する AS 末尾($)=経路を生成した AS AS 1 から広告 AS 13 で生成
図2 AS_PATH の先頭(^)と末尾($)

複数の 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 フィルタなどの設定に使うと安全です。

コメント