前面几篇讲的都是"协议自己怎么算"。但真实网络里,光靠协议算出来的结果往往不是你要的——你可能想让某个网段走特定出口、把某类路由挡在门外、让特定用户的流量绕过路由表。这就是这篇的内容。
先把最容易混的一对分开:路由策略(Routing Policy)管"路由",策略路由(Policy-Based Routing)管"数据包"。前者影响路由表怎么生成,后者直接决定某个包从哪个口出去、跳过路由表。
路由策略 vs 策略路由
| 路由策略 Routing Policy | 策略路由 PBR | |
|---|---|---|
| 作用对象 | 路由条目(控制平面) | 数据报文(转发平面) |
| 影响什么 | 哪些路由能进路由表、属性被改成什么 | 这个包从哪个接口出去、下一跳是谁 |
| 生效时机 | 路由学习 / 发布时 | 报文转发时 |
| 常用工具 | filter-policy、route-policy、前缀列表、ACL | local PBR、接口 PBR(MQC)、SPR |
| 典型需求 | "别学这条路由"、"这条路由优先级调高" | "财务部的流量走专线,其他人走宽带" |
一句话:路由策略决定"地图上画哪条路",策略路由决定"这辆车走哪条路"。
匹配工具:先得能"选中"
所有策略都建立在"匹配"之上。华为提供五种匹配工具:
| 工具 | 匹配什么 | 特点 |
|---|---|---|
| ACL | IP 报文 / 路由的源目地址 | 能匹配地址段,但不能匹配掩码长度 |
| IP-Prefix List(前缀列表) | 路由的网络号 + 掩码长度 | 专门为路由设计,能精确匹配掩码 |
| AS-Path Filter | BGP 的 AS_PATH | 用正则表达式匹配 |
| Community Filter | BGP 的团体属性 | 按 AS:Value 匹配 |
| Route-Policy | 上述所有 + 更多字段 | 策略的"容器",可以 if-match 多个条件并 apply 改属性 |
前缀列表 vs ACL
这是必考的一个对比。假设你要匹配 10.1.0.0/16:
用 ACL 写:
acl 2000
rule permit source 10.1.0.0 0.0.0.0 ← 只匹配【主机 10.1.0.0】
rule permit source 10.1.0.0 0.0.255.255 ← 匹配 10.1.0.0/16 网段内所有地址
✗ ACL 不知道"掩码长度",它只能匹配地址范围
用前缀列表写:
ip ip-prefix P1 index 10 permit 10.1.0.0 16
✓ 明确要求:网络号是 10.1.0.0 且掩码长度正好 16
✓ 如果实际路由是 10.1.1.0/24,虽然地址落在范围内,但掩码 24 ≠ 16,不匹配
★ 结论:过滤【路由】用前缀列表;过滤【流量】用 ACL
前缀列表的 greater-equal / less-equal 可以匹配一个掩码区间:
ip ip-prefix P1 index 10 permit 10.1.0.0 16 # 只匹配 /16
ip ip-prefix P1 index 20 permit 10.1.0.0 16 less-equal 24 # 匹配 /16 ~ /24
ip ip-prefix P1 index 30 permit 10.1.0.0 16 greater-equal 17 less-equal 24
ip ip-prefix P1 index 40 permit 0.0.0.0 0 less-equal 32 # 匹配所有路由(相当于 any)
ip ip-prefix P1 index 50 deny 0.0.0.0 0 le 32 # deny any
★ 注意:前缀列表末尾【隐式拒绝】,没匹配上的都丢掉。
想放行全部,最后要显式写一条 permit 0.0.0.0 0 less-equal 32。
正则表达式:匹配 AS_PATH
AS_PATH 过滤器只能配合正则表达式用。常用的几个符号:
| 符号 | 含义 |
|---|---|
^ | 开头 |
$ | 结尾 |
_ | 匹配一个分隔符(逗号、空格、花括号、行首行尾),AS 过滤里最常用 |
. | 任意单个字符 |
* | 前面的字符重复 0 次或多次 |
+ | 前面的字符重复 1 次或多次 |
() | 分组 |
^$ AS_PATH 为空 → 本 AS 自己产生的路由
^100$ 从 AS 100 直接学来的(路径只有 100)
^100_ 路径以 AS 100 开头(可能后面还有)
_100$ 路径以 AS 100 结尾(AS 100 是发起者)
_100_ 路径中【经过】AS 100(任意位置)
^100_.*_200$ 从 100 开始、200 结束
^([0-9]+)( \1)*$ 全部由同一个 AS 号组成(防环用)
★ 别忘了 _ 是分隔符:_100_ 表示"AS_PATH 里出现过 100 这个 AS"
Route-Policy:策略的"容器"
Route-Policy 由一个或多个 node 组成,每个 node 有自己的编号、匹配模式和动作:
route-policy NAME permit node 10 ← node 10,permit
if-match ... ← 匹配条件(可以多条,默认【与】关系)
apply ... ← 满足后执行的动作
route-policy NAME deny node 20 ← node 20,deny
if-match ...
route-policy NAME permit node 30 ← 兜底
(没有 if-match = 匹配所有)
★ 匹配顺序:按 node 编号【从小到大】依次匹配
★ 匹配上第一个 node 就执行它的动作并【结束】,不再往下走
★ 所有 node 都没匹配上 → 默认 deny
| 动作 | 说明 |
|---|---|
permit | 放行。可以 apply 改属性 |
deny | 拒绝。该路由被过滤掉 |
if-match 多个条件 | 默认是逻辑与(全部满足)。想用"或"要写多个 node |
apply | 改属性:cost、tag、local-preference、as-path、community、ip-address next-hop… |
两个高频踩坑:① 忘了写兜底 node——末尾隐式 deny,所有没匹配上的路由都被丢;② node 编号写错顺序——比如兜底 node 10 写在前面,后面的 node 20 永远不会执行。
filter-policy:只能过滤,不能改
filter-policy 和 route-policy 常被混用,区别很清楚:
| filter-policy | route-policy | |
|---|---|---|
| 能力 | 只能过滤(放行 / 拒绝) | 过滤 + 修改属性 |
| 方向 | 有 import / export 两个方向 | 作为参数被引用,本身没有方向 |
| 生效范围 | 本协议进程内 | 配合 import-route / peer 等使用 |
# import 方向:过滤【学进来】的路由(不进路由表)
ospf 1
filter-policy ip-prefix P1 import
# export 方向:过滤【发出去】的路由(不发布给别人)
ospf 1
filter-policy ip-prefix P1 export
★ 注意 import/export 是【站在本协议的角度】:
OSPF 的 import = 从别的协议/别的进程学进来
OSPF 的 export = 从 OSPF 发布出去
不同协议的 import/export 语义略有差别,配之前先想清楚方向
路由引入:把别的协议的路由"翻译"进来
OSPF 只认 OSPF,BGP 只认 BGP。要让它们互相知道,就得引入(import-route)。引入时会产生一批默认值,这些默认值经常是坑:
| 引入方向 | 默认值 |
|---|---|
| OSPF 引入外部路由 | Type 5、Metric Type = E2、Cost = 1、Tag = 1 |
| IS-IS 引入外部路由 | Cost = 0(容易造成选路问题,一般要手工指定) |
| BGP 引入 IGP 路由 | ORIGIN = Incomplete(?)、MED = IGP 的 Cost |
| RIP 引入 | Cost = 0 |
引入的时候通常都要配策略,否则会把不该发的都发出去:
# 先定义策略
route-policy IMPORT_OSPF permit node 10
if-match ip-prefix P1
apply cost 100
apply tag 100
route-policy IMPORT_OSPF deny node 20 # 其他一律拒绝
# 再引入
ospf 1
import-route static route-policy IMPORT_OSPF
import-route direct route-policy IMPORT_OSPF
import-route bgp route-policy IMPORT_OSPF
# 只引入【指定路由】(更精细)
ospf 1
import-route static
# 配合 filter-policy 过滤
★ 双点双向引入的场景要特别小心【路由环路】和【次优路径】,
一般要靠 tag + 策略 来防环。
路由聚合:静态 / 自动 / 手动
BGP 里聚合有三种,优先级也各不相同(对应选路第 3 条):
| 类型 | 怎么做 | 优先级 |
|---|---|---|
| 手动聚合 | aggregate 命令,可加 detail-suppressed 只发聚合路由 | 最高 |
| 自动聚合 | summary automatic,按主类掩码聚合,只对 import-route 引入的路由生效 | 中 |
| 静态聚合 | 手工写一条静态路由指向 NULL0,再宣告出去 | 看宣告方式 |
自动聚合的"主类掩码"是个坑:10.1.1.0/24 会被聚合成 10.0.0.0/8——这通常不是你想要的,所以生产环境基本都用手动聚合。
策略路由:让数据包绕开路由表
本地策略路由(Local PBR)
只作用于本机自己产生的报文(比如设备发的 SNMP Trap、Syslog、ping)。用来指定"我自己的流量从哪个口出去"。
acl 3000
rule 5 permit ip source 1.1.1.1 0 destination 10.1.1.0 0.0.0.255
policy-based-route LOCAL_PBR permit node 10
if-match acl 3000
apply ip-address next-hop 192.168.1.2
ip local policy-based-route LOCAL_PBR
接口策略路由(MQC)
作用于接口上转发的报文。华为用 MQC(Modular QoS Command-Line)三件套来做:
① 流分类 traffic classifier —— 匹配什么流量
traffic classifier FINANCE operator or
if-match acl 3000
② 流行为 traffic behavior —— 对这些流量干什么
traffic behavior TO_ISP1
redirect ip-nexthop 192.168.1.2 # 重定向到下一跳
# 或者:remark dscp / car(限速)/ deny / permit
③ 流策略 traffic policy —— 把①②绑起来
traffic policy PBR_POLICY
classifier FINANCE behavior TO_ISP1
④ 应用到接口
interface GigabitEthernet0/0/1
traffic-policy PBR_POLICY inbound
MQC 是华为做 QoS 和 PBR 的统一框架,流分类可以很细:五元组、DSCP、VLAN、协议号、MAC……同一个流策略里可以挂多个 classifier,按 operator or/and 决定匹配逻辑。
| 流行为 | 效果 |
|---|---|
permit | 放行(正常查路由转发) |
deny | 丢弃——这就是"流量过滤" |
redirect ip-nexthop | 重定向到指定下一跳 |
redirect interface | 重定向到指定出接口 |
car | 流量监管(限速) |
remark dscp / 802.1p | 重标记优先级 |
智能策略路由(SPR)
SPR(Smart Policy Routing)是在策略路由的基础上加了链路质量探测:不是"永远走 A 链路",而是"实时探测 A/B 两条链路的质量(时延、丢包、抖动),哪条好走哪条"。常用于双出口(专线 + 宽带)场景。
流量过滤 vs 流量抑制
| 流量过滤 | 流量抑制 | |
|---|---|---|
| 干什么 | 按规则丢弃报文 | 对某类报文限速 / 限数量 |
| 工具 | ACL + traffic-filter / MQC deny | 广播风暴抑制、未知单播抑制、组播抑制 |
| 典型场景 | 禁止访客访问内网服务器 | 防止广播风暴打满 CPU |
验证与排错
display acl all # 所有 ACL 规则
display ip ip-prefix # 所有前缀列表
display route-policy # 所有 Route-Policy 及其 node
display filter-policy # 各协议的 filter-policy 配置
display ip as-path-filter # AS_PATH 过滤器
display traffic classifier user-defined
display traffic behavior user-defined
display traffic policy user-defined
display traffic-policy applied-record # ★ 看流策略挂在哪个接口
# 排错利器:看策略命中计数
display acl 3000 # 每条 rule 的匹配计数
reset acl counter 3000
排错思路:
- 路由该有的没有 → 从源头往回收敛:协议学到了吗(
display bgp routing-table peer x received-routes)→ 被 filter-policy 拦了吗 → 被 route-policy 的隐式 deny 丢了吗; - 流量没按预期走 → 先确认 PBR 生效了(
display traffic-policy applied-record),再看 ACL 计数有没有命中,最后检查apply的下一跳是否可达(PBR 的下一跳不可达时,默认会走路由表,不会报错); - 策略改了不生效 → 策略变更后需要重新触发路由更新,BGP 可以
refresh bgp all export或reset bgp。
一句话总结:路由策略管路由(控制平面),策略路由管数据包(转发平面)。匹配工具里,过滤路由用前缀列表、过滤流量用 ACL;Route-Policy 的 node 从小到大匹配、匹配即停、末尾隐式 deny;MQC 三件套(分类 → 行为 → 策略)是接口策略路由的标准姿势。
📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)
合并了原始笔记中「路由策略 / 策略路由 / 本地策略路由 / 接口策略路由(MQC) / 前缀列表 / 过滤策略 / 过滤规则+正则表达式 / 流量过滤 / 路由引入 / 路由汇总 / ACL / MQC」十余页。
原笔记里的正则表达式与 ACL 对比来自胶片截图,本文重新整理成了可直接对照的语法表。
配置命令保留华为 VRP 原样。