前面几篇讲的都是"协议自己怎么算"。但真实网络里,光靠协议算出来的结果往往不是你要的——你可能想让某个网段走特定出口、把某类路由挡在门外、让特定用户的流量绕过路由表。这就是这篇的内容。

先把最容易混的一对分开:路由策略(Routing Policy)管"路由",策略路由(Policy-Based Routing)管"数据包"。前者影响路由表怎么生成,后者直接决定某个包从哪个口出去、跳过路由表。

路由策略 vs 策略路由

路由策略 Routing Policy策略路由 PBR
作用对象路由条目(控制平面)数据报文(转发平面)
影响什么哪些路由能进路由表、属性被改成什么这个包从哪个接口出去、下一跳是谁
生效时机路由学习 / 发布时报文转发时
常用工具filter-policy、route-policy、前缀列表、ACLlocal PBR、接口 PBR(MQC)、SPR
典型需求"别学这条路由"、"这条路由优先级调高""财务部的流量走专线,其他人走宽带"

一句话:路由策略决定"地图上画哪条路",策略路由决定"这辆车走哪条路"。

匹配工具:先得能"选中"

所有策略都建立在"匹配"之上。华为提供五种匹配工具:

工具匹配什么特点
ACLIP 报文 / 路由的源目地址能匹配地址段,但不能匹配掩码长度
IP-Prefix List(前缀列表)路由的网络号 + 掩码长度专门为路由设计,能精确匹配掩码
AS-Path FilterBGP 的 AS_PATH用正则表达式匹配
Community FilterBGP 的团体属性按 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_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-policyroute-policy
能力只能过滤(放行 / 拒绝)过滤 + 修改属性
方向有 import / export 两个方向作为参数被引用,本身没有方向
生效范围本协议进程内配合 import-route / peer 等使用
huawei · filter-policy 两个方向
# 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

引入的时候通常都要配策略,否则会把不该发的都发出去:

huawei · 带策略的引入
# 先定义策略
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)。用来指定"我自己的流量从哪个口出去"。

huawei · local pbr
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)三件套来做:

MQC 三件套
① 流分类 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

验证与排错

huawei
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

排错思路:

一句话总结:路由策略管路由(控制平面),策略路由管数据包(转发平面)。匹配工具里,过滤路由用前缀列表、过滤流量用 ACL;Route-Policy 的 node 从小到大匹配、匹配即停、末尾隐式 deny;MQC 三件套(分类 → 行为 → 策略)是接口策略路由的标准姿势。

📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)

合并了原始笔记中「路由策略 / 策略路由 / 本地策略路由 / 接口策略路由(MQC) / 前缀列表 / 过滤策略 / 过滤规则+正则表达式 / 流量过滤 / 路由引入 / 路由汇总 / ACL / MQC」十余页。
原笔记里的正则表达式与 ACL 对比来自胶片截图,本文重新整理成了可直接对照的语法表。
配置命令保留华为 VRP 原样。