简介:华为路由器三层路由防环专题03围绕BGP与OSPF协议互引路由场景展开,适合网络工程师、IT运维人员以及备考华为认证的读者学习。资源为单份PDF文档,大小约211KB,内容紧凑,包含典型组网、环路产生原理、错误配置示例及防环建议配置等完整章节。目前已有2127人学习下载。专题以DeviceA发布的10.10.10.10/32路由为例,详细拆解了路由如何在BGP与OSPF之间反复传递、因MED值和路由优先级差异逐步形成稳定环路的过程,并给出利用route-policy控制路由引入导出、调整MED、借助AS_PATH防环等实用配置思路,同时说明了适用产品与版本。对于需要规避路由互引风险、提升网络稳定性的读者,这份资料能提供清晰的排错参考与配置指导。
1. 一个网段在两台路由器的路由表里互相指往对方,才是这组互引命令真正该防的环
华为路由器三层路由防环专题里,BGP 和 OSPF 互引是最容易“配置成功但路由走错”的一类。很多网络刚接起来时 ping 通,等出现双出口或者备份链路,同一个网段就可能同时出现在 OSPF 外部路由和 BGP 表里,下一跳互相指向对方,流量在两条链路上反复弹跳。本文用华为 AR 路由器做最小场景复现,先说明为什么 BGP 的 AS_PATH 和 OSPF 的 Router-ID 都拦不住这种回灌,再给出 route-policy、tag、preference 的组合防环配置,最后落到可以照着敲的验证命令。
2. 互引为什么能绕过 BGP 和 OSPF 自带的防环机制
2.1 先分清“路由更新防环”和“转发平面成环”
BGP 的 EBGP 防环靠 AS_PATH:收到一条 AS_PATH 里包含自己 AS 号的路由就丢弃。OSPF 在域内靠 LSA 的 Advertising Router 和 Router-ID 做自始发 LSA 抑制:路由器收到自己产生的 LSA 不参与 SPF 计算。这两个机制都属于“更新平面防环”,处理的是“路由协议自身会不会把一条路由无限转播”。
互引绕过的是这一层。当路由从 BGP 被import-route进 OSPF,再被另一条import-route从 OSPF 引回 BGP 时,路由的身份变了:OSPF 侧看到的是一个新 Type-5 LSA,BGP 侧看到的是一个本地始发路由。原始 AS_PATH 不在了,原始 OSPF Router-ID 也不一定还在。于是协议说自己没收到“自己的路由”,可转发平面已经出现两个边界路由器互相指下一跳的局面。
2.2 华为 AR 上 BGP 与 OSPF 的优先级差异
华为 VRP 默认路由优先级不是思科习惯里的“EBGP 20、IBGP 200”。默认配置下,BGP 路由优先级是 255,OSPF 内部路由是 10,OSPF ASE/NSSA 外部路由是 150。也就是说,同一条前缀如果既要走 OSPF 外部路由,又要走 BGP,OSPF ASE 会把 BGP 从活跃路由里挤掉。这一点在互引场景里非常关键,很多人查了半天发现“明明 BGP 表里有路由,但display ip routing-table里下一跳是 OSPF 方向”,原因就在这里。
| 路由来源 | 华为 VRP 默认优先级 | 说明 |
|---|---|---|
| Direct | 0 | 直连路由 |
| OSPF 内部路由 | 10 | 区域内和区域间路由 |
| Static | 60 | 静态路由默认优先级 |
| OSPF ASE/NSSA | 150 | OSPF 引入的外部路由 |
| BGP | 255 | 华为 VRP 默认 EBGP/IBGP 相同 |
2.3 单点互引的回灌路径
用一个常见场景说明:R1 同时跑 OSPF 和 EBGP,R1 把上游 BGP 学到的 172.16.0.0/16 引入 OSPF,又配置了import-route ospf 1把 OSPF 路由引入 BGP。这时 BGP 表里多了一条“从 OSPF 来”的 172.16.0.0/16。R1 把这条路由发给 EBGP 对端时,AS_PATH 被重置成自己的 AS 号,对端看到一条比自己上游路径更短的新路由,就可能把下一跳切回 R1。
问题不在“收到路由的设备不懂防环”,而在 R1 自己把一条外部路由重新“生”了一次,生出来的路由没有任何原始路径信息。只要 R1 原 BGP 表的下一跳仍然是上游,而上游的下一跳已经变成 R1,流量就在 R1 和上游之间来回打转。TTL 会减到 1 然后被丢,但从路由表看,两边都觉得自己有条可用路由。
3. 华为路由器上复现 BGP/OSPF 互引:配置、命令与现象确认
3.1 跨域对接的三个步骤先别省
复现用的拓扑不搞复杂:R1 是 AS 100 边界,R3 是 AS 200 边界,R1 和 R2 之间跑 OSPF Area 0。R1 的 EBGP 对端 R3 从上游 R4 学到 172.16.0.0/16。R1 只做两件事:把 BGP 引入 OSPF,再把 OSPF 引入 BGP。R2 在这里只是让 OSPF 表里有真实内部路由,方便观察。
interface GigabitEthernet0/0/0 ip address 10.0.12.1 255.255.255.252 interface GigabitEthernet0/0/1 ip address 10.0.13.1 255.255.255.252 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.0.12.0 0.0.0.3 bgp 100 router-id 1.1.1.1 peer 10.0.13.2 as-number 200 ipv4-family unicast peer 10.0.13.2 enable跨域对接的三个步骤在这里一个都不能省:第一步看 BGP 邻居是否 Established;第二步确认双方要发布的网段已经存在路由表里;第三步确认通告出去的 AS_PATH 和预期一致。第三步经常被忽略,互引场景的环路恰恰是在 AS_PATH 被重置后才出现的。
3.2 在 R1 上做 BGP 到 OSPF 的引入
ospf 1 import-route bgp这条命令会把 R1 BGP 表里的路由全部注入 OSPF,默认作为 Type-5 外部路由发布。实验里 172.16.0.0/16 会被写进 OSPF LSDB,R2 能收到这条 Type-5 LSA。注意“全部”两个字,不加 route-policy 时,BGP 表里所有活跃路由都会变成 OSPF 外部路由,这是后续所有问题的根源。
3.3 在 R1 上再做 OSPF 到 BGP 的引入
bgp 100 ipv4-family unicast import-route ospf 1这一步把 R1 的 OSPF 路由引入 BGP。问题在于,172.16.0.0/16 已经因为上一步变成了 OSPF 外部路由,import-route ospf会把它重新收进 BGP 表。BGP 表里于是同时存在两条路径:一条是原始 EBGP 从 R3 学到的,另一条是“OSPF 外部路由转 BGP”的本地始发路由。后者的 AS_PATH 为空,发给 R3 时才会被加上 AS 100。
用一个最小实验手法让 R3 一定选错:R4 向 R3 发布 172.16.0.0/16 时做 AS_PATH 追加,让 R3 原始路径长度大于 R1 回灌路径。
route-policy PREPEND permit node 10 if-match ip-prefix EXT apply as-path 300 300 additive ip ip-prefix EXT index 10 permit 172.16.0.0 16 bgp 300 peer 10.0.34.1 route-policy PREPEND export这些配置的目的不是模拟“正常网络”,而是让环路现象稳定出现,便于后续验证防环策略是否真的生效。
3.4 用 display 命令确认路由已经回灌
改完配置后,先看 BGP 邻居状态,再看前缀的 AS_PATH:
display bgp peer 10.0.13.2 display bgp routing-table 172.16.0.0 display ip routing-table 172.16.0.0在 R1 上,172.16.0.0/16 的活跃路由会是原始 EBGP 方向,下一跳指向 R3。在 R3 上,如果 BGP 选路已经切到 R1,display bgp routing-table 172.16.0.0里会出现一条 Path/Ogn 以 100 开头的路径,下一跳是 R1。这两台设备的下一跳互相指向对方,就是典型的“路由表里的环”。用display ospf lsdb ase 172.16.0.0还能看到 R1 产生的 Type-5 LSA,此时它的 Tag 字段是默认值 0。
| 检查点 | 命令 | 期望看到 |
|---|---|---|
| BGP 状态 | display bgp peer | Established |
| 路由是否回灌 | display bgp routing-table 172.16.0.0 | 出现 100i 或 100? 新路径 |
| 活跃路径下一跳 | display ip routing-table 172.16.0.0 | R1 指 R3,R3 指 R1 |
| OSPF LSDB | display ospf lsdb ase 172.16.0.0 | Type-5 LSA,Tag 为 0 |
4. 双向互引防环配置:route-policy、tag 与发布边界
4.1 先给“进入 OSPF 的 BGP 路由”打 tag
防环的第一件事是给路由一个身份,让它在 OSPF 域里能认出来。常见做法是在 OSPF 引入 BGP 时,用 route-policy 给外部路由打一个 tag。Tag 是 OSPF 外部 LSA 里现成的 32 位字段,RIP、OSPF、IS-IS 互相引入时都认它,适合做防环标记。
ip ip-prefix EXT index 10 permit 172.16.0.0 16 route-policy FROM_BGP_TO_OSPF permit node 10 if-match ip-prefix EXT apply tag 100 apply cost 200 ospf 1 import-route bgp route-policy FROM_BGP_TO_OSPF这个 route-policy 做了三件事:先限定只有 172.16.0.0/16 能进 OSPF;再给这条外部路由打 Tag 100;最后给 OSPF 外部路由一个固定 cost。Tag 是为了回灌时识别,cost 是为了控制 OSPF 域内选路方向。这里要养成白名单习惯,不要用空的permit node把所有 BGP 路由都放进去。
4.2 再拦“想从 OSPF 回 BGP 的同 tag 路由”
第二步是在 BGP 引入 OSPF 时,把带 Tag 100 的路由直接丢掉。这是防环的核心动作:带这个 tag 的路由本来就来自 BGP,不能再被 BGP 重新收编。
route-policy FROM_OSPF_TO_BGP deny node 10 if-match tag 100 route-policy FROM_OSPF_TO_BGP permit node 20 bgp 100 ipv4-family unicast import-route ospf 1 route-policy FROM_OSPF_TO_BGP第一段 deny node 10 把 Tag 等于 100 的 OSPF 外部路由拒绝掉;第二段 permit node 20 没有 match 条件,表示其余 OSPF 路由都可以引入 BGP。如果现场有多个 OSPF 进程,if-match tag是按 OSPF 进程里的路由属性匹配的,跨进程时要确认 tag 是否被保留。
提示:Tag 100 属于内部约定,不是协议标准值。只要所有参与互引的 ASBR 统一用同一个值,它就能在 OSPF 域里充当“这条路由是我放出去的”标记。
4.3 关键参数对照:tag、community、cost 与优先级
| 参数 | 配置位置 | 作用 | 建议 |
|---|---|---|---|
| route-tag | OSPF 引入 BGP 的 route-policy | 标记路由来源,32 位整数 | 按区域统一规划,别用 0 |
| BGP community | BGP 路由策略 | 在 BGP 域内标记路由身份 | 适合跨 AS 传递,不能替代 OSPF tag |
| OSPF cost | apply cost或import-route ... cost | 控制外部路由在 OSPF 内的优先度 | 与线路带宽、主备关系对应 |
| BGP preference | preference 120 120 130 | 控制 BGP 与 OSPF 抢路由表时的胜负 | 只在明确有兜底需要时使用 |
| route-policy 默认行为 | 策略末尾 | 未命中任何 permit 节点的路由被拒绝 | 记住它是白名单黑名单一体 |
BGP community 能不能替代 tag?不能完全替代。Community 是 BGP 的属性,不会跟着外部路由进入 OSPF LSA;而 Tag 是 OSPF/RIP 这一侧的身份。跨协议互引时,正确做法是“OSPF 侧认 tag,BGP 侧认 community”,两侧各标记各的,而不是指望一个属性贯穿两种协议。
4.4 发布边界:用 network 和 ip-prefix 缩小引入面
互引防环不是只靠一条 deny 策略,引入面越小,可被回灌的路由就越少。BGP 里能写network的优先用network,不要import-route ospf 1整表引入;OSPF 里能精确引的不要放全部 BGP 路由。
route-policy FROM_OSPF_TO_BGP permit node 10 if-match ip-prefix LOOPBACK_INTERNAL ip ip-prefix LOOPBACK_INTERNAL index 10 permit 192.168.200.0 24 bgp 100 ipv4-family unicast import-route ospf 1 route-policy FROM_OSPF_TO_BGP如果业务只需要把 OSPF 内部回程路由上送 BGP,就把permit node 20去掉,让策略只允许 LOOPBACK_INTERNAL。这样即使 Tag 配置漏了,可回灌的路由面也很小。
5. 优先级兜底、收敛边界与定向发布:互引场景的进阶控制
5.1 用 BGP preference 调整兜底路径
Tag 过滤解决的是“路由别再回灌”,preference 解决的是“万一两条路径都存在,选哪条”。华为 VRP 里 BGP 路由优先级默认 255,OSPF 外部路由 150,所以一旦同一条前缀同时出现在 BGP 和 OSPF ASE 里,OSPF 会压掉 BGP。
如果互引策略里部分路由无法完全过滤,可以下调 BGP 优先级,让原始 EBGP 路由在 IP 路由表里更有竞争力。
bgp 100 preference 120 120 130这条命令的三个值分别对应 EBGP、IBGP 和本地始发 BGP 路由的协议优先级。120 小于 OSPF 外部路由的 150,所以同一条前缀下,BGP 学到的那条会留在活跃路由表里。注意不要把值调到比 OSPF 内部路由还低,OSP 内部 10、静态 60 都仍然在该值之前,路由选路不会乱。
注意:preference 是协议优先级,local-preference 是 BGP 选路属性。local-preference 只影响 BGP 内部选路,不会决定 BGP 和 OSPF 谁进 IP 路由表。两者不要混用。
5.2 OSPF 外部路由类型和 cost 对环路的影响
OSPF Type-5 外部路由分 Type 1 和 Type 2。Type 2 在 OSPF 域内比较时只看外部 cost,不看内部链路 cost;Type 1 会把“外部 cost + 内部 cost”都算进去。互引场景默认走 Type 2,当链路是主备模式时,建议改成 Type 1,让回灌路径在拓扑变化时更容易收敛。
ospf 1 import-route bgp route-policy FROM_BGP_TO_OSPF type 1如果设备上策略已经带了apply cost,Type 1 会把这个 cost 和内部路径 cost 一起参与比较。真实场景里,R2 收到 R1 和另一台 ASBR 同时发布的同一条外部路由,Type 1 能让它按真实开销选路,而不是被一两条 Type 2 的固定 cost 卡住。
5.3 互引防环策略变更时的检查清单
现网改策略比初次部署更容易出问题,因为回灌路由可能已经在 LSDB 和 BGP 表里待了很久。改完 route-policy、tag 或 preference 后,按下面顺序核对。
| 步骤 | 操作 | 命令 |
|---|---|---|
| 1 | 确认 OSPF LSDB 里外部路由 Tag | display ospf lsdb ase 172.16.0.0 |
| 2 | 确认 BGP 不再收编同 tag 路由 | display bgp routing-table 172.16.0.0 |
| 3 | 确认活跃路由方向 | display ip routing-table 172.16.0.0 |
| 4 | 软重置 BGP 对等体 | reset bgp 10.0.13.2 |
| 5 | 观察 AS_PATH 是否恢复 | display bgp routing-table |
查看 OSPF LSDB 时,重点看 Tag 字段和 Advertising Router。如果 Tag 已经不是内部约定值,先查是哪台设备把 tag 丢了,再检查该设备有没有做路由回灌。不要直接重配 OSPF 进程,大面积 reset 会让业务中断,先做 BGP 软复位和对端设备的策略核对。
6. 验证防环生效的一组命令与排错顺序
互引防环做完,验证不应该只看“线路通不通”。线路通只能说明当前活跃路径没断,不能说明回灌路由已经被挡住。要做一次完整的正反向验证。
先清掉 BGP 表里可能残留的旧路径,让策略从头生效:
reset bgp 10.0.13.2 display bgp routing-table 172.16.0.0 display ospf lsdb ase 172.16.0.0display bgp routing-table 172.16.0.0里如果只剩一条从 R3 学到的路径,说明 OSPF 回灌的 172.16.0.0/16 没有被 BGP 重新收编。display ospf lsdb ase 172.16.0.0里 Tag 字段应该是 100,表示这条外部路由确实是本设备打标后放出去的。
接着做一次路由收敛验证:在 R1 上把 R3 方向的 BGP 邻居 down 掉,观察 172.16.0.0/16 是否还能通过 OSPF 学到,恢复后是否回到 BGP 路径。这个过程能确认防环策略不会把正常备用路径也挡掉。
排错顺序固定为:先看 BGP 表,再看 OSPF LSDB,最后看 IP 路由表。BGP 表里出现多余路径,说明 OSPF 到 BGP 的 route-policy 没拦住;BGP 表正常但 IP 路由表下一跳不对,说明 preference 或者 OSPF cost 有问题;两边都正常,再检查对端设备是否也做了同样的互引回灌。最后一个动作是回归验证:把策略里的 deny node 临时改成 permit,确认回灌路由重新出现,再改回来确认消失。这样能证明防环逻辑确实在起作用,而不是恰巧因为拓扑收敛掩盖了问题。
本文还有配套的精品资源,点击获取