ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

HCIP路由控制基础:OSPF引入静态路由与filter-policy过滤实战

HCIP路由控制基础:OSPF引入静态路由与filter-policy过滤实战 做网络的人多多少少都遇到过这种场面一套OSPF运行得好好的突然有人在核心路由器上敲了一条 import-route static全网路由表瞬间多出几百条明细路由有些路由器开始折腾CPU有些甚至把下一跳指向了一个根本不存在的地址。你打开命令行一看满屏的路由条目根本分不清哪些是真正需要的。这时候你才意识到所谓“路由控制”不是让你背会几条命令而是让你在路由满天飞之前就想清楚哪些路由该进来、哪些该出去、哪些应该被改头换面。这篇文章就是HCIP路由控制系列的第一篇主题是“基础知识一”主要面向正在备考HCIP数通方向的人以及那些刚进企业网、第一次被派去调路由器结果被路由策略搞到崩溃的兄弟们。咱们不聊虚的先把手里的工具理清楚把原理搞清楚再讲一个典型的OSPF引入静态路由的实操场景最后把这些年我踩过的坑整理成一份排查清单。搞完这一篇你至少能理解路由控制到底在控什么filter-policy和前缀列表是怎么配合的以及为什么你在OSPF里做过滤和在BGP里做过滤结果完全不一样。1. 路由控制到底在控什么1.1 一条路由是怎么进路由表的先说个容易被忽略的底层逻辑。一台华为路由器上其实存在两类路由表一类是协议自己的表一类是全局路由表。OSPF进程内部有LSDBBGP有BGP路由表静态路由是配置上去的这些“候选路由”会经过比较后把最优的放进全局路由表就是你敲display ip routing-table看到的那张表。这个机制有点像公司招聘简历投了一堆协议学到的路由HR筛一轮把不符合条件的扔掉过滤策略用人部门按优先级排序挑一个最合适的路由优先级比较最后发offer的那个才是真正入职的员工加入全局路由表。所谓路由控制本质上就是在这个“筛简历”的过程中做手脚让某些路由永远进不来或者让某种属性发生变化从而改变选路结果。所以你在做路由控制的时候脑子里得一直有两个视角一是协议层面比如OSPF的LSA还是不是全网一致二是路由表层面到底哪条路由最终被装上去了。很多新手一看到display ip routing-table里没那条路由就以为过滤成功了其实可能路由策略根本没生效只是那条路由被别的原因压制了。1.2 现实网络中最常见的三类“路由事故”这些年在外头做项目路由失控导致的事故无非就这三类你掌握了这三类问题的解法路由控制就算入门了。第一类是路由量失控。公司分支多、网段碎把一堆静态路由或直连网段引入OSPF之后全网设备都开始背一堆没用的明细路由。轻则路由表变大、收敛变慢重则低端设备CPU直接报警。这时候你要做的不是去一台台删静态路由而是用汇总加过滤的手段只让必要的信息扩散出去。第二类是次优路由和环路。双出口、双核心的拓扑里如果路由引入不谨慎很容易出现“我从你那里学到的路由你又是从我这里学过去的”这种互相抬轿子的情况结果数据包在路上转圈圈。这类问题靠简单过滤已经不够了需要结合路由优先级、Tag标记甚至策略路由来精细化处理。当然这是后话但基础篇里你至少得明白一个道理路由能不能被学到和它学到之后会不会被再次发布是两回事。第三类是想让某些人看不见某些路由。比如财务网段、办公网段、设备管理网段你不希望它们出现在某个区域的OSPF里或者不希望某个邻居的BGP学到全部前缀就得在路由发布或者接收的路径上加一道闸门。1.3 控制路由的四个下手点简单说路由控制可以在四个环节下手路由发布时路由产生前、路由接收时路由进来前、路由引入时协议间互相倒腾路由、路由属性修改度量值、优先级等。HCIP基础阶段你要掌握的核心是第二和第三类也就是接收过滤和引入控制。很多教程一上来就甩命令导致你只知道“filter-policy import”能过滤路由却不知道它到底在哪里生效。我习惯用一个比喻路由就像一张从邻居那里寄来的明信片。filter-policy是门口的信箱管理员负责决定这张明信片要不要送到你手里装进全局路由表而route-policy是个加工厂明信片送进来之前它还能帮你改改地址、贴张标签。两者虽然经常组合使用但定位完全不同。这一篇咱们先重点吃透“信箱管理员”也就是过滤这块加工厂留给下一篇。2. 先把工具认全ACL、前缀列表和filter-policy2.1 ACL不是只用来做包过滤的很多人在防火墙和接口ACL那里就认识ACL了以为它就是用来放行或拒绝数据包的。到了路由控制这块ACL的玩法其实是被当成“匹配工具”来用的——它不是拦数据而是挑路由。比如在filter-policy里写一条ACLACL匹配到的路由才允许通过没有匹配到的就拒绝这就是一种用法。ACL匹配路由时用的是源地址范围的概念写法是permit/deny 通配符比如acl number 2000 rule 5 permit source 10.1.0.0 0.0.255.255注意这里是反掩码0.0.255.255表示前16位必须匹配后16位任意。新手最容易翻车的地方有两个一是把反掩码写成正掩码比如写成了0.0.255.255却以为是在匹配255.255.0.0网段二是以为ACL里写了permit就万事大吉忘了ACL末尾还有一个隐含的deny any。在路由过滤场景里这就意味着你只匹配了一小段网段其他全部被拒之门外。ACL做简单的网段匹配是够用的但它有个天然的不足它对掩码长度不敏感。比如你写了一条permit source 10.1.0.0 0.0.255.255那么10.1.1.0/24和10.1.2.0/16都会被匹配到。很多时候咱们希望精确到“某几个前缀长度”才行这时候ACL就力不从心了。2.2 前缀列表IP-Prefix才是路由过滤的利器前缀列表ip ip-prefix就是为路由过滤而生的工具它能同时匹配网段和掩码长度。HCIP考试也好实际工程也好用前缀列表做路由匹配的频率远高于ACL。基本格式ip ip-prefix p1 index 10 permit 10.1.0.0 16这条表示允许前缀10.1.0.0掩码长度精确为16位的路由。如果你写的是ip ip-prefix p1 index 10 permit 10.1.0.0 16 greater-equal 24 less-equal 28那意思是匹配前缀10.1.0.0掩码长度在24到28之间的路由。这里gegreater-equal和leless-equal是前缀列表的灵魂参数。我见过不下十个人在这里栽跟头。规则很简单但也容易被绕晕如果只写了ge没写le表示掩码长度从ge一直到32如果只写了le没写ge表示掩码长度从前面那个位数到lege必须大于等于前缀位数le必须大于等于ge。比如写permit 10.1.0.0 16 less-equal 24那匹配的就是10.1.0.0/16到10.1.0.0/24之间所有的路由10.1.1.0/25就匹配不上了。纯脑补容易乱你可以在ensp里建一个简单的三台路由器环境在中间那台上敲几条带不同掩码的静态路由再用前缀列表做过滤然后一条条看display ip ip-prefix和路由表的变化很快就明白了。比起死记硬背这玩意儿动手试一遍比看十遍书都管用。2.3 filter-policy的几种“脾气”可不一样filter-policy这个名字看上去简单但它在不同协议里的行为差别很大这是踩坑重灾区。很多HCIP考生在考试时背了命令却没搞懂它为什么在OSPF里过滤了路由但邻居关系还不受影响在BGP里配置方向又完全不同。filter-policy在OSPF里的作用范围是“本机路由表”。比如你在路由器A上配置了OSPF的import方向的filter-policy它的作用是在LSA计算成路由、准备放进全局路由表之前把不匹配的路由挡住。这不会影响LSDB更不会影响邻居关系——OSPF邻居还是Full该有的LSA还在只是那部分路由不被装进路由表而已。这一点在排障时特别重要你不能因为路由表里看不到了就以为全网都看不到被别人一问“为什么我还学到那条路由”就懵了。在BGP里filter-policy的方向语义要比OSPF更明确分为in和out两个方向。in方向过滤的是从BGP对等体收到的路由在更新报文落地之前就处理掉了感觉更像是“进门就拦”out方向则是发路由给对等体之前先筛一遍感觉像“出门前搜身”。在IS-IS里也有类似的import/export概念但细节配套不同这里不展开。三个协议一对比你就发现了同样是filter-policyOSPF过滤的只是路由表条目BGP却能影响对端收到的路由这就是为什么路由控制一定要针对协议特性来设计而不是一套配置照搬所有的网络。协议filter-policy方向真正影响什么一个需要记住的特性OSPFimport有些场景也支持export本机全局路由表LSDB和邻居关系不受影响BGPin / out从对等体接收或向对等体发送的Update影响真正的BGP路由传递IS-ISimport / export路由表或LSP发布范围在特定场景下需配合路由渗透使用3. 动手实操用eNSP跑一个路由过滤实验3.1 实验场景与拓扑设计光讲原理没意思咱们直接上eNSP搭一个贴近企业网的小环境。我用的设备是AR2220模拟器版本随便华为官方的eNSP就行。拓扑很简单AR1模拟总部核心路由器跑OSPF Area 0AR2模拟汇聚路由器同时连接AR1和AR3AR3模拟分支机构出口AR3下面挂了一个网络用静态路由模拟然后AR3通过静态方式访问一个外部网络我故意不把网络画得太复杂就是为了让注意力集中在路由控制上。具体规划如下AR1-G0/0/0 --- 10.0.12.0/24 --- AR2-G0/0/0 AR2-G0/0/1 --- 10.0.23.0/24 --- AR3-G0/0/1 AR3-G0/0/0 --- 192.168.1.0/24模拟外部机构网络需求是AR2上把两条静态路由分别指向192.168.1.0/24和192.168.2.0/24重发布进OSPF。正常情况下AR1会学到这两条路由但总部这边的策略是192.168.1.0/24允许全网访问192.168.2.0/24是敏感网络不希望它出现在总部的路由表里。咱们的目标在AR1上配置filter-policy只接收192.168.1.0/24把192.168.2.0/24挡在路由表之外。3.2 基础配置IP、OSPF、静态路由和引入先把基础配置敲出来。AR1上配置OSPF区域0宣告连接AR2的接口网段# AR1 sysname AR1 interface GigabitEthernet0/0/0 ip address 10.0.12.1 255.255.255.0 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.0.12.0 0.0.0.255AR2同样起OSPF同时宣告和AR3连接的网段# AR2 sysname AR2 interface GigabitEthernet0/0/0 ip address 10.0.12.2 255.255.255.0 interface GigabitEthernet0/0/1 ip address 10.0.23.2 255.255.255.0 ospf 1 router-id 2.2.2.2 area 0.0.0.0 network 10.0.12.0 0.0.0.255 network 10.0.23.0 0.0.0.255AR3上配置两条静态路由分别模拟两个外部网段然后在OSPF里宣告和AR2相连的接口# AR3 sysname AR3 interface GigabitEthernet0/0/0 ip address 192.168.1.1 255.255.255.0 interface GigabitEthernet0/0/1 ip address 10.0.23.3 255.255.255.0 ospf 1 router-id 3.3.3.3 area 0.0.0.0 network 10.0.23.0 0.0.0.255 ip route-static 192.168.1.0 24 NULL0 ip route-static 192.168.2.0 24 NULL0这里静态路由我故意指到NULL0纯粹是为了在AR3上制造出两个“已知网段”方便AR2做路由引入。实际工程里肯定是实实在在的下一跳但实验里指NULL0最简单还能顺便体会一下“路由黑洞”是怎么回事。在AR2上把AR3的静态路由引入OSPF# AR2 ospf 1 import-route static配置完成后AR1上应该能看到两条外部路由display ip routing-table你会看到类似这样的信息192.168.1.0/24 O_ASE 10.0.12.2 192.168.2.0/24 O_ASE 10.0.12.2这时候全网所有人都能访问192.168.2.0/24这不是咱们要的。现在开始给AR1上锁。3.3 用前缀列表加filter-policy实现定向接收在AR1上创建一个前缀列表只放行192.168.1.0/24# AR1 ip ip-prefix allow_traffic index 10 permit 192.168.1.0 24然后在OSPF进程下调用filter-policy方向是import# AR1 ospf 1 filter-policy ip-prefix allow_traffic import配置完成后再在AR1上查看路由表display ip routing-table这时你应该看到192.168.2.0/24已经不见了而192.168.1.0/24仍然存在。如果你想确认OSPF的LSDB是否受到影响可以敲display ospf lsdb你会发现关于192.168.2.0/24的Type-5 LSA其实还在数据库里。这就印证了前文说的filter-policy在OSPF里过滤的是路由表不是LSA。别以为敲完了配置就万事大吉一定要自己亲手验证一遍否则你在真实项目里会被“为什么邻居还能算出来”这种问题整懵。3.4 从实验里你能观察到的三个细节第一个细节是AR1和AR2、AR3的OSPF邻居关系全程没有Down过。filter-policy不干预Hello报文不干预LSA洪泛只在路由计算阶段把关。你可以在AR1上敲display ospf peer看到邻居状态依然是Full。第二个细节是虽然AR1路由表里没有192.168.2.0/24了但你如果去AR2或者AR3上查它们依然能学到并保留这条路由。这个“局部过滤”的效果非常符合很多企业的实际需要——只在关键边界设备上做限制不影响整个网络的协议运行。第三个细节是如果你把filter-policy换成在AR2上做export方向过滤效果其实不完全一样。OSPF里的export过滤一般作用于路由转换和发布阶段具体实现要看版本和平台所以在华为设备上做OSPF过滤时我个人的习惯是优先用import方向因为你真正能掌控的就是“本机进不进路由表”这一件事。4. 常见问题与排查技巧实录4.1 为什么我配了filter-policy路由还是被别人学到这个问题出现的频率极高。你要先分清楚别人是在哪一层学到这条路由的如果他在OSPF的LSDB里看到LSA存在但全局路由表里没有那条路由说明他自己的入方向过滤已经生效或他那边被别的策略压制了如果他的路由表里能看到说明过滤点不在他这里你得回到路由源头方向看一看是不是中间有设备往OSPF里重新发布了一次。排查时我通常按三步走第一步在出问题的设备上敲display ip routing-table确认路由到底在不在第二步敲display ospf lsdb确认LSDB里是否有对应LSA判断是协议层面的信息还是路由表层面的问题第三步顺着路由源头朝着问题设备的方向逐台检查filter-policy、route-policy和import-route配置。别上来就怀疑设备出bug十次里九次都是策略配置方向搞错了。4.2 前缀列表和ACL匹配不上的典型症状最常见的一个症状是明明配了deny 10.1.0.0/16结果10.1.1.0/24还是被过滤了或者恰恰相反想拦住某个网段却怎么也拦不住。这时候十有八九是通配符或者ge/le参数写歪了。我建议你在模拟器里多用display这条命令来验证前缀列表的实际效果display ip ip-prefix allow_traffic这条命令会把前缀列表的每条规则都列出来包括permit/deny、前缀、掩码以及ge/le参数。你一条条对照需求看往往一眼就能发现问题。另外别忘了ACL的隐式deny规则——很多人以为自己写了一条permit就结束了实际上没被permit匹配到的路由全部被隐性拒绝了。要放行其余的路由你还需要追加一条rule 10 permit source any4.3 搭建排查思路清单为了让你以后少走弯路我把这些年踩过、帮别人踩过的坑整理成一张速查表。你可以把它截图存着出问题的时候一项项核对。现象可能原因排查命令 / 操作路由表没有预期路由LSDB却有OSPF import方向的filter-policy生效了display ospf lsdb、display filter-policyBGP没收到对端的路由BGP in/out方向过滤器拦截了或对等体无Update组播display bgp peer、display bgp routing-table前缀列表只放行了一少部分路由ge/le参数设置不对或隐式deny生效display ip ip-prefix 查看每条规则路由过滤影响了邻居关系错误地在接口ACL里做了过滤或网络类型不匹配导致认证问题display ospf peer、检查接口ACL配置过滤已经配置了但路由还在路由表里优先级被更高优先级路由覆盖或过滤器没有调用到协议视图下display ip routing-table检查调用位置静态路由引入后全网都能看到引入路由时未做过滤或汇总泛滥成灾import-route时配合route-policy段4.4 一条良心建议先想清楚“谁需要看到什么”再动手配我见过太多人一拿到需求就急着敲命令结果配到一半发现方向搞反了又全部删掉重来。路由控制这种事真的急不得。我自己的习惯是先在纸上画一个简单的数据流向图标注清楚哪些路由从哪个协议来、要到哪个设备去、中间经过谁再决定过滤点放在哪里、用哪个工具。如果你只是想在单个设备上挡住不想装进路由表的条目filter-policy加前缀列表就足够了如果你要对不同方向、不同属性做差异化处理那就要上升到route-policy这一层了。HCIP考试里多选、案例题最爱考你“在什么场景用什么工具”说白了考的就是你脑子里有没有这张决策图。最后再提一句前面实验里那个场景的后续如果你希望AR1不仅是不接收敏感网段还希望全网路由表干净利落可以在AR2引入静态路由的时候就加个route-policy只放行一部分前缀进OSPF。这个相对细一点的加工操作我打算放到下一篇专门讲route-policy的时候再展开。做路由控制这行扎实的基本功比会敲几条炫技命令重要得多你先把“过滤”这个动作吃透了后面无论是处理BGP选路还是做双点双向引入都能少折腾几个通宵。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进