match 的与或语义
route-map 的条件组合规则只有两条,但记反了就会写出与意图相反的策略:同一条目内的多条 match 语句是「与」关系,必须全部命中;同一条 match 语句里列出多个对象(多个前缀列表、多个社区列表)是「或」关系,命中任一即可。此外,同一条目内重复输入同一类 match,后输入的会覆盖前一条,需要或关系时应把对象写在同一行。
基本信息
| 与关系 | 同一 sequence 内的多条 match,全部满足才执行 set |
|---|---|
| 或关系 | 单条 match 里列多个对象,命中任一即算匹配 |
| 覆盖行为 | 同一 sequence 重复输入同类 match,新语句替换旧语句 |
| 未命中处理 | 继续向下扫描下一个 sequence,末尾有隐式 deny |
| deny 语义 | 命中且 permit/deny 为 deny 时丢弃该路由,不再看后续条目 |
典型使用场景
- 客户且带特定社区才提优先级:前缀范围与社区标签做「与」,避免误放别人
- 多个来源清单统一加标签:把多张前缀列表写在同一行做「或」,减少条目数
- 排查策略误伤:核对 match 的与或结构,确认是条件写宽还是写窄
- 策略评审:把每条 sequence 的与或结构画成伪代码,便于他人复核
- 从 route-map 迁移到 route-policy:语义从序列扫描改为条件语句,需逐条对照改写
与关系与或关系示例
与关系与或关系示例
# 与关系:既要在 PL-A/PL-B 范围内,又要带 CL-CUST 社区
route-map RM-BOTH permit 10
match ip address prefix-list PL-A PL-B
match community CL-CUST
set local-preference 160
# 或关系:命中 PL-A 或 PL-B 任一即可
route-map RM-OR permit 10
match ip address prefix-list PL-A PL-B
# 华为 VRP route-policy 中的等价表达
route-policy RP-BOTH permit node 10
if ip-prefix PL-A or ip-prefix PL-B then apply local-preference 160常见写法与结果
| 写法 | 实际语义 | 风险 |
|---|---|---|
| 一条 match 列多个对象 | 或 | 以为在做交集,实际条件被放宽 |
| 多条 match 语句 | 与 | 条件过严时整条策略不生效,业务悄悄走默认路径 |
| 同类 match 重复输入 | 后者覆盖前者 | 前半段条件被静默丢弃,排查时读配置易误判 |
| 条件拆到多个 sequence | 各自独立分支 | 得不到交集效果,等于或 |
核对策略时不要只读单条命令,要按 sequence 逐段读出「与/或」结构;把条件写成伪代码或表格,是团队评审中最省钱的一步。