☰
华为路由器BGP与OSPF互引路由回灌防环配置详解
2026/10/9 3:38:43 网站建设 项目流程

简介:针对华为路由器上BGP与OSPF互引场景的三层路由防环问题,该专题PDF以DeviceA、DeviceB、DeviceE、DeviceF互引组网为例,分阶段演示10.10.10.10/32路由因MED值差异在BGP和OSPF域反复传递形成稳定环路的过程,并给出基于路由策略与属性调整的防环配置思路,适合网络运维和数通学习者。文档共1个PDF,大小211KB,内容涵盖互引概述、典型组网、环路原理、错误配置示例、建议防环配置、适用产品版本及总结建议,也涉及AS_PATH等BGP防环机制。目前已有2129人学习下载,读者可据此掌握协议优先级变化与路由环路成因,用于排错和方案设计参考。

1. BGP与OSPF互引的场景:一次默认配置就会引发的回灌故障

凌晨两点,某单位两台华为AR路由器做了BGP与OSPF互引,第二天一早内网访问外网开始时通时不通,登录设备一看,BGP路由表里同一个前缀出现了两条AS Path完全相同的路由。这就是这个专题要解决的核心:华为路由器三层路由防环专题03,专门拆BGP与OSPF互引路由时的环路问题。这类故障在企业出口、IDC边界非常常见,原因不是BGP或OSPF本身坏了,而是两个协议各自的防环机制只在各自协议域内有效,互引时环路信息会被“翻译”丢。这篇文章从原理讲到可复现配置,再给到排查手法,适合网络运维和集成工程师对照落地。

2. 互引环路为什么绕过了两个协议的防环:三次“翻译”丢信息

2.1 BGP的AS Path防环在OSPF眼中不存在

BGP的防环设计围绕两个核心机制:AS Path和IBGP水平分割。EBGP路由器收到一条路由时,如果AS Path里已经包含本端AS号,就拒绝接收;IBGP水平分割则规定从IBGP邻居学到的路由不能再传给其他IBGP邻居。这两条规则在纯BGP网络里非常有效,是BGP能撑起全球互联网的关键。

可一旦路由被引入OSPF,这些属性全部丢失。OSPF不读AS Path,它把外部路由封装成Type5 LSA,只保留metric、Tag、通告路由器ID等少数字段。换句话说,BGP辛辛苦苦保留下来的AS Path信息,在OSPF域里瞬间蒸发。OSPF域内其他路由器通过SPF算法得知“谁通告了这条外部路由”,但这条路由是不是绕了一圈回到原点的,OSPF既不知道,也没有能力去查。

2.2 OSPF的区域防环在BGP眼中同样不存在

OSPF的防环思路和BGP完全不同:它靠区域划分和SPF计算保证区域内无环,ABR是区域间路由的必经点,所有跨区域路由都得经过ABR的Type3 LSA汇总。外部路由则通过Type5 LSA在整个AS内泛洪,ASBR是唯一生成点。这套机制在纯OSPF网络里非常稳健,区域边界就是天然的环路屏障。

但当路由从OSPF引入BGP时,域号、路由器ID、ABR信息也全部丢了。BGP只看到一个前缀和一组属性。如果这条路由在进入BGP之前,已经经历过一次“BGP→OSPF→BGP”的往返,BGP侧根本看不出它的前世今生,因为它身上没有留下任何唯一的印记。

2.3 回灌闭环:三次“翻译”把防环信息全部洗掉

用一个最小拓扑说明问题。两台华为AR路由器R1和R2,跑同一个OSPF Area 0,同时跑IBGP。一条外部路由先从R1的EBGP对等体学到,被R1引入OSPF,泛洪给R2;R2再把这套OSPF路由引入BGP,通过IBGP传回R1。这一圈走下来,每一步的防环机制状态如下:

步骤路由所在协议域防环机制是否拦住
EBGP路由到达R1BGP域AS Path检查拦住,正常接收
R1把BGP引入OSPFOSPF域无跨协议检查未拦住,AS Path被丢弃
Type5 LSA泛洪到R2OSPF域SPF区域防环未拦住,外部LSA正常传播
R2把OSPF引入BGPBGP域AS Path检查未拦住,AS Path中没有重复AS号
IBGP传回R1BGP域IBGP水平分割未拦住,水平分割只限制继续传,不限制回灌

最关键的是最后一步。IBGP水平分割只管“从IBGP学到的路由不再传给其他IBGP对等体”,它不管“是否从IGP引入后再传回”。回灌路线正好从这个缝隙溜过去,R1最后看到的是两条一模一样的前缀,一条来自原始EBGP对等体,一条来自R2绕一圈回来的IBGP,而且AS Path完全相同。

