了解策略表达式
策略表达式为策略框架软件提供了一种评估路由策略的不同方法。策略表达式将布尔逻辑运算符与策略一起使用。逻辑运算符建立评估策略所依据的规则。
在策略表达式中评估路由策略期间,接受、拒绝或下一个策略的策略操作将转换为 TRUE 或 FALSE 值。然后根据指定的逻辑运算符计算此值,以生成 TRUE 或 FALSE 的输出。然后将输出转换回“接受”、“拒绝”或“下一个策略”的流控制操作。应用策略表达式的结果,就像应用于单个策略一样;接受或拒绝路由,评估结束,或者评估下一个策略。
表 1 汇总了策略操作及其相应的 TRUE 和 FALSE 值以及流控制操作值。 表 2 介绍了逻辑运算符。有关策略表达式计算的完整信息,请参见 策略表达式评估。
必须将策略表达式括在括号中。您可以将策略表达式放置在 or export 语句和语句中的任何importfrom 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指定acceptnext 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-policyTRUE 值,然后根据指定的逻辑 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。