ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

BGP与OSPF互引路由环路成因及华为防环配置

BGP与OSPF互引路由环路成因及华为防环配置 简介围绕华为路由器BGP与OSPF协议互引路由场景的三层路由防环专题资料面向具备动态路由基础、正在规划或维护跨协议网络的网络工程师。资料从典型组网入手以DeviceA发布10.10.10.10/32路由为例把环路形成拆解为四个连续阶段并指出MED值设置不当是诱发环路的常见原因。随后给出错误配置示例与防环建议覆盖route-policy路由策略、AS_PATH防环、Loopback接口等机制还说明了适用产品与版本。资源为1个PDF文档大小211KB结构紧凑章节按概述、典型组网、环路原理、错误配置示例、建议配置示例、适用产品与版本、总结建议依次推进便于按需查阅。已有2128人学习适合中高级网络工程师精读。掌握这些场景后管理员能在部署BGP/OSPF互引时提前识别路由回灌风险有效规避三层路由环路提升网络稳定性与排错效率。1. BGP与OSPF互引路由三层路由环路从哪里来半夜把R2的BGP引入OSPF一开OSPF域里External LSA就开始刷屏去往同一业务网段的流量在R1和R2之间画圈核心路由器CPU直接报警——这是华为路由器三层路由环境里最典型的防环盲区。BGP和OSPF双向互引原理上双方都觉得自己在帮对方通告路由结果两条协议交界处绕出了一个环。这篇专题就拆这个场景双向引入时环路怎么形成BGP的AS_PATH、IBGP水平分割、OSPF的LSA泛洪各自能防住哪一段以及用Route Tag、AS_PATH过滤器、Community三类手段怎么把环断掉。适合正在做IGP/BGP融合改造或者备考HCIP路由交换方向的工程师看完能直接在华为AR真机或eNSP上复现和验证。2. 互引场景的防环原理BGP的AS_PATH与OSPF的LSA各自防住了什么2.1 同AS内BGP水平分割解决不了的问题BGP自己的防环机制有三大件AS_PATH、IBGP水平分割、Originator_ID/Cluster_ID。AS_PATH防的是跨AS环路路由每经过一个AS就在路径最前面压一个AS号收到路由的路由器一旦在AS_PATH里看见自己的AS号直接丢弃。IBGP水平分割防的是反射器环从IBGP对等体学到的路由不再通告给其他IBGP对等体避免IBGP全互联之外出现转发环。Originator_ID和Cluster_ID则是在路由反射器场景下补位防止反射簇内环路。这三个机制在「BGP域内部」都是有效的可一旦路由被引入OSPF再绕回来全部失效。先说AS_PATHOSPF的LSA里根本没有AS_PATH字段路由从BGP进OSPF时BGP属性被剥离只剩前缀、cost、tag这些OSPF能表达的东西。当另一台ASBR把这条OSPF路由重新引入BGP时它创建了一条全新路由AS_PATH为空——因为对这台路由器来说路由是自己import进来的「起源自本地」。BGP收到空AS_PATH的路由不会因为「AS_PATH里没有我」而丢弃它认为这是一条本地起源路由合法。IBGP水平分割同样拦不住。水平分割约束的是「从IBGP学到的路由不再传给IBGP邻居」但互引场景里R2引入OSPF路由到BGP后会主动通告给它的IBGP对等体R1这个通告动作本身就是合法的R1也正常接收。整条链路绕了一圈BGP的三个防环机制没有一个能识别出「这条路由曾经在BGP域里存在过」。2.2 OSPF外部LSA的泛洪范围与Tag字段被忽视的防环锚点OSPF侧同样有自己的防环逻辑但针对的是区域间路由ABR不会把从非骨干区域学到的Type 3 LSA再发回骨干区域也不会发回来源区域这是OSPF区域间防环的基本盘。可外部路由不受这个约束——Type 5 LSAAS External LSA一旦生成会在整个OSPF自治系统内泛洪所有区域都能看到ABR不做方向性拦截。这意味着OSPF对「自产自销」的外部路由没有原生防环能力。OSPF实现里唯一能标记外部路由来源的字段是Tag32位默认0。华为VRP上ASBR通过import-route把BGP路由引入OSPF时可以给外部LSA打上Tag比如65001:100这种编码方式存在LSA 5的Tag字段里。其他路由器从OSPF学到这条外部路由后路由表里能看到tag属性再次引入其他协议时路由策略可以按tag做匹配。这就是OSPF侧能做防环闸门的核心依据。另一个相关字段是Forwarding AddressFA。当ASBR引入的BGP路由下一跳在OSPF域内可达且接口使能了OSPF时LSA 5会携带FA地址如果下一跳不可达或接口没使能OSPFFA置为0.0.0.0。FA非0时域内其他路由器计算到达该外部路由的开销是「本机到FA的Cost加外部Cost」这会直接影响次优路径的判断。很多互引场景下的路径异常根源在FA而不是环路本身后面避坑章节会展开。OSPF LSA的Option字段在这个场景里也有存在感E位表示区域是否允许外部路由P位表示Type 7 LSA是否允许被转换路由器转换为Type 5。NSSA区域里做BGP引入时P位决定由谁执行7转5转换路由器就是实际防环策略的落点很多人只盯着ASBR配过滤结果漏了ABR就是没理解Option字段的含义。2.3 双向引入下环路形成的完整路径一个能复现的拓扑把场景落到具体拓扑R1和R2同属AS 65001两者跑IBGP同时都运行OSPF进程1区域0。R1有一条EBGP路由10.1.0.0/16从AS 65002学来。R1把BGP路由引入OSPFR2把OSPF路由引入BGP双向互引成立。环路形成分四个阶段阶段动作关键状态1R1将10.1.0.0/16从BGP引入OSPFR1生成Type 5 LSA通告路由器为R1自己的Router ID2R2从OSPF学到10.1.0.0/16引入BGPR2在BGP里创建本地起源路由AS_PATH为空3R2通过IBGP把这条路由通告给R1R1的BGP表出现两条10.1.0.0/16路径EBGP原始路径和IBGP空AS_PATH路径4R1选路空AS_PATH路径胜出下一跳指向R2而R2的OSPF下一跳指向R1转发乒乓形成第4步是环路成形的关键。看华为VRP的BGP选路顺序Preferred-Value、Local-Pref、本地起源、AS_PATH长度、Origin类型、MED、EBGP优于IBGP、到下一跳的IGP Metric。R1收到R2通告的IBGP路由AS_PATH为空长度0原始EBGP路由的AS_PATH是65002长度1。选路到第4条「AS_PATH短者优」时空AS_PATH路径直接胜出EBGP原始路径被压制为备份。此时R1把去往10.1.0.0/16的流量封装给R2R2查OSPF表发现这条外部路由的Advertising Router是R1下一跳还是R1又把流量丢回R1。两台ASBR之间的链路成了乒乓球台这就是典型的互引路由环路。eNSP里搭这个三台设备的拓扑抓包能看到报文在R1-R2之间反复横跳接口计数暴涨非常直观。3. 在OSPF侧用Route Tag做单向闸门配置序列与判定逻辑3.1 在R1上把BGP路由引入OSPF打Tag的位置在route-policy在华为VRP上OSPF引入BGP的命令是import-route bgp但直接在进程下敲裸命令的话所有BGP路由都会被倒进OSPFTag保持默认0无法区分来源。常见做法是挂一个route-policy在策略里匹配特定前缀并打Tag。R1上的配置序列# 只放行从外部AS学到的业务前缀 ip ip-prefix FROM_EBGP permit 10.1.0.0 16 # 打TagOSPF LSA5里的Tag字段 route-policy TAG_FROM_BGP permit node 10 if-match ip-prefix FROM_EBGP apply tag 100 # 兜底放行保证其他BGP路由也能引进去只是不打Tag route-policy TAG_FROM_BGP permit node 100 # OSPF进程下引用 ospf 1 import-route bgp route-policy TAG_FROM_BGP这段配置的逻辑是先把进OSPF的BGP路由用前缀过滤圈一个范围只允许10.1.0.0/16这只业务段进来同时给它打上Tag 100。node 100的permit是必须的——route-policy默认末尾deny如果不加这个兜底节点OSPF引入BGP时所有没被node 10匹配的BGP路由会被全部拒绝业务直接中断。参数上有两个可调项。第一import-route bgp默认引入的外部路由类型是Type 2OSPF域内选路只看外部Cost不看内部Cost。如果R1和R2同时做BGP引入OSPF建议改成import-route bgp type 1 route-policy TAG_FROM_BGP让内部Cost参与计算避免流量全压在一台ASBR上。第二apply tag的取值范围是0到4294967295可以按AS号编码比如AS 65001就用65001100这类有辨识度的值别用100这种太短的值多ASBR环境下容易撞车。3.2 在R2上把OSPF引入BGP用Tag做单向闸门R2是环路的另一端。它把OSPF路由引入BGP时需要在route-policy里识别并拒绝Tag100的路由。Tag是OSPF路由表里的属性display ip routing-table verbose能看到BGP引入OSPF时route-policy按if-match tag匹配这个链路是通的。R2的关键配置# 拒绝带Tag 100的路由防止回灌BGP route-policy FILTER_TAG deny node 10 if-match tag 100 # 其余OSPF路由正常放行 route-policy FILTER_TAG permit node 100 # BGP引入OSPF挂过滤策略 bgp 65001 import-route ospf 1 route-policy FILTER_TAG这段配置的判定顺序是BGP引入OSPF路由时先过node 10命中Tag 100的直接deny一条路由只要被deny节点匹配后面的permit节点不会再执行没命中Tag 100的路由落到node 100被放行。这样就形成了一个单向闸门R1注入OSPF的外部路由在R2这里被拦下无法重新进入BGP域。这里有个容易被忽略的细节route-policy里deny节点要放在最前面。如果把deny放在permit后面permit节点会先把Tag 100的路由放行后面的deny节点永远不会执行到。华为VRP的route-policy是顺序匹配、首个命中生效这个顺序就是判定逻辑本身。3.3 Tag值规划与多ASBR场景下的边界Tag方案在单ASBR互引场景下很干净但多ASBR环境要提前规划。假设AS 65001里有三台ASBR每台都往OSPF里倒BGP路由如果每台打的Tag不一样过滤策略就必须把所有Tag都列上漏一个就是环。我一般会做一张Tag分配表65001:100表示AS 65001引入的外部BGP路由65001:200表示另一组业务65001:999表示OSPF自身的核心路由全组统一执行。还要清楚Tag的边界Tag只在OSPF域内有意义BGP路由没有Tag属性。R2上过滤了Tag 100只是不让这条路由从OSPF回BGP但R1从EBGP学到的原始路由、R2从其他IBGP邻居收到的路由都不受Tag影响。也就是说Tag是从OSPF侧断环的手段BGP侧如果还有别的倒灌入口需要在BGP侧再加一道闸门。这也是为什么很多工程上会同时配Tag过滤和AS_PATH过滤两道闸门管两段路。另外一个实际经验在eNSP上复现这个场景时记得先看display ospf lsdb ase确认LSA 5里Tag列确实变成了100再往下配R2的过滤策略。很多时候配置看起来没问题实际是LSA里Tag没打上排错方向直接跑偏。4. 在BGP侧用AS_PATH与Community做过滤防环与选路兼顾4.1 as-path-filter匹配空AS_PATH能防环但会误伤BGP侧做路由控制bgp route control最直接的抓手是AS_PATH过滤器。针对互引环路的典型场景——R2把OSPF引入BGP后产生空AS_PATH路由——可以在R1上配置as-path-filter把空AS_PATH的路由拒之门外# 匹配AS_PATH为空的路由也就是本地起源后通过IBGP传过来的 ip as-path-filter 10 permit ^$ # 在IBGP邻居的入口方向过滤 route-policy DENY_EMPTY_AS deny node 10 if-match as-path-filter 10 route-policy DENY_EMPTY_AS permit node 100 bgp 65001 peer 2.2.2.2 as-number 65001 peer 2.2.2.2 route-policy DENY_EMPTY_AS import这个方案能直接断掉2.3节描述的环路R1不再接受R2发来的空AS_PATH路由BGP表里只剩EBGP原始路径选路回到正轨。但注意正则表达式^$匹配的是完全空的AS_PATHR2通过import-route ospf引入的路由、以及通过network命令发布的路由AS_PATH都是空的。如果R2本来就承担了把内部核心网段通告进BGP的职责这些正常路由也会被一起过滤掉属于典型误伤。所以空AS_PATH过滤只适合「IBGP邻居只转发外部路由、不本地发布路由」的边界场景。更稳妥的做法是配合前缀控制先用ip-prefix圈出允许进BGP的OSPF核心段再叠加AS_PATH过滤双条件同时满足才放行。单独靠AS_PATH做互引防环在很多现网拓扑里会翻车。4.2 用Community标记互引路由advertise-community是关键Community是跨协议路由控制里更精细的手段。R2在把OSPF路由引入BGP时给这些路由打上Community属性R1收到后按Community匹配做处理。这样的好处是你不需要依赖AS_PATH的形态空不空AS_PATH无所谓只要路由是从OSPF倒灌进来的身上就带着标记。R2侧的配置# 给从OSPF引入的路由打Community标记 route-policy FROM_OSPF permit node 10 apply community 65001:100 additive bgp 65001 import-route ospf 1 route-policy FROM_OSPF # 必须显式开启向IBGP对等体通告Community peer 1.1.1.1 as-number 65001 peer 1.1.1.1 advertise-communityR1侧的配置# 匹配带65001:100的Community ip community-filter 10 permit 65001:100 route-policy DENY_OSPF_LOOP deny node 10 if-match community-filter 10 route-policy DENY_OSPF_LOOP permit node 100 bgp 65001 peer 2.2.2.2 as-number 65001 peer 2.2.2.2 route-policy DENY_OSPF_LOOP import这里面有一个非常容易踩的坑华为VRP默认不向IBGP对等体传递Community属性。R2即使打了Community如果不配peer 1.1.1.1 advertise-communityR1收到的BGP路由里Community字段是空的if-match community-filter 10永远匹配不上过滤策略形同虚设。而且这个命令要配在R2上不是R1上方向别搞反。Community方案的另一个优势是支持嵌套传递。R2打标后如果AS内部还有路由反射器Community可以跟着路由传到所有客户端反射器上不需要额外配置这比逐台做AS_PATH过滤省事得多。4.3 Local-Pref降权替代硬过滤冗余与防环兼得硬过滤的问题是路由被彻底拒收一旦EBGP主路径断了备用路径也起不来。有些场景下你希望这条从OSPF倒灌回来的路由存在但只能当备份别抢占主路径。这时用Local-Pref降权比deny更合适。R1上把带65001:100 Community的路由的Local-Pref从默认100调低到50route-policy LOWER_PREF permit node 10 if-match community-filter 10 apply local-preference 50 bgp 65001 peer 2.2.2.2 as-number 65001 peer 2.2.2.2 route-policy LOWER_PREF importBGP选路时Local-Pref优先级排第二只低于Preferred-Value。EBGP原始路径的Local-Pref是默认100倒灌路径被压到50选路时EBGP路径稳稳胜出。主路径断了之后BGP会重新收敛把流量切到这条降权路径上实现有冗余、无环路。这个方案适合对可用性要求高、能接受过渡期次优路径的客户。三个方案放一起对比方案防环效果对业务影响适用场景Tag过滤从OSPF侧断环无副作用只滤来源路由双ASBR互引标准场景AS_PATH过滤从BGP侧断环可能误伤本地起源路由对端不发布本地路由的边界Community加Local-Pref降权不断环压制优先级保留备用路径需要冗余兜底的现网5. 华为路由器互引防环的5个常见坑与排查命令5.1 Tag打上了却不过滤先查LSA和node顺序现象R1配置了apply tag 100R2的route-policy也写了if-match tag 100但R2引入BGP后10.1.0.0/16还是出现在BGP路由表里。原因通常有两个一是node顺序写反permit兜底节点放在了deny前面所有路由先被放行二是Tag根本没进LSA。排查时在R2上执行display ospf lsdb ase看10.1.0.0/16对应的LSA 5的Tag列如果显示是0说明R1的route-policy没被OSPF引入动作引用或者apply tag节点没命中。解决先确认import-route bgp route-policy TAG_FROM_BGP这条命令确实敲进了R1的OSPF进程再确认route-policy里if-match的前缀和实际路由前缀一致最后检查node顺序deny在前、permit托底。5.2 BGP表出现空AS_PATH的次优路径选路顺序在起作用现象R1的BGP表里10.1.0.0/16有两条路径一条AS_PATH是65002另一条AS_PATH为空且空AS_PATH的路径被优选下一跳指向R2而不是外部对等体。原因就是2.3节讲的BGP选路规则AS_PATH长的反而落败。解决按第4章的方案二或方案三处理。如果只想要主路径直接过滤空AS_PATH如果想留冗余降Local-Pref。排查时用display bgp routing-table 10.1.0.0 16看两条路径的完整属性确认哪条被优选、优选原因是什么再决定加过滤还是降权。5.3 External LSA序列号反复递增双向倒灌的振荡特征现象display ospf lsdb ase里10.1.0.0/16的LSA序列号一直在涨比如从0x80000001变到0x80000005再继续涨OSPF邻居状态正常但LSDB不停刷新设备CPU升高。原因R1引入OSPF后R2倒灌回BGPR1选路切到R2的路径R1的OSPF外部路由cost或下一跳发生变化触发LSA重新生成新LSA泛洪到R2后又引到BGP继续影响R1选路形成一个自激振荡。解决核心还是打破双向倒灌把R2侧对Tag 100路由的deny策略加上振荡在几个OSPF收敛周期内就会停止。排查时抓display bgp routing-table看路径是否在两条之间来回切换能100%确认是互引振荡。5.4 advertise-community没开Community在IBGP里被剥掉现象R2侧配置了apply communityR1侧也用community-filter做了匹配但display bgp routing-table 10.1.0.0 16里看不到Community属性过滤策略完全不生效。原因华为VRP出厂默认不向BGP对等体通告Community属性必须用peer x.x.x.x advertise-community显式开启。这个命令只影响指定的对等体不是全局开关。解决在R2的BGP视图下对R1的IBGP会话执行peer 1.1.1.1 advertise-community然后在R1上再查一次路由属性。顺带提醒如果中间有路由反射器反射器也要对客户端方向开启advertise-community否则属性在反射链路中间就断了。5.5 NSSA区域的7转5防环点从ASBR挪到ABR现象OSPF域内有一个区域配成了NSSAR1在这个NSSA区域里做BGP引入OSPF产生的是Type 7 LSA。R2不在NSSA里它看到的是ABR转换后的Type 5 LSA。此时在R2上按Tag做过滤发现Tag还在但过滤后BGP里还是出现了倒灌路由。原因NSSA的7转5转换发生在ABR上不是ASBR上。如果ABR自己也在跑BGP引入OSPF或者ABR路由策略没做同样过滤环就从ABR这个点绕过去了。解决在NSSA场景下防环策略要同时落在ASBR和ABR两台设备上或者在ABR上确认转换后的Type 5 LSA的Tag被保留统一用同一套Tag过滤。排查时display ospf lsdb nssa看Type 7 LSA的Tag和转换路由器再用display ospf lsdb ase对比ABR转换后的Tag值。6. 更稳的工程做法单向引入加默认路由的取舍6.1 用network精确宣告替代OSPF到BGP的倒灌Tag过滤、AS_PATH过滤、Community降权说到底都是在给双向互引这个设计打补丁。工程上我更推荐从源头改设计不做双向互引。OSPF域内的核心网段如果确实需要进BGP用network命令逐条宣告而不是import-route ospf整表倒灌。network命令的语义是我主动宣告某条具体前缀路由必须存在于IP路由表里才宣告成功天然可控。R2需要宣告10.2.0.0/16就敲一条network 10.2.0.0 16R1倒灌过来的10.1.0.0/16不在宣告清单里自然进不了BGP。BGP到OSPF的方向保留一侧引入OSPF域内需要的外部路由用一条默认路由兜底或者用聚合路由替代明细倒灌。这个改法的核心收益是路由方向变成单向环路从设计上不存在防环策略从「到处打补丁」变成「只需要守一个口子」。代价是配置脚本多几行network网络变更时多维护一张宣告清单但相比深夜排障的时间这点维护成本完全可以接受。6.2 验证路径的四个检查点改完配置后我习惯按顺序做四个验证缺一不可。第一在R1上执行display bgp routing-table 10.1.0.0 16确认只有一条EBGP路径没有空AS_PATH的IBGP路径。第二在R2上执行display ospf lsdb ase确认10.1.0.0/16的Tag值是预期值比如100且LSA的Advertising Router是R1的Router ID。第三在R1上display bgp routing-table peer 2.2.2.2 received-routes核对IBGP邻居到底给自己发了哪些路由有没有漏掉正常业务段。第四从R1的Loopback口执行tracert 10.1.0.1第一跳应该是EBGP外部对等体方向如果第一跳指向R2说明还有路径在绕。这四个点全过基本能确认互引环路断了。6.3 写在最后做过几年华为路由器维护的人都有体会BGP和OSPF互引的环路排查起来特别像玄学明明配置看着全对流量就是在两台ASBR之间来回打转。我的习惯是每次做路由引入变更前先在白板上画一张「路由来源-流向矩阵」标清楚每台ASBR引入了什么、过滤了什么、Tag打在哪一侧画完了再动设备。很多环路问题在画矩阵的时候就已经暴露出来了根本不用等到半夜被监控报警叫醒。这个习惯也算是我用几次踩坑换回来的血泪经验希望帮到你。本文还有配套的精品资源点击获取
返回列表