面向对象:网络运维 / 数通入门学习者,eNSP + 华为 VRP 平台
实验目标:让某台路由器只不学某一条指定路由,其余路由照常学习
一、实验目标与场景引入
在实际网络中,我们会遇到这样的需求:
- 某条路由网段不想出现在本机路由表里(例如业务隔离、安全策略、临时割接屏蔽);
- 但其他路由必须正常学习,网络不能断。
这就是路由策略过滤(Filter-Policy)要解决的问题。本实验用最经典的组合:
plaintext
ip-prefix(IP 前缀列表) 定义"哪些要、哪些不要" + filter-policy import 在 OSPF 中拦截"进入路由表"的路由一句话总结需求:过滤掉 192.168.5.0/24 这条路由,让它不进路由表,其余路由全部放行。
二、实验拓扑与地址规划![]()
为聚焦本实验主题,采用最简两台路由器背靠背拓扑:
plaintext
[R1] GE0/0/0 -------- GE0/0/0 [R2] 10.0.12.1/24 10.0.12.2/24 R1 内侧:GE0/0/1 = 192.168.5.1/24 ← 待被过滤的网段(源头在 R1) R2 内侧:GE0/0/1 = 192.168.6.1/24 ← 正常网段(用来验证"其他路由不受影响")表格
| 设备 | 接口 | IP 地址 / 掩码 | 角色 |
|---|---|---|---|
| R1 | GE0/0/0 | 10.0.12.1/24 | 与 R2 互联 |
| R1 | GE0/0/1 | 192.168.5.1/24 | 目标网段源头(待过滤),下接 PC1 |
| R2 | GE0/0/0 | 10.0.12.2/24 | 与 R1 互联 |
| R2 | GE0/0/1 | 192.168.6.1/24 | 正常网段(对照验证),下接 PC2 |
说明:192.168.5.0/24 由 AR1 通过 OSPF 宣告,AR2 正常学习;本实验要在 AR2 上把它过滤掉。网段可以随意改,命令逻辑一样。
⚠️关键前提:eNSP 中路由器接口必须连接设备才会物理 UP。AR1、AR2 的 GE0/0/1 一定要接 PC(或其它设备),否则接口 down,目标网段根本进不了 OSPF,过滤无从谈起。这是本实验最容易踩的第一个坑,详见第七节 "1"。
三、核心原理先搞懂(建议先读这一段再配)
3.1 Filter-Policy 的 import /export 两个方向
在 OSPF 进程视图下,filter-policy有方向之分,含义完全不同:
表格
| 方向 | 作用点 | 效果 |
|---|---|---|
import | 本机收到路由后、写入本机 IP 路由表之前 | 被过滤的路由不进本机路由表 |
export | 本机向邻居发布 / 通告路由时 | 被过滤的路由不发给邻居,全网都看不到 |
本实验用的是import——只管自己这台的 "学"。
3.2 关键认知(OSPF 下 import 的特性)
filter-policy import只过滤 "进入 IP 路由表" 的路由;- 不阻断 LSA 的收发与泛洪,LSDB 依然同步、SPF 依然计算;
- 也就是说:被过滤的路由在 OSPF 协议内部 "还在",只是不落地到路由表;
- 若还有下游路由器,下游依然能学到这条路由(因为没有拦截 LSA)。
这一条是全网公认的易错点,实验里会用命令实测证明给你看。
3.3 为什么用 ip-prefix 而不用 ACL?
过滤路由推荐IP 前缀列表(ip-prefix),它比 ACL 更专业:
表格
| 对比项 | ACL | ip-prefix |
|---|---|---|
| 匹配内容 | 只能精确匹配 "网络号" | 同时匹配网络号 + 掩码长度 |
| 掩码范围匹配(如 /24~/28) | 不支持 | 支持(greater-equal /less-equal) |
| 用途 | 也可过滤数据报文 | 只能用于路由过滤,不能过滤数据包 |
四、实验步骤(带逐行解析)
全部命令在Shell 代码块中,
#后是解析注释,可直接照抄。
步骤 1:AR1 基础配置(IP 地址 + OSPF)
在 AR1 上执行:
shell
# 进入系统视图 sys # 给设备起名 AR1,方便区分 sysname AR1 # 配置互联接口 GE0/0/0,连到 AR2 interface GigabitEthernet0/0/0 ip address 10.0.12.1 255.255.255.0 quit # 配置内侧接口 GE0/0/1,模拟内网网段 192.168.5.0/24(就是待被过滤的目标网段) interface GigabitEthernet0/0/1 ip address 192.168.5.1 255.255.255.0 quit # 启用 OSPF 进程 1,并指定 Router-ID(习惯用 1.1.1.1) ospf 1 router-id 1.1.1.1 # 进入骨干区域 area 0.0.0.0 # 宣告互联网段 network 10.0.12.0 0.0.0.255 # 宣告目标网段 192.168.5.0/24,让 OSPF 把它传给对端 R2 network 192.168.5.0 0.0.0.255 quit quit # 返回用户视图 quit解析:
network 网段 反掩码中的0.0.0.255是反掩码(255.255.255.0 的反码),只匹配该网段前缀,是 OSPF 宣告的标准写法。
步骤 2:AR2 基础配置(IP 地址 + OSPF)
在 AR2 上执行:
shell
# 进入系统视图 sys # 起名 AR2 sysname AR2 # 配置互联接口,连到 AR1 interface GigabitEthernet0/0/0 ip address 10.0.12.2 255.255.255.0 quit # 配置内侧正常网段(用来对照:过滤后这条路由必须还在) interface GigabitEthernet0/0/1 ip address 192.168.6.1 255.255.255.0 quit # 启用 OSPF,Router-ID 用 2.2.2.2 ospf 1 router-id 2.2.2.2 area 0.0.0.0 # 宣告互联网段 network 10.0.12.0 0.0.0.255 # 宣告正常网段 network 192.168.6.0 0.0.0.255 quit quit quit步骤 3:确认过滤前的 "基线" 状态
在 AR2上查看 OSPF 学到的路由,确认 192.168.5.0/24已经能学到:
shell
# 只看 OSPF 学到的路由(此时应能看到 192.168.5.0/24) display ip routing-table protocol ospf预期输出里会看到类似(路由来源为 OSPF):
plaintext
Destination/Mask Proto Pre Cost Flags NextHop Interface 192.168.5.0/24 OSPF 10 2 D 10.0.12.1 GigabitEthernet0/0/0解析:
Proto = OSPF、Pre = 10说明这是 OSPF 内部路由(区域内)。AR2 此刻两条网段都学得到,这是过滤前的对照基线。
步骤 4:定义 IP 前缀列表 BLOCK-ROUTE(核心操作)
在 AR2上执行(注意这里是本实验的关键):
shell
# 进入系统视图 sys # ============ 第一条规则:index 10,拒绝目标网段 ============ # 语法:ip ip-prefix 列表名 index 序号 deny 网段 掩码 # 255.255.255.0 是点分掩码,等价于写 24,都表示"只精确匹配 /24 这个前缀" # 含义:凡是"192.168.5.0/24"这条路由,直接拒绝 ip ip-prefix BLOCK-ROUTE index 10 deny 192.168.5.0 255.255.255.0 # ============ 第二条规则:index 20,兜底放行其余所有路由 ============ # 0.0.0.0 0 表示"匹配任意网段"(网络号为 0 表示不限制前缀) # less-equal 31 表示"掩码长度 <= 31",即排除 /32 主机路由 # 含义:除了上面被拒绝的那条,其余非 /32 路由全部放行 # 【注意】原稿写的 less-than 32,在华为 VRP 中标准写法就是 less-equal 31, # 二者语义等价(都是"掩码长度小于 32") ip ip-prefix BLOCK-ROUTE index 20 permit 0.0.0.0 0 less-equal 31 quit重要原理(必看):前缀列表按 index 从小到大顺序匹配,命中即停止;并且列表末尾隐含一条 "拒绝所有"。所以:
- 第 10 条先挡掉 192.168.5.0/24;
- 第 20 条必须存在,否则其余路由会被隐含的 deny 全部误杀,导致 AR2 一条 OSPF 路由都学不到。
- 若你的场景需要放行 /32 路由(如 Loopback 通告),把
less-equal 31改成less-equal 32即可。
步骤 5:在 OSPF 进程中应用过滤策略
还是在 AR2上,进入 OSPF 进程,挂上这个前缀列表:
shell
# 进入 OSPF 进程 1 ospf 1 # import 方向:过滤"从 OSPF 学到、准备写入本机路由表"的路由 # 意思是:只有通过 BLOCK-ROUTE 列表的路由,才允许进 AR2 的 IP 路由表 filter-policy ip-prefix BLOCK-ROUTE import quit quit解析:这一行命令挂上后立即生效,不需要重启 OSPF,也不需要重置邻居关系。
步骤 6:验证过滤效果(重点验证三步)
验证一:看 IP 路由表,目标网段应消失
shell
# 在 AR2 上执行 display ip routing-table protocol ospf预期:192.168.5.0/24 不再出现,而 192.168.6.0/24(R2 本地直连)正常,互联网段正常。
验证二:看前缀列表的命中情况(加分项,务必会)
shell
# 查看前缀列表内容与匹配计数 display ip ip-prefix BLOCK-ROUTE预期输出:
plaintext
Prefix-list count: 2 ip ip-prefix BLOCK-ROUTE: Description: index 10: deny 192.168.5.0/24 (Matched: 1) index 20: permit 0.0.0.0/0 less-equal 31 (Matched: 1)解析:
Matched计数表示该规则被命中的次数。index 10 命中 1 次说明 192.168.5.0/24 确实被它拦截;index 20 命中说明其他路由被放行。排障时这个计数非常有用:如果 index 20 的 Matched 是 0,说明你的放行规则没生效。
验证三:对照 OSPF 协议路由表(揭露本质的关键一步)
shell
# 在 AR2 上执行 display ospf routing预期:192.168.5.0/24 在这里仍然存在!
这个对比是全实验最有价值的结论:
filter-policy import只过滤 "进入 IP 路由表" 的路由,并不影响 OSPF 协议自身的路由计算结果。所以:
display ip routing-table:看不到 ✅(需求达成)display ospf routing:还看得到(协议层没被 "动刀")- LSDB 里 LSA 也依然在(
display ospf lsdb可查)
验证四:ping 实测
shell
# 在 AR2 上 ping 目标网段的接口地址,预期不通(因为路由表里没这条路由) ping 192.168.5.1预期:Request time out/ 不可达。原因:AR2 路由表已无 192.168.5.0/24,数据包查表失败被丢弃。这正好证明过滤是真实生效的,而不是只在配置里写写而已。
五、结果对比一览
表格
| 检查项(在 AR2 上) | 过滤前 | 过滤后 |
|---|---|---|
display ip routing-table protocol ospf看 192.168.5.0/24 | ✅ 存在 | ❌消失 |
display ospf routing看 192.168.5.0/24 | ✅ 存在 | ✅ 仍存在 |
| LSDB 中 192.168.5.0/24 的 LSA | ✅ 存在 | ✅ 仍存在 |
| 192.168.6.0/24(对照网段) | ✅ 正常 | ✅ 正常(未被误伤) |
| R2 ping 192.168.5.1 | ✅ 通 | ❌ 不通 |
六、深入理解:为什么 "只挡路由、不挡 LSA"?
OSPF 是链路状态协议:所有路由器先同步 LSDB(LSA),再用 SPF 算法各自独立算出到每个网段的最优路由。
filter-policy import是插在 "SPF 算完 → 写入 IP 路由表" 这个环节上的一道闸门:
plaintext
LSDB 同步(LSA 照常收发、泛洪) ↓ SPF 算法计算(OSPF 路由表生成,照样算出 192.168.5.0/24) ↓ ★ filter-policy import 在这里过滤 ★ ← 只在这里起作用 ↓ 写入 IP 路由表(192.168.5.0/24 被挡,不进表)所以它天然不会去动 LSA—— 这正是链路状态协议的 "路由一致性" 要求决定的。这也解释了为什么下游路由器依然能学到该路由:LSA 没有被拦,SPF 照样算得出来。
记忆口诀:filter-policy import = 只管自己这台 "看不看得到",不管别人 "学不学得到"。想让全网都学不到,才需要 export 方向 / ABR 上的 LSA 过滤,那是后话。
七、避坑指南(新手最容易踩的坑)
内侧接口没接线,目标网段学不到
表象:在 R2 上
dis ip routing-table protocol ospf无输出,dis ospf routing里只有 10.0.12.0/24 一条,没有 192.168.5.0/24。OSPF 邻居却是 Full。排查:
dis ip int bri发现 AR1 和 AR2 的 GE0/0/1 都是down down。plaintext
GigabitEthernet0/0/0 10.0.12.1/24 up up GigabitEthernet0/0/1 192.168.5.1/24 down down ← 问题在这根因:eNSP 中路由器接口不连接任何设备时,物理层就是 down。接口 down → 没有直连路由 → OSPF 不宣告该网段 → 对端自然学不到。
解决:给两个 GE0/0/1 各接一台 PC(PC1/PC2),接口自动 up,OSPF 约几秒收敛后路由即出现。
反思:当时差点误判成 "配置没配上",其实配置全对,是物理连接的问题。排障时先看接口状态,再查配置。
- 忘写第 20 条放行规则→ 前缀列表末尾隐含 deny,结果 AR2 把所有 OSPF 路由全过滤了,网直接 "断光"。记住:deny 前面必须有兜底 permit。
- 方向搞反→ 配成
export会把路由挡在通告之前,影响的是邻居;本实验要挡 "自己学习",必须用import。 - 掩码写错→
192.168.5.0 255.255.255.0只匹配 /24。如果设备上通告的是 /25 或 /32,就匹配不上,过滤无效。排查时用display ip ip-prefix BLOCK-ROUTE看Matched计数。 - 以为过滤后 LSA 也没了→ 抓包或看 LSDB,LSA 照常在。不要拿 "邻居学不到" 来验收本实验,那是 export 或 LSA 过滤的效果。
less-than写法→ 华为 VRP 中 ip-prefix 的标准参数是greater-equal/less-equal,没有less-than关键字。原稿的 "小于 32" 应写成less-equal 31。
八、总结
- 过滤一条路由、不影响其他:
ip-prefix(精确匹配网段 + 掩码)+filter-policy import(拦截进路由表)是最标准组合; - 方向决定一切:
import挡 "自己学",export挡 "对外发"; - 链路状态协议的本质:filter-policy 只作用于路由表,不作用于 LSA,这是它与距离矢量协议最不同的地方;
- 验收:
display ip routing-table目标消失 +display ip-prefix命中计数 +display ospf routing仍在,三者对上号,实验即成功。
思考题:
如果改成三台路由器 AR1→AR2→AR3 串联,只在 AR2 上配filter-policy import,AR3 还能学到 192.168.5.0/24 吗?
如果想让 AR3 也学不到,应该怎么改?(提示:答案就在第六节的原理里)