2.4 对OSPF特殊区域路由的理解:防环边界也可能是互引雷区

互引场景里,对OSPF特殊区域路由的理解必须多一层考虑。Stub区域和Total Stub区域拒绝Type5外部路由,这本身是一道很好的防环墙,外部路由进不来。但如果把互引的ASBR放在Stub区域里,import-route bgp会直接报错,或者OSPF邻居反复震荡,因为这种区域不允许泛洪Type5外部LSA。

更隐蔽的坑在NSSA区域。NSSA用Type7 LSA承载外部路由,由ABR转换成Type5。在双点互引场景下,如果两台ABR同时把NSSA里的外部路由翻译成Type5,可能出现两条翻译路径互相回灌的环路。这不是玄学,是Type7→Type5翻译点不唯一导致的。解法是让NSSA区域的翻译边界保持单点,或者通过配置明确谁来做translator,避免两个ABR同时翻译。

3. 双点互引的最小复现:华为AR配置与显示输出里的环路痕迹

3.1 最小拓扑与路由设计

为了把问题说清楚,我用两台华为AR路由器搭一个最小复现环境。R1和R2直连,跑OSPF Area 0,同时跑IBGP。R1额外有一条EBGP链路连到外部AS,模拟企业出口。拓扑参数如下:

设备接口地址用途
R1GigabitEthernet0/0/010.0.0.1/30与R2互联
R1LoopBack0192.168.1.1/32OSPF Router ID
R2GigabitEthernet0/0/010.0.0.2/30与R1互联
R2LoopBack0192.168.2.1/32OSPF Router ID
R1外部链路10.0.0.254/30EBGP对等体

两台路由器AS号都设为65001,外部EBGP对等体所在的AS为65002。R1上有一条外部路由10.0.20.0/24通过EBGP学到,我们需要复现这条路由在互引之后又被R2“送回来”的过程。

3.2 互引配置:看起来“没毛病”的默认配置

先展示一个“默认做法”,也就是不做任何防环策略、直接双向引入的配置。这种配置在真实网络里非常常见,因为很多运维同事觉得“路由引进去能通就行”。

R1上的配置:

# R1:把EBGP外部路由引入OSPF,同时把OSPF内网路由通告给BGP ospf 1 area 0.0.0.0 network 10.0.0.0 0.0.0.255 network 192.168.1.1 0.0.0.0 import-route bgp bgp 65001 peer 10.0.0.2 as-number 65001 peer 10.0.0.254 as-number 65002 import-route ospf 1 ipv4-family unicast peer 10.0.0.2 enable peer 10.0.0.254 enable

R2上的配置:

# R2:只跑OSPF和IBGP,把OSPF里学到的所有路由一股脑引入BGP ospf 1 area 0.0.0.0 network 10.0.0.0 0.0.0.255 network 192.168.2.1 0.0.0.0 bgp 65001 peer 10.0.0.1 as-number 65001 import-route ospf 1 ipv4-family unicast peer 10.0.0.1 enable

配置里的关键点是R2没有EBGP对等体,当R1把外部路由引入OSPF后,R2在OSPF表里能学到10.0.20.0/24。R2又执行了import-route ospf 1,把它在OSPF里学到的所有路由都引入BGP,其中就包括这条“从BGP绕进来的外部路由”。于是这条路由以IBGP的方式传回R1,环路闭环成立。

3.3 回灌后的路由表象:display输出里怎么认

在R1上执行display bgp routing-table,会看到类似这样的输出:

# display bgp routing-table 10.0.20.0 24 的简化输出 BGP Local router ID is 192.168.1.1 Total Number of Routes: 2 *> 10.0.20.0/24 10.0.0.254 0 100 65002 i *> 10.0.20.0/24 10.0.0.2 0 0 65002 i

两条路由的前缀相同、AS Path相同,但一条来自EBGP对等体10.0.0.254,另一条来自IBGP对等体10.0.0.2。“*>”标记表示最优路由。如果选路选到了第二条,流量就会发给R2,而R2拿到这条路由的下一跳又指回R1或OSPF域内的其他设备,形成路由层面的死循环。

再看R2上的OSPF外部路由表,会看到这条路由是以Type5 LSA形式存在的:

# display ospf lsdb ase 10.0.20.0 24 的简化输出 Type : External LS ID : 10.0.20.0/24 Adv Router : 192.168.1.1 Metric : 1 Tag : 0

注意Tag字段是0,因为没有做任何标记。R2完全不知道这条外部路由是从BGP转译过来的,它只知道OSPF域里有这么一条外部路由,于是又把它引回了BGP。整个回灌过程中,没有任何机制能告诉R2“别引它”。

3.4 参数层面的根源:华为路由优先级与OSPF外部路由选路

跨协议互引的环路,除了防环信息丢失,还有一个参数层面的推手:路由优先级。华为设备上默认的路由优先级是数值越小越优先,Direct为0,OSPF为10,OSPF外部路由ASE为150,BGP路由为255。注意,OSPF的外部路由优先级150远高于BGP的255。

这意味着在互引场景里,R1通过EBGP学到的外部路由优先级是255,而R2通过OSPF中转后又引入BGP、通过IBGP传回R1的同一路由,在R1的IP路由表里可能以OSPF外部路由或IBGP路由两种身份参与选路。不管以哪种身份出现,它的优先级都比原始EBGP路由要高。于是R1会放弃原始EBGP路由,转而选择“绕一圈回来”的次优路由,下一跳指向R2。R2的下一跳又指向R1或OSPF域内的ASBR,这就是数据面环路的前兆。

有人会在OSPF视图下用preference ase把OSPF外部路由优先级调低,缓解选路反转。这个手段能解决一部分次优路径问题,但没有解决“路由仍然被回灌”的事实。只要回灌动作还在,调整优先级只是让R1暂时不选它,环路风险依然潜伏在网络里。

4. 用Tag和Community做互引防环:华为路由器配置与参数说明

4.1 先从设计上避免“双向互灌”

配置防环策略之前,必须先做设计层面的取舍。我在现网里最常见的做法是:尽量减少互引点。如果条件允许,一个方向只在一台设备上完成,不要两台设备同时做双向引入。下面这张表总结了三种设计形态和对应的风险:

互引形态典型拓扑环路风险建议
单点单向只有一台ASBR做单向引入低最优先
单点双向一台ASBR既引入又引出中需要Tag防回灌
双点双向两台设备都互相引入高必须双方向做防环策略

双点双向是环路最容易翻车的形态,因为回灌路径有两条。如果业务必须做成双点容灾,那每一步引入都必须带上明确的身份标记,并在反向引入点过滤。

4.2 从BGP引入OSPF:用Tag标记互引边界

防环的第一步,是让从BGP进入OSPF的路由带上一枚“身份标记”。OSPF的外部LSA自带Tag字段,这个字段会随着Type5 LSA在整个OSPF域内泛洪,域内所有路由器都能看到。华为AR系列在import-route bgp时,可以挂一个route-policy来打Tag。

R1上的配置如下:

# R1:给所有从BGP引入OSPF的外部路由打上Tag 1000 route-policy bgp-to-ospf permit node 10 apply tag 1000 ospf 1 import-route bgp route-policy bgp-to-ospf type 2 cost 50

配置里type 2表示OSPF外部路由使用Type2度量,cost固定为50。对于外部路由来说,Type2方式不会随着链路跳数累加metric,计算简单,也更适合判断路由来源。如果业务需要体现链路开销,可以改成type 1,但防环思路不受影响。

打完Tag之后,R2在OSPF路由表里看到这条外部路由时,Tag字段就会变成1000。R2在反向引入时,只需要匹配这个Tag并拒绝,就能拦截回灌。

R2上的反向过滤配置:

# R2:把OSPF引入BGP之前,先检查Tag,带1000的直接拒绝 route-policy ospf-to-bgp deny node 10 if-match tag 1000 route-policy ospf-to-bgp permit node 20 bgp 65001 import-route ospf 1 route-policy ospf-to-bgp

这里的关键是deny节点放在前面。route-policy按照节点号从小到大的顺序匹配,先命中deny节点就直接拒绝,不再匹配后面的permit节点。这样R2只会把OSPF域内真正原生产生的内网路由引入BGP,而不会把从BGP引进来又被OSPF泛洪回灌的外部路由再带走。

4.3 从OSPF引入BGP:用Community标记互引边界

BGP路由本身没有OSPF那样的Tag字段,但华为设备可以通过Community属性做等价标记。在R1把OSPF路由引入BGP时,给路由打上自定义Community,然后在IBGP接收方向过滤,同样能起到防环作用。

R1的配置如下:

# R1:把OSPF内网路由引入BGP时,打上Community标记 route-policy tag-community permit node 10 apply community 65001:1000 additive bgp 65001 import-route ospf 1 route-policy tag-community

