ルーティングポリシー一致条件として使用するASパス正規表現の理解
BGP AS パス とは、ネットワーク パケットが特定のルータに行き着くまでに通過する自律システムによるシーケンスです。AS番号は右から左に読まれるシーケンスで組み立てられます。たとえば、AS パス 5 4 3 2 1 のルートで宛先に到達するパケットの場合、パケットは最初に AS 5 を通過して、AS 1 に到着するまでルーターの通過を繰り返します。この場合、AS 1はパケットの宛先前の最後のASであり、パケット送信元がピアするASとなります。
AS パスとルーティング ポリシーの一致条件を使用する場合は、正規表現を使用してルートを検索できます。これを実行するには、ASパスの一部または全部に基づいて1つ以上の一致条件を作成し、それをルーティングポリシーに含めます。
以下のセクションでは、ASパス正規表現を説明し、設定の例を示します。
ASパス正規表現の設定
名前付きASパス正規表現を作成し、as-path
一致条件を使ってルーティングポリシーに含めることができます(詳細はルーティングポリシー一致条件を参照)。名前付きASパス正規表現を作成するには、as-path
ステートメントを含めます。
[edit policy-options] as-path name regular-expression;
AS パス正規表現をルーティング ポリシーに含めるには、from
ステートメントに as-path
一致致条件を含めます。
また、AS パス正規表現で構成された名前付き AS パス グループを作成して、それを as-path-group
一致条件を使ってルーティング ポリシーに含めることもできます。名前付き AS パス グループを作成するには、以下に示すように as-path-group
ステートメントを含めます。
[edit policy-options] as-path-group group-name { name [ regular-expressions ]; }
AS パス グループ内の AS パス正規表現をルーティング ポリシーに含めるには、from
ステートメントに as-path-group
一致条件を含めます。
as-path
と as-path-group
の両方のステートメントを同じポリシー条件に含めることはできません。
from
ステートメントのas-path
一致条件に、複数のASパス正規表現の名前を含めることができます。これを実行すると、ASパス正規表現が1つでも一致すれば、一致が成立します。AS パス正規表現による一致は、本質的には論理的 OR 演算です。
AS パス名は正規表現で指定します。ここでは、文字、数字、ハイフン(-)を含め、最大65,536文字までを使用できます。名前にスペースを含めるには、名前全体を引用符(“ ”)で囲みます。
正規表現は、AS パスの全部または一部と一致するために使用します。この正規表現は、2つの要素で構成され、以下の形式で指定します。
term <operator>
term
- AS を指定します。以下のいずれかの方法で指定できます。AS番号 - AS 番号全体で1つの項を形成します。POSIX 1003.2 で定義されている正規表現とは異なり、AS 番号内の個々の文字を参照することはできません。
ワイルドカード文字 - 任意の単一の AS 番号に一致させます。ワイルドカード文字はピリオド(.)です。複数のワイルドカード文字を指定できます。
AS パス - 単一の AS 番号、または丸カッコで囲んだ AS 番号のグループ。この方法で正規表現をグループ化すれば、グループ全体で共通の動作を実行し、グループに優先順位を付けることができます。グループ化されたパスは、それ自体が演算子を含むことができます。
Junos OSリリース9.1以降では、RFC 4893の4オクテットAS番号スペースのBGPサポートに定義されている4バイトAS番号と、Junos OS旧リリースがサポートする2バイトAS番号の両方を指定できます。1~4,294,967,295 の範囲で値を設定できます。
operator
—(オプション)項の一致要件を指定する演算子。ほとんどの演算子は、一致しているとみなされるために必要な項の検出回数を表しています(たとえば、任意の出現回数、0回、1回など)。表 1は、ASパスがサポートする正規表現の演算子のリストです。演算子は、term
の直後に記述し、間にスペースは入れません。ただし、2つの項の間にパイプ(|)やダッシュ(–)演算子を記述する場合と、項を丸カッコで囲む場合は除きます。
1つの正規表現で1つ以上の項と演算子のペアを指定できます。
表 2 は、AS パスの一致要件を正規表現で定義する方法を示します。
オペレータ |
一致定義 |
---|---|
|
少なくとも |
|
正確に |
|
|
|
0回以上 |
|
1回以上 |
|
0回または1回 |
|
パイプの両側の2項のうちの1項が一致。 |
|
開始項と終了項の範囲に含まれる値。 |
|
コミュニティ属性の正規表現の先頭の文字。この文字は暗黙的に追加されるため、使用は任意。 |
|
コミュニティ属性の正規表現の末尾の文字。この文字は暗黙的に追加されるため、使用は任意。 |
|
丸カッコで囲まれた項のグループ。カッコと項の間のスペースは無視される。"()" のように丸カッコを引用符で囲み、間にスペースを入れなければ、NULL パスを指す。 |
|
AS 番号のセット。このセットから必ず1つのAS番号が一致する。ハイフン(-)を使って範囲の開始と終了を指定する。セット内の特定のAS番号を一致条件から除外するには、[^123]のようにキャレット(^)を使用。 |
一致するASパス |
正規表現 |
一致結果の例 |
---|---|---|
ASパスが1234 |
1234 |
1234 |
AS番号1234が0回以上出現 |
1234* |
1234 1234 1234 1234 1234 1234 NULL ASパス |
AS番号1234が0回以上出現 |
1234? または 1234{0,1} |
1234 NULL ASパス |
AS番号1234が1~4回出現 |
1234{1,4} |
1234 1234 1234 1234 1234 1234 1234 1234 1234 1234 |
AS番号12が1~4回出現し、続いてAS番号34が1回出現 |
12{1,4} 34 |
12 34 12 12 34 12 12 12 34 12 12 12 12 34 |
単一AS番号と一致するAS番号の範囲 |
123–125 |
123 124 125 |
[123–125]* |
NULL ASパス 123 124 124 125 125 125 123 124 125 123 |
|
2番目のAS番号が必ず56または78のパス |
(. 56) | (. 78) または . (56 | 78) |
1234 56 1234 78 9876 56 3857 78 |
2番目のAS番号が56または78のパス |
. (56 | 78)? |
1234 56 52 34 56 1234 1234 78 39 794 78 2 |
1番目のAS番号が123で、2番目のAS番号が56または78のパス |
123 (56|78) |
123 56 123 78 |
存在しないものを除くすべての長さのパスで、2番目のAS番号は存在しないものも含めて何でも可 |
. .* または . .{ 0,} |
1234 1234 5678 1234 5 6 7 8 |
ASパスが1 2 3 |
1 2 3 |
1 2 3 |
AS番号1および2の出現回数が1回、続いてAS番号3の出現回数が1回以上 |
1 2 3+ |
1 2 3 1 2 3 3 1 2 3 3 3 |
AS番号1の出現回数が1回以上、続いてAS番号2の出現回数が1回以上、 続いてAS番号3の出現回数が1回以上 |
1+ 2+ 3+ |
1 2 3 1 1 2 3 1 1 2 2 3 1 1 2 2 3 3 |
AS番号4、5、6で始まる任意の長さのパス |
4 5 6 .* |
4 5 6 4 5 6 7 8 9 |
AS番号4、5、6 で終わる任意の長さのパス |
.* 4 5 6 |
4 5 6 1 2 3 4 5 6 4 9 4 5 6 |
ASパス5、12、または18 |
5 | 12 | 18 |
5 12 18 |
NULL ASパスの設定
AS パスの正規表現を使えば、自身の AS を起点としたルート(プレフィックス)に一致する NULL AS パスを作成できます。これらのルートは、どの外部ピアからもASにアドバタイズされていません。NULL ASパスを作成するには、スペースを入れずに引用符で丸カッコの演算子を囲みます。
[edit policy-options] as-path null-as “()";
以下の例では、ローカル管理された AS 2 が AS 1(10.2.2.6)と AS 3 接続されます。AS 3はAS 2にそのルートをアドバタイズしますが、AS 2の管理者は、AS 3のルートをAS 1にアドバタイズすることを望まないため、AS 1からAS 2を経由してAS 3へのトランジットトラフィックを許可します。トランジット トラフィックを防ぐには、AS 1 に only-my-routes
エクスポート ポリシーを適用します。これで、AS 2 から AS 1 へのルートのアドバタイズは許可されますが、AS 3 へのルート(または他の接続 AS のルート)の AS 1 へのアドバタイズは抑制されます。
[edit policy-options] as-path null-as "()"; policy-statement only-my-routes { term just-my-as { from { protocol bgp; as-path null-as; } then accept; } term nothing-else { then reject; } } protocol { bgp { neighbor 10.2.2.6 { export only-my-routes; } } }
AS パス の正規表現の評価方法
ASパス正規表現は、POSIX 1003.2に定義されている拡張(最新)正規表現を実装しています。これらは、次の例外を除いてUNIX正規表現と同等です。
AS パス番号の正規表現に一致させる基本単位は、AS 番号であり、個々の文字でありません。
正規表現では、ルート内の AS パスが
regular-expression
と完全に一致する場合のみルートに一致します。これと同等の UNIX 正規表現は、^regular-expression$
です。たとえば、AS パス正規表現の1234
は、UNIX正規表現の^1234$
と同等です。ワイルドカード演算子を使用して、正規表現を指定できます。
例:AS パス正規表現の構成
ルートを AS 1234 56 78 9 パスと完全に一致させ、受け入れます。
[edit] policy-options { as-path wellington "1234 56 78 9"; policy-statement from-wellington { term term1 { from as-path wellington; } then { preference 200; accept; } term term2 { then reject; } } }
代替パスをASに一致させ、設定を変更した後に受け入れます。
[edit] policy-options { as-path wellington-alternate “1234{1,6} (56|47)? (78|101|112)* 9+”; policy-statement from-wellington { from as-path wellington-alternate; } then { preference 200; accept; } } }
ルートを 123、124、または 125 の AS パスに一致させ、設定を変更した後に受け入れます。
[edit] policy-options { as-path addison "123–125"; policy-statement from-addison { from as-path addison; } then { preference 200; accept; } } }