ポリシー式の理解
ポリシー式は、ポリシー フレームワーク ソフトウェアに、ルーティング ポリシーを評価する別の方法を提供します。ポリシー式では、ポリシーでブール論理演算子を使用します。論理演算子は、ポリシーを評価するためのルールを確立します。
ポリシー式でのルーティング ポリシーの評価中に、受理、拒否、または次のポリシーのポリシー アクションは、TRUE または FALSE の値に変換されます。この値は、指定された論理演算子に対して評価され、TRUE または FALSE の出力が生成されます。その後、出力は、accept、reject、または次のポリシーのフロー制御アクションに変換されます。ポリシー式の結果は、1 つのポリシーに適用される場合と同様に適用されます。ルートが受理または拒否されて評価が終了するか、次のポリシーが評価されます。
表 1 は、ポリシー アクションとそれに対応する TRUE および FALSE 値、およびフロー制御アクション値をまとめたものです。 表 2 では、論理演算子について説明します。ポリシー式の評価の詳細については、「 政策表現の評価」を参照してください。
ポリシー式を括弧で囲む必要があります。ポリシー式は、 import
ステートメントまたは export
ステートメントと from policy
ステートメントの任意の場所に配置できます。
ポリシーアクション |
コンバージョン値 |
フロー制御アクション変換値 |
---|---|---|
受け入れる |
真 |
受け入れる |
リジェクト |
偽 |
リジェクト |
次のポリシー |
真 |
次のポリシー |
論理演算子 |
ポリシー式のロジック |
論理演算子がポリシー式の評価に与える影響 |
---|---|---|
&& (論理 AND) |
論理 AND では、TRUE の出力を生成するには、すべての値が TRUE である必要があります。 ルーティング ポリシー値が TRUE の場合、出力は TRUE になります。値が TRUE の場合と FALSE の場合、出力は FALSE になります。値が FALSE の場合と FALSE の場合、出力は FALSE になります。 |
最初のルーティング ポリシーが TRUE の値を返した場合、次のポリシーが評価されます。最初のポリシーが FALSE の値を返した場合、式の評価は終了し、式内の後続のポリシーは評価されません。 |
||(論理和) |
論理 OR では、TRUE の出力を生成するには、少なくとも 1 つの値が TRUE である必要があります。 ルーティング ポリシーの値が TRUE と FALSE の場合、出力は TRUE になります。値が TRUE の場合、出力は TRUE になります。値が FALSE の場合と FALSE の場合、出力は FALSE になります。 |
最初のルーティング ポリシーが値 TRUE を返す場合、式の評価は終了し、式内の後続のポリシーは評価されません。最初のポリシーが FALSE の値を返した場合、次のポリシーが評価されます。 |
! (論理NOT) |
論理 NOT は、TRUE の値を FALSE に、FALSE の値を TRUE に反転させます。また、受け入れと次のポリシーのアクションを取り消して拒否し、拒否して受け入れます。 |
論理 AND 演算子と一緒に使用し、最初のルーティング ポリシーの FALSE 値が TRUE に逆転した場合、次のポリシーが評価されます。TRUE の値が FALSE に戻された場合、式の評価は終了し、式内の後続のポリシーは評価されません。 論理OR演算子と一緒に使用し、FALSEの最初のルーティングポリシー値がTRUEに逆転した場合、式の評価は終了し、式内の後続のポリシーは評価されません。TRUE の値が FALSE に逆転すると、次のポリシーが評価されます。 あるポリシーで使用され、フロー制御アクションが accept または next policy の場合、これらのアクションは拒否に対して取り消されます。フロー制御アクションが拒否の場合、このアクションは逆に accept に設定されます。 |
詳細については、以下のセクションを参照してください。
ポリシー式の例
次の例は、論理演算子を使用してポリシー式を作成する方法を示しています。
論理AND:次の例では、
policy1
が最初に評価されます。policy1
が評価された後に値 TRUE が返された場合、policy2
が評価されます。値 FALSE が返された場合、policy2
は評価されません。export (policy1 && policy2)
論理OR:次の例では、
policy1
が最初に評価されます。policy1
が評価された後に値 TRUE が返された場合、policy2
は評価されません。値 FALSE が返された場合は、policy2
が評価されます。export (policy1 || policy2)
論理ORおよび論理AND:次の例では、
policy1
が最初に評価されます。policy1
が評価された後、値 TRUE が返された場合、policy2
はスキップされ、policy3
が評価されます。policy1
評価後に値 FALSE が返された場合は、policy2
が評価されます。policy2
が値 TRUE を返す場合は、policy3
が評価されます。policy2
が値 FALSE を返す場合、policy3
は評価されません。export [(policy1 || policy2) && policy3]
論理 NOT:次の例では、
policy1
が最初に評価されます。policy1
が評価された後に TRUE の値が返された場合、値は FALSE に逆転し、policy2
は評価されません。値 FALSE が返された場合、値は TRUE に逆転され、policy2
評価されます。export (!policy1 && policy2)
シーケンシャルリスト [policy1 policy2 policy3]
は、ポリシー式 (policy1 && policy2 && policy3)
と同じではありません。
シーケンシャルリストは、ルーティングポリシーに一致するルートに基づいて評価されます。たとえば、 policy1
が一致し、アクションが accept
または reject
の場合、 policy2
と policy3
は評価されません。policy1
一致しない場合は、一致が発生してアクションがaccept
またはreject
になるまで、policy2
が評価されます。
ポリシー式は、TRUE または FALSE の値に変換されたルーティング ポリシー内のアクションと、指定された論理演算子のロジックに基づいて評価されます。(ポリシー式の評価の詳細については、「 政策表現の評価」を参照してください)。たとえば、 policy1
が値 FALSE を返す場合、 policy2
と policy3
は評価されません。policy1
が値 TRUE を返す場合は、policy2
が評価されます。policy2
が値 FALSE を返す場合、policy3
は評価されません。policy2
が値 TRUE を返す場合は、policy3
が評価されます。
ポリシー式とシーケンシャルリストを組み合わせることもできます。次の例では、 policy1
が値 FALSE を返すと、 policy2
が評価されます。policy2
が値 TRUE を返し、next policy
アクションが含まれている場合は、policy3
が評価されます。policy2
が TRUE の値を返したが、next policy
アクションを含むアクションが含まれていない場合でも、policy3
が評価されます (アクションを指定しない場合、次の用語または次のポリシーがデフォルトのアクションになるため)。policy2
が値 TRUE を返し、accept
アクションが含まれている場合、policy3
は評価されません。
export [(policy1 || policy2) policy3]
政策表現の評価
評価時に、ポリシー フレームワーク ソフトウェアは、ポリシー アクションを、ルート上で実行されるフロー制御アクションを決定する要因である TRUE または FALSE の値に変換します。ただし、ソフトウェアは、ポリシー式全体を評価するまで、ルートに対して実際にフロー制御アクションを実行しません。
ポリシー フレームワーク ソフトウェアは、ポリシー式を次のように評価します。
ソフトウェアは、ポリシー式の最初のルーティング ポリシーに対してルートを評価し、指定されたアクションまたはデフォルトのアクションを TRUE または FALSE の値に変換します。(ポリシー・アクションのコンバージョン値については、 表 1を参照してください。
ソフトウェアは、TRUEまたはFALSEの値を受け取り、ポリシー式で使用される論理演算子に対して評価します( 表 2を参照)。使用された論理演算子に基づいて、次のポリシーが存在する場合、それを評価するかどうかがソフトウェアによって判断されます。
ポリシー フレームワーク ソフトウェアは、評価のショートカット方法を使用します。ポリシーの評価結果がポリシー式全体の値を事前に決定する場合、ソフトウェアは式内の後続のポリシーを評価しません。たとえば、ポリシー式で論理 AND 演算子が使用され、ポリシーの評価で FALSE が返された場合、未評価のポリシーの値に関係なく、式の最終値は FALSE であることが保証されるため、ソフトウェアは式内の後続のポリシーを評価しません。
ソフトウェアは、ポリシー式内の後続の各ルーティング・ポリシーに対してステップ1とステップ2を実行します(存在する場合、それらを評価する必要がある場合)。
最後のルーティング ポリシーを評価した後、適切であれば、ソフトウェアは各ルーティング ポリシーの評価から得られた TRUE または FALSE の値を評価します。使用された論理演算子に基づいて、TRUE または FALSE の出力が計算されます。
ソフトウェアは、TRUE または FALSE の出力をアクションに戻します。(ポリシー・アクションのコンバージョン値については、 表 1を参照してください。アクションが実行されます。
式内の各ポリシーが TRUE の値を返した場合、ソフトウェアは TRUE の出力を最後のポリシーで指定されたフロー制御アクションに戻します。たとえば、ポリシー式
(policy1 && policy2)
が指定され、policy1
でaccept
が指定され、policy2
でnext term
が指定されている場合、next term
アクションが実行されます。ポリシーの 1 つで指定されたアクションがルート特性を操作する場合、ポリシー フレームワーク ソフトウェアは、残りのポリシーの評価中に新しいルート特性を転送します。たとえば、ポリシー式の最初のポリシーで指定されたアクションでルートのメトリックが 500 に設定されている場合、このルートは次のポリシーで定義された
metric 500
の条件に一致します。ただし、ポリシー式の途中または末尾にあるポリシーでルート特性操作アクションが指定されている場合、ショートカット評価により、ポリシーが評価されず、ルート特性の操作が発生しない可能性があります。
ポリシー式の評価
以下のルーティング ポリシー例では、3 つのポリシー式を使用しています。
[edit] policy-options { policy-statement policy-A { from { route-filter 10.10.0.0/16 orlonger; } then reject; } } policy-options { policy-statement policy-B { from { route-filter 10.20.0.0/16 orlonger; } then accept; } } protocols { bgp { neighbor 192.168.1.1 { export (policy-A && policy-B); } neighbor 192.168.2.1 { export (policy-A || policy-B); } neighbor 192.168.3.1 { export (!policy-A); } } }
ポリシー フレームワーク ソフトウェアは、トランジット BGP ルート 10.10.1.0/24 を、サンプル ルーティング ポリシーで指定された 3 つのポリシー式に対して、以下のように評価します。
(policy-A & policy-B)—10.10.1.0/24 は
policy-A
に対して評価されます。10.10.1.0/24 はpolicy-A
で指定されたルート リストと一致するため、指定されたアクションreject
が返されます。reject
は値 FALSE に変換され、FALSE は指定された論理 AND に対して評価されます。policy-B
の評価の結果がどうであれ、FALSE の結果は確実であるため (ポリシー式のロジックでは、結果と値が FALSE の場合、FALSE の出力が生成されます)、policy-B
は評価されず、FALSE の出力が生成されます。FALSE 出力はreject
に変換され、10.10.1.0/24 は拒否されます。(policy-A || policy-B)—10.10.1.0/24 は
policy-A
に対して評価されます。10.10.1.0/24 はpolicy-A
で指定されたルート リストと一致するため、指定されたアクションreject
が返されます。reject
は値 FALSE に変換され、指定された論理 OR に対して FALSE が評価されます。論理 OR は、TRUE の出力を生成するために少なくとも 1 つの値 TRUE を必要とするため、10.10.1.0/24 はpolicy-B
に対して評価されます。10.10.1.0/24 はpolicy-B
と一致しないため、デフォルトのアクションnext-policy
が返されます。next-policy
は値 TRUE に変換され、次に FALSE (policy-A
評価の場合) と TRUE (policy-B
評価の場合) の値が、指定された論理 OR に対して評価されます。ポリシー式ロジックでは、FALSE または TRUE は TRUE の出力を生成します。TRUE の出力はnext-policy
に変換されます。(TRUEはポリシーフレームワークソフトウェアによって保持された最後のアクションnext-policy
ため、next-policy
に変換されます。policy-B
はポリシー式の最後のルーティングポリシーであるため、BGPのデフォルトのエクスポートポリシーで指定されたアクションが実行されます。(!policy-A)—10.10.1.0/24 は
policy-A
に対して評価されます。10.10.1.0/24 はpolicy-A
で指定されたルート リストと一致するため、指定されたアクションreject
が返されます。reject
は値 FALSE に変換され、FALSE は指定された論理 NOT に対して評価されます。FALSE の値は、論理 NOT の規則に基づいて TRUE の出力に逆転されます。TRUE の出力はaccept
に変換され、ルート 10.10.1.0/24 が受け入れられます。