路由策略
从 Contrail 网络版本 1910 开始,虚拟网络路由策略会自动应用于辅助路由。请参阅 将路由策略应用于辅助路由。
Contrail 网络使用路由策略基础架构动态操作路由和路径属性,并支持在服务实例上附加导入路由策略。
路由策略包含列表术语。术语可以是最终规则,这意味着在与指定术语匹配时,不会评估其他术语,并且根据该术语中的操作丢弃或接受路由。
如果术语不是终端规则,则针对给定路由评估后续术语。
列表术语的结构如下例所示。
Policy { Term-1 Term-2 }
策略术语列表的匹配和操作的操作与 Junos 语言匹配和操作类似。可视化表示如下。

每个术语表示如下:
from { match-condition-1 match-condition-2 .. .. } then { action update-action-1 update-action-2 .. .. }
术语不应包含 any
匹配条件,例如,不应存在空 from
。
any
如果存在匹配条件,则所有路由都被视为与术语匹配。
但是,条件可以为空, then
也可以未指定操作。
应用路由策略
路由策略评估具有以下要点:
如果路由策略的术语包含多个匹配条件,则路由必须满足所有匹配条件才能应用术语中指定的操作。
如果策略中的术语未指定匹配条件,则会根据匹配项评估所有路由。
如果发生匹配,但策略未指定接受、拒绝或下一学期操作,则会发生以下情况之一:
评估下一个术语(如果存在)。
如果不存在其他术语,则评估下一个策略。
如果不存在其他策略,则接受路由。默认路由策略操作为“接受”。
如果与策略中的术语不匹配,并且存在同一策略中的后续术语,则会评估下一个术语。
如果未与策略中的任何术语发生匹配,并且存在后续策略,则会评估下一个策略。
如果在策略或所有策略结束时未发生匹配,则接受路由。
路由策略可以由多个术语组成。每个术语都包含要应用于匹配路由的匹配条件和操作。
每个路由都根据策略进行评估,如下所示:
根据第一个术语评估路由。如果匹配,则执行指定的操作。如果操作是接受或拒绝路由,则执行该操作并结束对路由的评估。如果指定了下一个术语操作,或者未指定任何操作,或者路由不匹配,则评估将如上所述继续到后续术语。
命中给定路由策略的最后一个非终端术语后,将根据下一个策略(如果存在)评估路由,方法与步骤 1 中所述的方式相同。
匹配条件:从
匹配条件包含应用术语中指定的操作时要满足的匹配条件 from
列表。该术语可能没有任何匹配条件。这表示所有路由都与此术语匹配,并根据术语中指定的操作应用操作。
下表描述了 Contrail 网络支持的匹配条件。
匹配条件 |
用户输入 |
描述 |
---|---|---|
前缀 |
要匹配的前缀列表 |
列表中的每个前缀都表示为前缀和匹配类型,其中前缀匹配类型可以是:
示例:1.1.0.0/16 如果路由的前缀与列表中的任何前缀匹配,则该路由符合此条件。 |
社区 |
要匹配的社区字符串 |
表示为带有 |
协议 |
要匹配的路径源或路径协议的数组 |
BGP |XMPP |静态路由 |服务链 |骨料。如果路径协议是列表中的协议之一,则路径被视为与此条件匹配。 |
路由策略操作和更新操作
策略操作包含操作和更新操作两部分。
下表描述了 action
Contrail 网络支持的。
行动 |
终端? |
描述 |
---|---|---|
拒绝 |
是的 |
拒绝与此术语匹配的路由。点击此术语后不再评估任何术语。 |
接受 |
是的 |
接受与此术语匹配的路由。点击此术语后不再评估任何术语。路由使用策略操作中指定的更新进行更新。 |
下学期 |
不 |
这是匹配策略期限时执行的默认操作。路由将根据策略操作中指定的更新进行更新。路由策略中存在的后续术语将在路由上进行处理。如果策略中没有更多术语,则处理下一个路由策略(如果存在)。 |
更新操作部分指定要在匹配路由上执行的路由修改。
下表描述了 update action
Contrail 网络支持的。
更新操作 |
用户输入 |
描述 |
---|---|---|
社区 |
社区列表 |
作为策略更新的一部分,可以对社区执行以下操作:
|
地中海 |
更新 BgpPath 的 MED |
表示 MED 的无符号整数 |
本地首选项 |
更新 BgpPath 的本地首选项 |
表示本地首选项的无符号整数 |
将路由策略应用于辅助路由
虚拟网络路由策略会自动应用于辅助路由。将路由策略应用于辅助路由的功能作为修改从 MP-BGP 导入的路由(包括从 MPLS 网络导入的路由)的机制特别有用。
附加到服务实例的路由策略仅应用于主路由。这些路由策略不适用于辅助路由。
路由策略配置
路由策略是在服务实例上配置的。可以将多个路由策略附加到单个服务实例接口。
在左侧接口上应用策略时,对于属于右侧 VN 的路由,将针对在左侧 VN 中重新发起的所有路由评估策略。同样,对于属于左侧 VN 的路由,附加到右侧接口的路由策略会影响右侧 VN 中的路由重新发起。
下图说明了路由策略配置。

