资讯详情

资讯详情

华为设备路由引入故障排查与最佳实践:次优路径、环路、度量值混乱全解析

1. 路由引入到底在干什么从一个真实故障场景说起路由引入英文叫Route Import或者Route Redistribution是网络工程里一个既基础又容易翻车的操作。简单说它的作用是把一种路由协议学到的路由信息注入到另一种路由协议里去。比如把直连路由引入到OSPF或者把OSPF引入到BGP让不同协议域的设备能互相知道对方的路。听起来很简单对吧但我可以很负责任地告诉你在实际项目里路由引入导致的问题能占到路由故障的三成以上。我自己就经历过一次典型的翻车某园区网核心层跑OSPF出口跑BGP运维同事为了让内网能访问外部资源在边界设备上做了一次双向引入。结果当天下午网络开始间歇性卡顿部分网段时通时不通排查了将近四个小时才定位到问题——引入过来的外部路由把内部OSPF的LSDB撑爆了SPF计算频繁触发CPU直接飙到80%以上。这个场景不是个例。路由引入之所以容易出问题核心原因在于它打破了协议域之间的天然隔离。每种路由协议有自己的度量值体系、收敛机制和防环逻辑一旦你把A协议的路由灌进B协议B协议并不理解A协议的度量值含义只能用一个默认值或者手动指定的种子度量值来标记这些外来路由。这就埋下了选路异常的种子。这篇文章我会围绕路由引入这个操作把常见的问题类型、背后的原理、排查思路和实操配置都讲清楚。不管你是刚接触网络工程的新手还是已经有一定经验但被引入问题折腾过的老手应该都能从中找到有用的东西。尤其是那些正在做多协议域互联、网络割接或者路由策略优化的朋友这些内容大概率能帮你少走弯路。2. 路由引入的常见问题分类与成因分析2.1 次优路径引入方向搞反了次优路径是路由引入里最常见的问题没有之一。它的表现是网络能通但流量走的路径明显绕远了。比如内网到出口明明有一条直连的百兆链路流量却绕到了另一台设备再出去。根本原因通常出在引入方向或者引入路由的优先级上。举个例子某台边界设备同时运行OSPF和静态路由如果你把静态路由引入OSPF时没有做过滤那么一条指向外部的默认路由可能会以外部路由的身份进入OSPF域。OSPF内部的其他设备收到这条外部路由后会根据ASBR自治系统边界路由器的位置来计算到达外部路由的开销。如果ASBR不在最优路径上流量就会先绕到ASBR再出去。更隐蔽的一种情况是双向引入。A协议引入BB又引入A路由在两个协议域之间来回反射度量值不断累加最终导致设备选了一条看起来开销更小但实际上绕远的路径。这种问题在双点双向引入的拓扑里尤其常见。2.2 路由环路引入没有做标记路由环路的产生往往和双向引入有关。当协议A的路由被引入协议B后如果协议B又把这些路由引回协议A而中间没有任何过滤或标记机制路由就会在两个域之间循环。虽然每种协议都有自己的防环机制比如OSPF的SPF算法、BGP的AS_PATH但跨协议引入时这些机制并不共享。我见过一个典型案例某企业网有两个协议域中间通过两台设备做双向引入。由于没有对引入的路由打tag一台设备从OSPF学到的外部路由又被引回OSPF形成了路由自环。表现是路由表里出现了一条指向自己的路由下一跳是自己数据包在设备内部打转CPU占用率飙升。2.3 度量值混乱种子度量值没设对不同协议的度量值体系完全不同。OSPF用开销Cost基于带宽计算RIP用跳数Hop Count最大15跳BGP用一堆路径属性什么AS_PATH、LOCAL_PREF、MED。当你把RIP路由引入OSPF时OSPF不理解3跳是什么意思只能给它一个默认的种子度量值。华为设备上OSPF引入外部路由的默认种子度量值是1类型是Type 2。这个默认值在很多场景下是不合理的。比如你把一条经过多跳的RIP路由引入OSPF种子度量值设为1OSPF域内的设备会认为这条外部路由非常近优先选择它而实际上这条路由可能经过了好几个跳数质量并不好。2.4 路由表膨胀没有做路由聚合和过滤路由引入如果不加控制很容易导致路由表急剧膨胀。特别是从BGP引入到IGP的场景BGP路由表动辄几万条甚至几十万条全部引入到OSPF或者IS-IS里直接后果就是LSDB爆炸、SPF计算频繁、内存和CPU资源被吃光。华为设备上有一个经典的故障现象OSPF邻居关系频繁震荡日志里大量SPF计算记录设备CPU持续高负载。排查下来往往就是因为引入了大量外部路由而且没有做聚合。每一条外部路由都会产生一个LSA几万条LSA泛洪到整个区域设备根本扛不住。2.5 引入路由不可达下一跳没有正确解析这个问题的表现是路由表里有路由但流量转发不通。原因通常是引入的路由下一跳在目标协议域内不可达。比如你把BGP路由引入OSPFBGP路由的下一跳是某个外部邻居地址但OSPF域内的设备并不知道怎么到达这个下一跳地址路由虽然被引入了但实际转发时找不到出口。华为设备上有个细节需要注意当引入BGP路由到IGP时如果BGP下一跳是外部邻居需要确保这个下一跳地址在IGP域内是可达的或者配置next-hop-local让BGP在宣告路由时把下一跳改为自己。3. 华为设备上的路由引入配置与关键参数3.1 OSPF引入外部路由的基础配置在华为设备上OSPF引入外部路由的命令是在OSPF进程视图下使用import-route。基本格式如下ospf 1 router-id 1.1.1.1 import-route direct type 1 cost 10 import-route static type 2 cost 20 import-route bgp cost 50 type 2这里有几个关键参数需要解释。type 1和type 2是OSPF外部路由的两种类型。Type 1的外部路由其开销等于外部开销加上到达ASBR的内部开销Type 2的外部路由其开销只计算外部开销不叠加内部开销。默认是Type 2。什么时候用Type 1什么时候用Type 2我的经验是如果外部路由的开销差异很大而且你希望OSPF域内的设备能根据到达ASBR的距离来选路就用Type 1。如果外部路由的开销是固定的或者你希望所有外部路由都通过同一个ASBR出去就用Type 2。cost参数就是种子度量值。这个值设多少合适没有标准答案但有一个原则引入的路由度量值应该比内部路由的度量值大避免外部路由抢了内部路由的转发路径。华为OSPF内部路由的开销通常是根据带宽自动计算的百兆链路开销是1千兆是1华为默认参考带宽是100Mbps千兆链路开销也是1。所以种子度量值至少设成10以上比较安全。3.2 使用Route-Policy做精细控制光配import-route是不够的实际项目里必须配合Route-Policy来做过滤和属性设置。华为的Route-Policy功能很强大可以匹配路由的ACL、IP前缀列表、tag、度量值等然后执行允许或拒绝的动作同时可以修改路由属性。一个典型的Route-Policy配置如下route-policy IMPORT_OSPF permit node 10 if-match ip-prefix ALLOW_LIST apply tag 100 apply cost 50 route-policy IMPORT_OSPF deny node 20 ip ip-prefix ALLOW_LIST index 10 permit 192.168.0.0 16这个配置的意思是只允许192.168.0.0/16网段的路由被引入给它们打上tag 100种子度量值设为50。其他路由一律拒绝。这里有个细节Route-Policy的节点编号很重要。华为设备从上到下依次匹配匹配到第一个满足条件的节点就执行动作不再往下匹配。所以permit节点要放在前面deny节点放在最后作为兜底。3.3 路由聚合的配置方法路由聚合是控制路由表膨胀的关键手段。华为设备上OSPF的聚合是在OSPF进程视图下用abr-summary区域边界聚合或asbr-summary自治系统边界聚合。ospf 1 asbr-summary 192.168.0.0 255.255.0.0这条命令会把引入的192.168.0.0/16网段内的所有外部路由聚合成一条192.168.0.0/16的路由。聚合之后LSDB里的LSA数量会大幅减少SPF计算的压力也会降低。需要注意的是聚合命令只对引入的外部路由生效对OSPF域内产生的路由无效。另外聚合后的路由如果要做更精细的控制可以配合not-advertise参数来抑制某些聚合路由的发布。3.4 双向引入的防环配置双向引入的防环核心思路是给从一个协议域引入到另一个协议域的路由打上tag然后在反向引入时拒绝带有这个tag的路由。具体配置如下# 在OSPF域引入BGP路由时打tag route-policy OSPF_TO_BGP permit node 10 apply tag 200 # 在BGP域引入OSPF路由时拒绝tag 200的路由 route-policy BGP_TO_OSPF deny node 10 if-match tag 200 route-policy BGP_TO_OSPF permit node 20这个逻辑很清晰OSPF引入BGP路由时打上tag 200当BGP要把OSPF路由引回来时先检查tag如果是200就拒绝防止路由回环。4. 路由引入问题的排查思路与实操案例4.1 排查工具与命令速查华为设备上排查路由引入问题常用的命令有这些命令作用使用场景display ospf lsdb查看OSPF链路状态数据库检查LSA数量和类型是否异常display ospf routing查看OSPF路由表确认外部路由的度量值和类型display ip routing-table查看全局路由表检查最终选路结果display bgp routing-table查看BGP路由表确认BGP路由的属性和下一跳display route-policy查看Route-Policy配置确认过滤策略是否正确reset ospf counters清除OSPF统计计数重新统计SPF计算次数排查的基本流程是先看路由表确认现象再看协议数据库确认路由来源最后检查引入策略和过滤条件。4.2 一个完整的排查案例回到开头提到的那个故障场景。某园区网核心层跑OSPF出口跑BGP边界设备做双向引入。故障现象是网络间歇性卡顿部分网段时通时不通。第一步登录边界设备执行display ospf lsdb发现LSDB里有超过8000条AS External LSA。正常情况这个数量应该在几百条以内。这说明引入的外部路由太多了。第二步执行display ospf routing发现大量外部路由的度量值都是默认的1类型是Type 2。这意味着OSPF域内的设备会优先选择这些外部路由而实际上这些路由的质量参差不齐。第三步检查Route-Policy配置发现引入BGP路由时没有做任何过滤所有BGP路由全部灌进了OSPF。BGP路由表里有将近两万条路由全部变成LSA泛洪到OSPF域内。第四步执行display cpu-usage确认OSPF进程的CPU占用率超过60%SPF计算次数在短时间内增长了上千次。定位到问题后解决方案分三步第一配置Route-Policy只允许必要的内部网段被引入拒绝其他路由第二配置asbr-summary做路由聚合把分散的外部路由聚合成几条大网段第三调整种子度量值从默认的1改成50避免外部路由抢内部路由的路径。配置完成后LSDB的LSA数量从8000多降到200多条CPU占用率回落到10%以下网络恢复稳定。4.3 常见问题速查表问题现象可能原因排查命令解决方向路由表有路由但流量不通下一跳不可达display ip routing-table检查下一跳是否在IGP域内可达网络时通时不通LSDB过大导致SPF频繁计算display ospf lsdb做路由聚合和过滤流量绕远路引入方向错误或度量值不合理display ospf routing调整种子度量值或引入方向路由环路双向引入未做标记display ip routing-table配置tag和Route-Policy防环OSPF邻居震荡外部路由过多导致资源耗尽display ospf peer限制引入路由数量5. 路由引入的避坑经验与最佳实践5.1 引入前先想清楚三个问题每次做路由引入之前我都会问自己三个问题第一这条路由真的需要被引入吗第二引入之后会影响哪些设备的选路第三如果出问题了回退方案是什么第一个问题最容易被忽略。很多运维人员习惯性地把所有路由都引入觉得多引入总比少引入好。实际上引入的路由越多风险越大。每多一条外部路由就多一个可能出问题的点。正确的做法是按需引入只引入业务确实需要的网段。第二个问题需要你对网络拓扑有清晰的认识。引入一条路由影响的不仅仅是边界设备整个协议域内的设备都会重新计算路由。如果引入的路由度量值设置不当可能会导致大面积选路变化。第三个问题关乎故障恢复速度。做引入配置之前先把当前配置备份一份确认回退命令。一旦出现异常能快速恢复到之前的状态。5.2 种子度量值的设置原则种子度量值设多少这个问题我被问过无数次。我的经验是参考目标协议域内同类路由的度量值范围取一个偏大的值。举个例子OSPF域内内部路由的开销通常在1到100之间取决于带宽和跳数那么引入外部路由时种子度量值至少设成50以上。这样做的目的是让OSPF域内的设备优先选择内部路由只有在内部路由不可达时才走外部路由。如果是Type 1的外部路由种子度量值会加上到达ASBR的内部开销。这种情况下种子度量值可以设小一点因为内部开销会自动叠加最终的开销值会自然反映路径的远近。5.3 路由聚合的粒度控制路由聚合的粒度需要根据实际需求来定。聚合得太粗可能会把不该发布的路由也发布出去聚合得太细又起不到减少路由表的作用。我的做法是先梳理业务网段的分布找出可以聚合的连续网段然后按照业务模块或者地理位置来聚合。比如某栋楼的网段是192.168.10.0/24到192.168.20.0/24可以聚合成192.168.16.0/20。如果这栋楼里有一个特殊的业务网段不想被聚合发布可以用not-advertise参数单独抑制。另外聚合之后要验证一下display ospf lsdb确认LSA数量是否下降display ip routing-table确认聚合路由是否正确生成实际业务是否正常。5.4 双向引入的tag规划双向引入的tag规划需要在网络规划阶段就做好。我的建议是给每个协议域分配一个独立的tag号段比如OSPF用100到199BGP用200到299静态路由用300到399。这样在排查问题时看到tag号就能知道这条路由是从哪里来的。tag的配置要成对出现正向引入时打tag反向引入时拒绝带这个tag的路由。两个方向都要配置缺一不可。我见过只配了一个方向的案例结果路由还是回环了。5.5 变更窗口与回退方案路由引入的配置变更一定要在业务低峰期做。变更之前准备好回退脚本最好在测试环境先验证一遍。变更过程中持续监控CPU占用率、LSDB数量、路由表变化和业务连通性。一旦发现异常立即回退。我个人的习惯是变更前先执行display ospf lsdb和display ip routing-table记录基线数据变更后每隔5分钟检查一次持续观察30分钟。确认稳定后再结束变更窗口。6. 个人实操体会与后续扩展方向路由引入这个问题说到底是一个控制的问题。协议之间的边界天然存在引入操作就是在边界上开了一个口子。口子开多大、开在哪里、怎么开决定了这个操作是解决问题还是制造问题。我自己踩过的最大的坑是在一个双点双向引入的拓扑里没有做tag标记导致路由在两个协议域之间来回反射最后设备CPU跑满业务中断了将近一个小时。那次之后我养成了一个习惯只要涉及双向引入第一件事就是规划tag第二件事就是配置Route-Policy做过滤第三件事才是配置引入命令。后续如果要把这个方向做深我觉得有两个方向值得探索。一个是引入路由的自动化验证通过脚本定期检查LSDB数量、路由表变化和CPU占用率提前发现异常。另一个是引入策略的标准化模板把常见的引入场景比如OSPF引入BGP、BGP引入OSPF、静态引入OSPF等做成标准配置模板减少人为配置错误。最后分享一个小技巧华为设备上可以用display ospf lsdb statistics快速查看各类LSA的数量统计。如果AS External LSA的数量超过1000条基本可以判断引入的路由过多需要做聚合或过滤了。这个命令比一条条翻LSDB快得多排查时非常实用。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →