了解策略表达式
策略表达式为策略框架软件提供了一种评估路由策略的不同方法。策略表达式将布尔逻辑运算符与策略一起使用。逻辑运算符建立评估策略所依据的规则。
在策略表达式中评估路由策略期间,接受、拒绝或下一个策略的策略操作将转换为 TRUE 或 FALSE 值。然后根据指定的逻辑运算符计算此值,以生成 TRUE 或 FALSE 的输出。然后将输出转换回“接受”、“拒绝”或“下一个策略”的流控制操作。应用策略表达式的结果,就像应用于单个策略一样;接受或拒绝路由,评估结束,或者评估下一个策略。
表 1 汇总了策略操作及其相应的 TRUE 和 FALSE 值以及流控制操作值。 表 2 介绍了逻辑运算符。有关策略表达式计算的完整信息,请参见 策略表达式评估。
必须将策略表达式括在括号中。您可以将策略表达式放置在 or export
语句和语句中的任何import
from policy
位置。
策略操作 |
转化价值 |
流控制操作转化值 |
---|---|---|
接受 |
真 |
接受 |
拒绝 |
假 |
拒绝 |
下一政策 |
真 |
下一政策 |
逻辑运算符 |
策略表达式逻辑 |
逻辑运算符如何影响策略表达式评估 |
---|---|---|
&&(逻辑与) |
逻辑 AND 要求所有值都必须为 TRUE 才能生成 TRUE 输出。 路由策略值 TRUE 和 TRUE 生成 TRUE 输出。TRUE 和 FALSE 的值生成 FALSE 的输出。FALSE 和 FALSE 的值产生 FALSE 的输出。 |
如果第一个路由策略返回值 TRUE,则评估下一个策略。如果第一个策略返回 FALSE 的值,则表达式的计算结束,并且不会计算表达式中的后续策略。 |
||(逻辑或) |
逻辑 OR 要求至少一个值必须为 TRUE 才能生成 TRUE 输出。 路由策略值为 TRUE 和 FALSE 将生成 TRUE 的输出。TRUE 和 TRUE 的值生成 TRUE 的输出。FALSE 和 FALSE 的值产生 FALSE 的输出。 |
如果第一个路由策略返回值 TRUE,则表达式的计算结束,并且不会计算表达式中的后续策略。如果第一个策略返回 FALSE 值,则评估下一个策略。 |
! (逻辑上不是) |
逻辑 NOT 将 TRUE 的值反转为 FALSE,将 FALSE 的值反转为 TRUE。它还会反转“接受”和“下一个拒绝”策略和“拒绝接受”的操作。 |
如果与逻辑 AND 运算符一起使用,并且第一个路由策略值 FALSE 反转为 TRUE,则评估下一个策略。如果 TRUE 的值反转为 FALSE,则表达式的计算结束,并且不会计算表达式中的后续策略。 如果与逻辑 OR 运算符一起使用,并且第一个路由策略值 FALSE 反转为 TRUE,则表达式的计算结束,并且不会计算表达式中的后续策略。如果 TRUE 的值反转为 FALSE,则评估下一个策略。 如果与策略一起使用,并且流控制操作为“接受”或“下一个策略”,则这些操作将反转为“拒绝”。如果流控制操作被拒绝,此操作将反转为接受。 |
有关详细信息,请参阅以下部分:
策略表达式示例
以下示例说明如何使用逻辑运算符创建策略表达式:
逻辑 AND — 在以下示例中,
policy1
首先评估。如果评估 afterpolicy1
,则返回policy2
值 TRUE,则计算。如果返回值 FALSE,policy2
则不计算。export (policy1 && policy2)
逻辑 OR - 在以下示例中,
policy1
首先评估。如果评估了 afterpolicy1
,则返回值 TRUE,policy2
则不计算。如果返回值 FALSE,policy2
则计算值。export (policy1 || policy2)
逻辑 OR 和逻辑 AND — 在以下示例中,
policy1
首先计算。如果计算了 afterpolicy1
,则返回值 TRUE,policy2
跳过并policy3
对其进行计算。如果评估 afterpolicy1
,则返回policy2
值 FALSE,则计算。如果返回值 TRUE,policy3
则policy2
计算。如果返回值 FALSE,policy3
则policy2
不计算。export [(policy1 || policy2) && policy3]
逻辑 NOT - 在以下示例中,
policy1
首先评估。如果 afterpolicy1
被计算,则返回值 TRUE,该值将反转为 FALSE,并且policy2
不计算。如果返回值 FALSE,则该值将反转为 TRUE 并policy2
计算。export (!policy1 && policy2)
顺序列表 [policy1 policy2 policy3]
与策略表达式 (policy1 && policy2 && policy3)
不同。
根据与路由策略匹配的路由评估顺序列表。例如,如果 policy1
匹配且操作为 accept
或 reject
, policy2
并且 policy3
不计算。如果不匹配,policy2
则policy1
进行评估,依此类推,直到匹配发生且操作为 accept
或 reject
。
将根据路由策略中的操作(转换为 TRUE 或 FALSE 值)以及指定逻辑运算符的逻辑来评估策略表达式。(有关策略表达式评估的完整信息,请参阅 策略表达式评估。)例如,if policy1
返回值 FALSE, policy2
并且 policy3
不计算。如果返回值 TRUE,policy2
则policy1
计算。如果返回值 FALSE,policy3
则policy2
不计算。如果返回值 TRUE,policy3
则policy2
计算。
您还可以组合策略表达式和顺序列表。在下面的示例中,如果 policy1
返回值 FALSE, policy2
则计算。如果返回值 TRUE 并包含一个next policy
操作,policy3
则policy2
计算。如果返回值 TRUE,但不包含操作(包括next policy
操作policy3
),则policy2
仍会进行评估(因为如果未指定操作,则下一个术语或下一个策略是默认操作)。如果返回值 TRUE 并包含操作accept
,policy3
则policy2
不计算。
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
指定并policy2
指定accept
next term
了 ,next term
则执行该操作。如果其中一个策略中指定的操作操作操纵了路由特征,则策略框架软件会在评估其余策略期间转发新的路由特征。例如,如果在策略表达式的第一个策略中指定的操作将路由的指标设置为 500,则此路由与下一个
metric 500
策略中定义的条件匹配。但是,如果在位于策略表达式中间或末尾的策略中指定了路由特征操作,则由于快捷方式计算,可能永远不会评估策略,并且永远不会发生路由特征的操作。
评估策略表达式
以下示例路由策略使用三个策略表达式:
[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,如下所示:
(policy-A && policy-B) - 根据
policy-A
评估 10.10.1.0/24。 10.10.1.0/24 与 中policy-A
指定的路由列表匹配,因此返回指定的操作reject
。reject
将转换为 FALSE 值,并根据指定的逻辑 AND 计算 FALSE。因为无论 的policy-B
评估结果是什么(在策略表达式逻辑中,任何结果和 FALSE 的值都会产生 FALSE 的输出),所以 FALSE 的结果是确定的,policy-B
因此不会计算并生成 FALSE 的输出。FALSE 输出将转换为reject
,而 10.10.1.0/24 将被拒绝。(policy-A || policy-B)— 根据
policy-A
评估 10.10.1.0/24。 10.10.1.0/24 与 中policy-A
指定的路由列表匹配,因此返回指定的操作reject
。reject
将转换为 FALSE 值,然后根据指定的逻辑 OR 计算 FALSE。由于逻辑 OR 要求至少一个 TRUE 值才能生成 TRUE 输出,因此将根据policy-B
计算 10.10.1.0/24。 10.10.1.0/24 不匹配policy-B
,因此返回默认操作 。next-policy
将 转换为next-policy
TRUE 值,然后根据指定的逻辑 OR 评估 FALSE(用于policy-A
评估)和 TRUE(用于policy-B
评估)的值。在策略表达式逻辑中,FALSE 或 TRUE 生成 TRUE 的输出。TRUE 的输出将转换为next-policy
。(TRUE 转换为next-policy
,因为next-policy
这是策略框架软件保留的最后一个操作)policy-B
是策略表达式中的最后一个路由策略,因此将执行 BGP 的默认导出策略指定的操作。(!policy-A)—根据
policy-A
评估 10.10.1.0/24。 10.10.1.0/24 与 中policy-A
指定的路由列表匹配,因此返回指定的操作reject
。reject
将转换为值 FALSE,并根据指定的逻辑 NOT 计算 FALSE。FALSE 的值根据逻辑 NOT 的规则反转为 TRUE 的输出。TRUE 的输出将转换为accept
,并接受路由 10.10.1.0/24。