Community值65001:1000是一个自定义值,65001是本端AS号,1000是方向标识。additive关键字表示在保留原有Community的基础上追加,避免覆盖路由的其他属性。

然后在R1从IBGP邻居接收路由的方向上做过滤,拒绝任何带这个Community的回灌路由:

# R1:针对IBGP入方向,拒绝带互引标记的路由 ip community-filter basic deny-loop deny 65001:1000 route-policy deny-loop deny node 10 if-match community-filter deny-loop route-policy deny-loop permit node 20 bgp 65001 peer 10.0.0.2 route-policy deny-loop import

这段配置要在BGP的ipv4-family unicast视图下配置peer的route-policy。注意,这个过滤只挂给IBGP对等体10.0.0.2,千万不能挂在EBGP对等体方向,否则会把真正来自外部的路由也挡掉。

4.4 完整防环配置整合:双侧双向的可用版本

把两套配置合并到一起,就是一份完整的双点互引防环脚本。R1作为有EBGP的一侧,要同时做“BGP→OSPF打Tag”和“OSPF→BGP打Community”。R2作为纯内网设备,要做“OSPF→BGP前过滤Tag”。

R1完整配置如下:

# R1:双向互引防环配置 # 方向一:BGP-->OSPF,打Tag 1000 route-policy bgp-to-ospf permit node 10 apply tag 1000 ospf 1 import-route bgp route-policy bgp-to-ospf type 2 cost 50 # 方向二:OSPF-->BGP,打Community 65001:1000 route-policy tag-community permit node 10 apply community 65001:1000 additive # 方向三:IBGP入方向,拒绝带互引标记的回灌路由 ip community-filter basic deny-loop deny 65001:1000 route-policy deny-loop deny node 10 if-match community-filter deny-loop route-policy deny-loop permit node 20 bgp 65001 peer 10.0.0.2 as-number 65001 peer 10.0.0.254 as-number 65002 import-route ospf 1 route-policy tag-community ipv4-family unicast peer 10.0.0.2 enable peer 10.0.0.254 enable peer 10.0.0.2 route-policy deny-loop import

R2完整配置如下:

# R2:OSPF-->BGP前过滤Tag 1000,防止回灌 route-policy ospf-to-bgp deny node 10 if-match tag 1000 route-policy ospf-to-bgp permit node 20 bgp 65001 peer 10.0.0.1 as-number 65001 import-route ospf 1 route-policy ospf-to-bgp ipv4-family unicast peer 10.0.0.1 enable

这套配置的核心逻辑是:BGP进入OSPF的路由带Tag 1000,OSPF再想回BGP时被Tag拦截;OSPF进入BGP的路由带Community 65001:1000,IBGP再想带回来时被Community过滤。两侧各守一道门,环路从两个方向都进不来。

如果是H3C设备,命令风格会略有差异,比如H3C的OSPF配置使用import-route bgp和route-policy的样式不同,Community过滤器写法也不一样。但思路完全一致:先给双向引入打上不同的身份标记,再在反向引入点做过滤。设备厂商换了,防环哲学不会变。

5. 互引防环避坑:5个真实场景的排查记录

5.1 现象:OSPF外部路由优先级“压过”BGP,流量绕到错误的下一跳

现象是互引之后,内网终端访问外网业务的时延忽高忽低,tracert发现流量先到了R2再兜回R1,没有直接走R1出口。

原因是OSPF外部路由ASE的默认优先级150远高于BGP的255。华为设备数值越小优先级越高,所以OSPF引入的外部路由在选路阶段直接胜出,R1的IP路由表把下一跳指向了R2。而R2的这条路由又来源于OSPF,环路的雏形就出来了。

解决方法是优先排查路由优先级和下一跳循环。最直接的办法是按4.2和4.3的配置把防环策略加上,让回灌路由根本进不了R1的BGP表。如果只是临时止血,可以在OSPF视图下执行preference ase 200,把OSPF外部路由优先级降到比BGP更低,让R1优先走原始EBGP路由。

5.2 现象:反向引入时Tag匹配不上,回灌路由依然出现在BGP表里

现象是R1已经在import-route bgp后面挂了打Tag的route-policy,但R2上if-match tag 1000就是匹配不到,回灌路由照样出现在R1的BGP表里。

原因排查下来通常是两种:一是route-policy挂错位置,import-route命令后面没有引用它;二是NSSA区域里存在Type7到Type5的翻译,ABR做翻译时把Tag清掉了。华为设备在Type7转Type5时,Tag字段不一定能原样保留,这很容易让人误以为Tag方案失效。

