了解路由策略匹配条件中的策略子例程
您可以使用从另一个路由策略调用的路由策略作为匹配条件。此过程使被调用的策略成为 子例程。
在某些方面,Junos OS 策略框架类似于编程语言。这种相似性包括将策略嵌套到策略子例程中的概念。软件程序中的子例程是您定期引用的代码段。策略子例程的工作方式相同 - 将现有策略引用为另一个策略中的匹配标准。路由设备首先评估子例程,然后评估主策略。子例程的计算将真或假布尔结果返回给主策略。由于您将子例程引用为匹配标准,因此 true 结果意味着主策略具有匹配项,并且可以执行任何配置的操作。但是,子例程的错误结果意味着主策略不匹配。
配置子例程
要在路由策略中配置要从另一个路由策略调用的子例程,请创建子例程并使用另一个路由策略的 or to
语句中的from
匹配条件指定policy
其名称。
不要在路由策略本身内评估路由策略。结果是没有前缀与路由策略匹配。
子例程中指定的操作用于为调用策略提供匹配条件。如果子例程指定了接受操作,则调用策略会将路由视为匹配项。如果子例程指定了拒绝操作,则调用策略会认为路由不匹配。如果子例程指定了用于操作路由特征的操作,则会进行更改。
子例程中终止操作的可能后果
具有特定语句的子例程的行为可能与包含相同语句的路由策略不同。对于子例程,您必须记住,子例程或默认策略指定的接受或拒绝的可能终止操作会极大地影响预期结果。
特别是,您必须考虑如果子例程中指定的路由未发生匹配,以及所执行的默认策略操作是否是您预期和想要的操作,会发生什么情况。
例如,假设您是向客户 A 提供服务的互联网服务提供商 (ISP) 的网络管理员。您已为客户 A 在不同链路上提供的不同类别的邻接方配置了多个路由策略。为了节省维护客户 A 的路由策略的时间,您配置了一个标识其路由的子例程和调用该子例程的各种路由策略,如下所示:
[edit] policy-options { policy-statement customer-a-subroutine { from { route-filter 10.1/16 exact; route-filter 10.5/16 exact; route-filter 192.168.10/24 exact; } then accept; } } policy-options { policy-statement send-customer-a-default { from { policy customer-a-subroutine; } then { set metric 500; accept; } } } policy-options { policy-statement send-customer-a-primary { from { policy customer-a-subroutine; } then { set metric 100; accept; } } } policy-options { policy-statement send-customer-a-secondary { from { policy customer-a-subroutine; } then { set metric 200; accept; } } } protocols { bgp { group customer-a { export send-customer-a-default; neighbor 10.1.1.1; neighbor 10.1.2.1; neighbor 10.1.3.1 { export send-customer-a-primary; } neighbor 10.1.4.1 { export send-customer-a-secondary; } } } }
此配置会出现以下结果:
当将所有 BGP 路由播发至邻居 10.1.1.1 和 10.1.2.1 时,组级
export
语句会将指标重置为 500,而不仅仅是与子例程路由过滤器匹配的路由。当将所有 BGP 路由分别播发至邻居 10.1.3.1 和 10.1.4.1 时,邻居级
export
语句会将指标重置为 100 和 200,而不仅仅是与子例程路由过滤器匹配的 BGP 路由。
出现这些意外结果的原因是子例程策略未为与路由过滤器不匹配的路由指定终止操作,因此,采用了接受所有 BGP 路由的默认 BGP 导出策略。
如果此特定子例程中包含的语句已包含在调用策略本身中,则只有所需路由的指标才会重置。
此示例说明了路由策略和子例程之间的差异,以及终止操作在子例程中的重要性。此处未仔细考虑子例程的默认 BGP 导出策略操作。此特定示例的解决方案是向子例程再添加一个术语,以拒绝与路由过滤器不匹配的所有其他路由:
[edit] policy-options { policy-statement customer-a-subroutine { term accept-exact { from { route-filter 10.1/16 exact; route-filter 10.5/16 exact; route-filter 192.168.10/24 exact; } then accept; } term reject-others { then reject; } } }
子例程的终止操作策略通常包括:
依靠默认策略操作来处理所有其他路由。
添加接受所有其他路由的术语。
添加拒绝所有其他路由的术语。
您选择的选项取决于您希望通过子例程实现的目标。仔细规划子例程。