路由策略链路数据中指定的策略序列号确定路由策略的评估顺序。服务实例上的路由策略链路数据还指定是需要将策略应用于左侧服务接口、右侧服务接口还是同时应用于两个接口。
可以按照不同的策略评估顺序将相同的路由策略附加到服务实例的左侧和右侧接口。因此,路由策略链路数据包含用于左右接口分别进行策略评估的序列号。
架构转换器将路由策略对象链接到为服务实例创建的内部路由实例。转换器还会复制路由策略链路数据以确保相同的策略顺序。
路由策略配置和故障排除
本节介绍如何为服务链创建路由策略以及如何验证该策略。
创建路由策略
首先,创建路由策略、 配置>网络>路由>创建>路由策略。请参阅以下示例。

使用 Contrail Web UI 和 REST API,可以配置 BGP 路由策略,然后将其分配给虚拟网络,但如果虚拟网络连接到 L3VPN,则不会应用路由策略。
配置服务实例
创建服务实例并将路由策略附加到左侧和右侧接口。策略的顺序由 UI 根据列表中指定的策略顺序计算。

为服务链配置网络策略
在 编辑策略中,为服务链创建策略,请参阅以下示例。

使用 VNC 脚本创建路由策略
以下示例显示了如何使用 VNC API 脚本创建路由策略。
from vnc_api.vnc_api import * vnc_lib = VncApi("admin", "<password>", "admin") project=vnc_lib.project_read(fq_name=["default-domain", "admin"]) routing_policy=RoutingPolicy(name="vnc_3", parent_obj=project) policy_term=PolicyTermType() policy_statement=PolicyStatementType() match_condition=TermMatchConditionType(protocol=["bgp"], community="22:33") prefix_match=PrefixMatchType(prefix="1.1.1.0/24", prefix_type="orlonger") match_condition.set_prefix([prefix_match]) term_action=TermActionListType(action="accept") action_update=ActionUpdateType(local_pref=101, med=10) add_community=ActionCommunityType() comm_list=CommunityListType(["11:22"]) add_community.set_add(comm_list) action_update.set_community(add_community) term_action.set_update(action_update) policy_term.set_term_action_list(term_action) policy_term.set_term_match_condition(match_condition) policy_statement.add_term(policy_term) routing_policy.set_routing_policy_entries(policy_statement) vnc_lib.routing_policy_create(routing_policy)
验证 API 服务器中的路由策略
您可以通过查看 API 服务器配置数据库来验证路由策略的服务实例引用和路由实例引用。请参阅以下示例。

验证控制节点中的路由策略
您可以在控制节点中验证路由策略。
将浏览器指向:
http://<control-node>:8083/Snh_ShowRoutingPolicyReq?search_string=failover
请参阅以下示例。

验证控制节点中的路由策略配置
您可以在控制节点中验证路由策略配置。
将浏览器指向:
http://<control-node>:8083/Snh_ShowBgpRoutingPolicyConfigReq?search_string=failover
请参阅以下示例。

验证路由实例上的路由策略配置
您可以验证内部路由实例上的路由策略配置。
将浏览器指向:
http://<control-node>:8083/Snh_ShowBgpInstanceConfigReq?search_string=<name-of-internal-vrf>
请参阅以下示例。

您还可以验证路由实例操作对象上的路由策略。
将浏览器指向:
http://<control-node>:8083/Snh_ShowRoutingInstanceReq?x=<name-of-internal-vrf>
请参阅以下示例。

路由重新出征控制
在属于服务虚拟机的接口上配置路由时,通常需要能够防止接口静态路由的重新生成。
例如,下图显示了具有多个服务实例的服务链,其中一个 in-net-nat
服务实例作为最后一个服务 VM,右侧 VN 也作为公共 VN。
最后一个服务实例使用 NAT 池执行 NAT。必须使用 NAT 池的接口静态路由配置服务虚拟机的正确接口,以便正确 VN 中的目标知道如何访问 NAT 池中的地址。但是,NAT 池前缀不应重新发起到左侧 VN 中。
为了防止路由重新发起,接口静态路由使用名为 的知名 no-reoriginate
BGP 社区进行标记。
当控制节点重新发起路由时,它会跳过使用 BGP 社区标记的路由。

重新发起控制配置和故障排除
服务实例的接口静态路由的静态路由上的社区属性在创建服务实例时指定。请参阅以下示例。

使用以下示例验证 API 服务器中的服务实例配置对象是否为静态路由设置了正确的社区。请参阅以下示例。