解决方法是先确认LSA里的Tag是否真的存在。在R2上执行display ospf lsdb ase,查看外部路由的Tag字段。如果Tag是0,说明OSPF侧就没有带上,需要回到R1检查route-policy是否生效;如果是在NSSA翻译点丢失,需要在ABR重新apply tag。这个排查顺序能省很多时间。

5.3 现象:以为IBGP水平分割能兜底,结果回灌链路根本没走BGP转发

现象是有同事说“IBGP有水平分割,不可能环”,但实际网络就是出现了路由反复震荡。

原因是把BGP的水平分割机制理解过度了。IBGP水平分割只限制“从IBGP学到的路由不能再传给其他IBGP对等体”,它不限制R1把从IBGP学到的路由再引入到OSPF,也不限制R2把OSPF路由引入BGP。水平分割在纯BGP拓扑里是铜墙铁壁,但遇到跨协议互引,就等于把门敞开了。

解决方法是不要依赖协议自带的防环能力,按前面给的Tag和Community方案显式标记互引边界。凡是“从BGP进OSPF”的路由必须打Tag,“从OSPF进BGP”的路由必须打Community,反向引入时严格过滤。

5.4 现象:在Stub区域里配置import-route bgp,OSPF邻居反复震荡

现象是某台设备在Stub区域中运行OSPF,为了互通又配置了import-route bgp,结果OSPF邻居状态一直Flapping,日志里全是LSA校验错误。

原因是Stub区域从设计上就不允许Type5外部LSA泛洪。在Stub区域内部执行外部路由引入,等于让OSPF违背自己的区域规则,设备会尝试泛洪它不该泛洪的LSA,邻居关系自然稳定不下来。

解决方法是把互引边界移出Stub区域。互引必须在普通区域或NSSA区域完成。如果业务要求该区域保持特殊区域属性,那就在ABR上做单向汇总,不要在该区域内的路由器上直接import-route bgp。这里再次体现对OSPF特殊区域路由的理解:特殊区域防环有效,但代价是外部路由进不来,这是区域属性决定的。

5.5 现象:打开同步检查想防黑洞,结果BGP外部路由通告不出去

现象是有人为了让BGP和IGP保持一致,在BGP配置里打开了同步检查,结果R1上原本能正常通告给EBGP邻居的外部路由突然不通告了。

原因是在互引场景下,BGP路由要先出现在IGP路由表里才能通告,而OSPF的外部路由引入和BGP的收敛顺序不一定一致。一旦时序错位,BGP认为IGP还没同步,就一直不通告,看起来像路由黑洞。

解决方法是不要在互引边界随意开启同步检查。华为设备默认关闭同步检查是有原因的,跨协议互引场景里同步检查的副作用远大于收益。防路由黑洞的正确做法是把防环策略做扎实,让路由来源清晰可控,而不是依赖同步检查兜底。

6. 验证防环是否生效:三表核对法与两个小技巧

我现在每次改完互引策略,不会马上收工,而是花三分钟做三张表的交叉核对。第一张是display ospf routing-table,重点看外部路由的Tag有没有打上;第二张是display bgp routing-table,重点看同一前缀有没有出现两条AS Path相同的路由;第三张是display ip routing-table,重点看下一跳是否指回到了原点。只有三张表都干净,才敢说防环策略生效。

检查项命令通过标准
OSPF外部路由Tagdisplay ospf routing tableBGP引入的路由Tag等于设定值
BGP回灌检查display bgp routing-table同一前缀不能有两条相同AS Path的路由
全局选路检查display ip routing-table外部路由下一跳指向真实出口方向

两个小技巧很实用。第一个是给方向编号,Tag和Community的值不要随便写。我习惯用Tag 1000表示“BGP进入OSPF”,Tag 2000表示“OSPF进入BGP”,Community值跟着方向走。这样以后排查时只要看数值就能反推这条路由是怎么进来的,省去回忆配置的时间。第二个技巧是改完配置后,用display route-policy查看策略的匹配次数,如果deny节点一直没命中,说明过滤条件可能写错或者路由本身就没走到这条策略。

回灌问题最折磨人的地方是它不一定会立即断网,而是表现为时通时不通、路径绕路这些“慢性病”。以前我也只盯着BGP表看,吃过一次回灌的亏后,现在不管网络多忙,都会把三张表拉出来核对一遍。防环不是配置完就结束,而是要形成一套能验证、能复盘的习惯。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询