OSPF与BGP互引防环实战:华为AR双点双向引入配置与排错
2026/9/17 7:27:35 网站建设 项目流程

简介:这是华为路由器三层路由防环专题中的一份技术文档,专门分析BGP与OSPF协议互引路由时可能引发的三层环路问题。文档先给出典型组网与数据准备,再以DeviceA发布的10.10.10.10/32路由为例,完整还原了从BGP引入OSPF、OSPF再引入BGP的四个阶段,并通过display bgp routing-table输出详细解读MED值影响BGP优选路径的深层原因。内容还包含可能导致环路的错误配置示例,以及基于路由策略、AS_PATH属性、路由引入控制等思路的防环建议配置,并说明了适用产品和版本范围。整个压缩包仅含1个PDF文件,大小211KB,目录分为概述、典型组网、环路产生原理、错误配置示例、建议配置示例、适用版本、总结等小节,方便读者按需查阅。当前已有2127人学习,非常适合具备BGP/OSPF基础、希望系统理解华为路由器三层路由防环原理及实践的工程师快速上手。

1. 三层路由防环专题,为什么绕不开 BGP 与 OSPF 互引这一页

OSPF 和 BGP 单独拿出来,防环都是各自的看家本领:OSPF 靠 SPF 算法和区域水平分割,BGP 靠 AS-Path 属性。但这两个机制在互引场景里有一个共同的盲区——当 A 协议学到的路由被引入 B 协议,又从 B 回到 A 时,A 和 B 都会认为这条路由“来历正当”。网工在华为 AR 路由器上做双点双向引入时遇到的回灌路由、LSA 序列号暴涨、BGP 路由表震荡,大多源于这条盲区。这个专题写到第 3 篇,前两篇把单域和静态边界的防环逻辑拆完,这一篇处理最容易被低估的 BGP 与 OSPF 互引场景:环路怎么形成、用哪几条命令挡住、验证时看哪些字段。适合负责现网运维和路由整改的网工阅读,新手也能照着配置走通。

2. 双点双向引入的环路成因:OSPF 的 Tag 盲区和 BGP 的 AS-Path 缺口

2.1 OSPF 外部路由没有水平分割:Tag 是唯一的防回灌挂载点

OSPF 的域内防环靠 SPF 计算,区域内所有路由器持有相同 LSDB,算出的是无环最短路径树;区域间防环靠 ABR 的水平分割——ABR 不会把从一个非骨干区域学到的 Type-3 LSA 转发到另一个非骨干区域,区域间流量必须经过骨干。这套设计在“域内路由 + 区域间路由”的范围内是自洽的,但它管不到 ASBR 引入的外部路由。

Type-5 LSA(AS External)由 ASBR 生成并泛洪到整个 OSPF 域,所有区域都能收到。OSPF 对 Type-5 没有任何类似水平分割的约束,也就是说,如果一台设备从 BGP 学到的路由被引入 OSPF,泛洪到全区域后,另一台 ASBR 又把它从 OSPF 引入回 BGP,OSPF 本身不会拦截。多区域的 NSSA 场景里,Type-7 LSA 经 ABR 转 Type-5 也是一样的逻辑,Translator 机制只负责 7 转 5 的身份仲裁,不提供外部路由环路防护。

因此,OSPF 为外部路由预留的防环字段是 External Route Tag,一个 32 位整数,随 Type-5/Type-7 LSA 扩散。华为路由器上默认引入的外部路由 Tag 为 0,需要在 route-policy 里用 apply tag 显式打标,之后在引入方向用 if-match tag 来拒绝特定来源。用命令可以直观看到 Tag 字段:

display ospf lsdb ase 10.10.0.0

输出里除了 LS ID、AdvRouter、Metric 之外,有一列 Tag。两台 ASBR 都在引入同一个前缀且 Tag 不一致时,回灌就已经在发生了,只是路由表还不一定抖动——这正是互引场景最隐蔽的地方。

2.2 BGP 的 AS-Path 只拦 EBGP 环路:iBGP 互引靠社区属性自律

BGP 的防环机制是 AS-Path:从 EBGP 收到的路由,如果 AS_PATH 里已经包含本 AS 号,直接拒收。这个检查在 EBGP 边界是强制的、有效的。但 iBGP 学到的路由不做 AS-Path 检查——同一 AS 内传播的路由,AS_PATH 是相同的,检查无意义。华为路由器在 iBGP 场景下防环靠的是路由反射器的 Originator_ID 和 Cluster_List,普通 iBGP 对等体之间则完全依赖配置纪律。

设备被部署为边界路由器时,通常会同时运行 OSPF 和 BGP:下行接口跑 OSPF,上行或横向接口跑 BGP,中间用 import-route 连通。在这个结构里,ASBR 上执行 import-route ospf 时,被引入的 OSPF 路由是“无社区属性、无 AS_PATH 来源信息”的,BGP 拿不到任何关于这条路由在 IGP 域内传播轨迹的记录。一旦这条路由通过 EBGP 出去、又被对端 AS 引入其 IGP、再通过另一条链路回到本 AS,设备无法从 AS_PATH 判断它是否曾经是本地 OSPF 路由。

还有一个让问题放大的细节是协议优先级:华为 VRP 上 BGP 路由优先级默认 255,而 OSPF 外部路由(ASE)是 150,OSPF 区域内是 10。同一前缀同时从 OSPF 和 BGP 学到时,OSPF 永远胜出。这和思科默认行为(eBGP 20 优先于 OSPF)正好相反,从思科切到华为的老手经常在这里踩坑。回灌路由一旦进入 OSPF,即使 BGP 里有一条更合理的路径,选路结果也会被 OSPF 优先级压过去。

2.3 回灌振荡的完整链路:一条重发布命令让两种路由协议互相投喂

把完整链路走一遍。R2 和 R3 同时运行 OSPF 区域 0 与 iBGP,R2 有一条 EBGP 对端,R3 也有一条 EBGP 对端,两台设备上都做了双向引入:

第一步,R2 把 OSPF 域内的 10.10.0.0/16 引入 BGP,发给 EBGP 对端 AS 100。此时这条路由在 BGP 侧是干净的,没有任何标记。

第二步,AS 100 内某台设备又把 10.10.0.0/16 引入它的 OSPF,该域内另一台设备与 R3 建立 EBGP 邻居,这条路由经 EBGP 回到 R3 的 BGP 表。此时 AS_PATH 里出现的是 AS 100 的号,不包含本 AS,BGP 正常接收。

第三步,R3 执行 import-route bgp,把这条“来自 EBGP”的路由引入 OSPF 区域 0。OSPF 泛洪 Type-5 LSA,R2 通过 OSPF 学到 10.10.0.0/16,优先级 150,优于它 BGP 表里的任何路径,出接口从 EBGP 方向切到 OSPF 方向。

第四步,R2 的 import-route ospf 把这条刚刚通过 OSPF 学回的 10.10.0.0/16 再次引入 BGP,发给 AS 100。AS 100 再次把路由引入 OSPF……两个 AS 的 IGP 和 BGP 之间形成了永动回路。流量路径每收敛一次就切换一次,LSA 序列号持续递增,BGP 路由表在几秒内刷新一轮。

问题根源不是 BGP 选路错,也不是 OSPF 计算错,而是互引操作本身没有“身份识别”。AS-Path 和 OSPF 区域防环在各自的域内都有效,但互引把两个域的边界打通的同时,没有给路由打上“我从哪来、到哪去”的标记。下一步的配置全部围绕补上这个标记。

3. 华为 AR 上的最小防环配置:BGP Community 与 OSPF Tag 双标互拒

3.1 防环标记的总体规划:先定 Tag 再动 import-route

动手配置之前,先把两个方向的标记定死。以 R2、R3 为例,两台设备都在跑 OSPF 区域 0 和 BGP 65000,并且都做了双向引入。整套方案只需要两个标识:一个给“从 OSPF 进 BGP 的路由”,一个给“从 BGP 进 OSPF 的路由”。OSPF 侧用 External Route Tag 作为载体,BGP 侧用 Community 属性作为载体,因为 OSPF 路由不能携带 BGP Community,BGP 路由也没有 OSPF Tag 字段,两者必须各用一个属性。标记规划如下:

引入方向标记载体标记值拒绝规则
OSPF 引入 BGPBGP Community65000:100带该 Community 的 BGP 路由不再引入 OSPF
BGP 引入 OSPFOSPF External Tag300带该 Tag 的 OSPF 路由不再引入 BGP

这两个标记得在所有做引入的 ASBR 上统一下发。R2 和 R3 只要有一台漏配,漏配那台就会把回灌路由放行,整网防环失效。下面所有配置示例都以 R2 为主,R3 把 router-id 和互联地址替换掉即可。

3.2 OSPF 引入 BGP 方向:拒绝带 Tag 300 的外部路由

R2 上配置 OSPF 引入 BGP 方向的 route-policy。这个方向处理的对象是“即将进入 BGP 的 OSPF 路由”,过滤依据是 OSPF 外部路由的 Tag 字段:

# R2:OSPF 引入 BGP 方向 # 带 tag 300 说明这条路由是刚从 BGP 引到 OSPF 的,禁止再进 BGP route-policy IMP_OSPF_TO_BGP deny node 10 if-match tag 300 # 其余 OSPF 路由统一打 Community 65000:100,标记为“由 OSPF 引入” route-policy IMP_OSPF_TO_BGP permit node 20 apply community 65000:100 additive

3.3 BGP 引入 OSPF 方向:Community 过滤与打标

再配置 BGP 引入 OSPF 方向的 route-policy。这个方向处理的对象是“即将进入 OSPF 的 BGP 路由”,过滤依据是 BGP Community:

# R2:BGP 引入 OSPF 方向 # 定义 Community 过滤器:识别从 OSPF 引到 BGP 的路由 ip community-filter 1 permit 65000:100 route-policy IMP_BGP_TO_OSPF deny node 10 if-match community-filter 1 # 其余 BGP 路由引入 OSPF 时打 Tag 300,标记为“由 BGP 引入” route-policy IMP_BGP_TO_OSPF permit node 20 apply tag 300

两个 route-policy 配置完成后,挂到对应的引入命令上:

# R2:把两个方向的引入都挂上策略,同时给 iBGP 对等体下发 Community bgp 65000 peer 3.3.3.3 as-number 65000 peer 3.3.3.3 connect-interface LoopBack0 import-route ospf 1 route-policy IMP_OSPF_TO_BGP peer 3.3.3.3 advertise-community ospf 1 router-id 2.2.2.2 import-route bgp route-policy IMP_BGP_TO_OSPF

逻辑说明:route-policy 按节点号从小到大逐个匹配,deny node 10 先执行,命中即拒收;未命中的落到 permit node 20,执行 apply 子句打标记。顺序不能颠倒,deny 必须在前。华为 route-policy 的 permit 节点即使不写 if-match 也会匹配所有剩余路由,这里的 node 20 就是默认放行通道,靠 apply 完成标记动作。

参数说明:apply community 65000:100 additive中的 additive 表示追加而不是覆盖已有 Community,这一步非常关键——BGP 路由可能已经从上游携带了其他 Community 属性,覆盖会导致策略联动丢失。if-match tag 300匹配的是 OSPF 外部路由的 Tag 字段,默认引入的外部路由 Tag 为 0,所以配置了打标之后,未打标的外部路由也能正常通过。peer 3.3.3.3 advertise-community解决的是 iBGP 对等体之间的 Community 传递问题:华为 AR 上向对等体发布 Community 默认是关闭的,不配这条,R3 永远看不到 65000:100 这个标记,对端防环策略形同虚设。这是双机互引配置里最容易漏的一条。

3.4 两条策略组合后的转发语义

配置完成后,任何一条路由在 R2 与 R3 之间穿行时,都会经历如下检查:

路由状态经过方向检查点结果
刚从 BGP 学到BGP 引入 OSPFCommunity 65000:100命中 deny,拒绝入 OSPF
已从 OSPF 学到OSPF 引入 BGPTag 300命中 deny,拒绝入 BGP
OSPF 域内正常路由OSPF 引入 BGP无标记放行并打 Community 65000:100
BGP 正常路由BGP 引入 OSPF无该 Community放行并打 Tag 300

这套机制的本质是“环形拒绝”:A 方向引入的路由打上 A 标记,B 方向引入时拒绝 A 标记;B 方向引入的路由打上 B 标记,A 方向引入时拒绝 B 标记。两台 ASBR 各自执行一遍,整网就形成了闭环。只要两边策略一致,回灌路由在任何一个方向都会被拦在门外。

从 OSPF 引到 BGP 的路由打上 Community 之后,如果这个 AS 有多个出口、且对端 AS 又把路由引回 OSPF 重新传回来,BGP 侧的 Community 依然有效——因为 Community 只要在 iBGP 域内传播就会保留(前提是每台 iBGP 对等体都配置了 advertise-community)。这就是用 Community 而不是只靠 Tag 做 BGP 侧防护的原因:OSPF Tag 只在 OSPF 域内有效,一旦路由进入 BGP,Tag 信息就丢了,必须靠 BGP 自己的属性接力。

4. 多出口互引时防环配置的整网化:标记一致性、次优路径与跨域回灌

4.1 双 ASBR 同时引入:标记不一致会直接击穿防环

上一章的配置成立的前提是:所有执行引入的 ASBR 使用同一套标记方案。现实中多出口组网里 R2 和 R3 的配置往往不是同一个人写的,常见的故障形态是:R2 上 Tag 用 300,R3 上 Tag 用 400,两台设备各自防住了自己引入的路由,但对方打标的路由挡不住。回灌路由绕一圈之后,从另一台 ASBR 的缝隙里钻进路由表。

判断双 ASBR 是否在互相回灌,最快的办法是连看两次 LSA 序列号。在 R2 上执行:

display ospf lsdb ase 10.10.0.0

第一次记录 LS sequence 字段,隔 3 秒再执行一次。如果序列号在增长,说明有外部 LSA 在被反复刷新——回灌环路最典型的特征。正常情况下,一条静态的外部路由 LSA 只会在拓扑变化或定时刷新时更新,不会几秒钟跳一次。对比 R2 和 R3 上这条 LSA 的 Advertising Router 字段,如果两台 ASBR 都在通告同一前缀,且 Tag 值不同,标记不一致的问题就坐实了。整改方式不是把某一台的路由删掉,而是统一两边的 route-policy 标记值,然后清除 OSPF 进程重新收敛。清理 OSPF 进程会导致该设备上的 OSPF 邻居全部重建,现网操作前需要先评估影响面。

4.2 用 ip-prefix 与协议优先级做次优路径兜底

防住了回灌,互引场景里还有一种环路之外的劣化:次优路径。R2 通过 EBGP 学到一条去往 10.0.0.0/8 的路由,同一前缀也出现在 OSPF 外部路由里(可能是对端 AS 引入的合法重分布)。华为默认优先级下 BGP 是 255,OSPF ASE 是 150,路由表会把出接口指到 OSPF 方向,即使 BGP 那条路径更短、带宽更大。这不是环路,但流量路径会绕,排障时很容易被误判为环路。

两个兜底手段。第一,用 ip-prefix 在引入方向做精细化过滤,把明确知道应该走 BGP 的前缀从 OSPF 引入列表中剔除:

# R2:拒绝从 BGP 引入 10.0.0.0/8 到 OSPF ip ip-prefix BLOCK_LOOP deny 10.0.0.0 8 greater-equal 8 less-equal 8 ip ip-prefix BLOCK_LOOP permit 0.0.0.0 0 less-equal 32 route-policy IMP_BGP_TO_OSPF deny node 5 if-match ip-prefix BLOCK_LOOP

第二,在确认整个 AS 的选路策略倾向于走 BGP 出口时,调整 BGP 路由的优先级,让它优于 OSPF 外部路由:

# R2:把 EBGP 路由优先级从 255 调低到 120,优先于 OSPF ASE 的 150 bgp 65000 preference 120 255 255

preference 命令的三个参数分别对应 EBGP、IBGP、本地引入路由。把 EBGP 调成 120 后,同一前缀在 BGP 与 OSPF ASE 之间竞争时,BGP 胜出。注意这会改变整台设备的选路基调,只影响从 BGP 学到的路由,不影响 OSPF 内部路由——OSPF 区域内优先级是 10,依然优先。这套调整要在每一台同时运行两个协议的设备上统一做,否则会出现 A 设备走 BGP、B 设备走 OSPF 的不一致。

4.3 跨域回灌:AS-Path 过滤作为最后一层保险

标记方案解决了本 AS 内部的回灌,但跨域场景还有一个补丁要打。R2 把 OSPF 路由引入 BGP 后发布给 EBGP 对端,对端 AS 引回它的 IGP,再经另一个 ASBR 把这条路由发布回本 AS 时,AS_PATH 里会带上对端 AS 号和本 AS 号。这时 BGP 的 AS-Path 防环机制能兜底但动作不够快——路由已经绕了一大圈才被识别。

更主动的做法是在 BGP 引入 OSPF 或 EBGP 入方向加一层 AS-Path 过滤,本地 AS 号一出现就直接拒绝:

# R2:AS-Path 过滤器,拒绝携带本 AS 号的路由 ip as-path-filter 1 deny ^65000_ ip as-path-filter 1 permit .* bgp 65000 peer 10.0.23.2 as-number 100 peer 10.0.23.2 route-policy BLOCK_LOCAL_AS import route-policy BLOCK_LOCAL_AS permit node 10 if-match as-path-filter 1

正则^65000_匹配以 65000 开头、后面跟空格或路径分隔符的 AS_PATH,也就是本 AS 号出现在路径首位的路由。这类路由必然经历过“本 AS 发出 → 外界绕行 → 回到本 AS”的完整闭环,没有继续收留的价值。跨域场景下这一层防线可以独立于 Tag/Community 方案存在,适合作为双机互引之外所有边界设备的通用入向策略。但要注意,在允许 AS 号重复出现在路径中(联盟场景或某些特殊多归属设计)的网络里不能用这条,会误伤合法路由。

5. 验证与排错:路由表三路对照和 LSA 递增检查

5.1 先看路由协议的三个属性:Protocol、Tag、Path

防环配置做完,验证不是看“路由通不通”,而是看“路由从哪个协议来、带什么标记、AS_PATH 是什么”。在 R2 上对目标前缀执行:

display ip routing-table 10.10.0.0 16 verbose

关注三个字段:Protocol 显示这条路由是 OSPF 还是 BGP 引入的;Tag 显示外部路由标记,如果是 300 说明它经过了 BGP 引入 OSPF 的流程;Preference 确认选路优先级是否符合预期。再交叉看 BGP 侧的来源明细:

display bgp routing-table 10.10.0.0 16 display bgp routing-table community 65000:100

第一条看 AS_PATH 和 Origin,确认路由来源是本地引入还是远端学习;第二条看有哪些前缀被打了 65000:100 的社区标记,这批路由应该是“OSPF 引入 BGP 后对外发布的合法集合”。如果发现某个前缀同时在 OSPF 和 BGP 路由表里出现,且 Protocol 字段显示两边都有,优先查 Tag 和 Community 是否匹配规划,而不是直接删路由。

5.2 定位环路的快速命令组合

现网已经出问题时,按以下顺序排查:

第一步,确定环路方向。在 R2 上分别执行 display ip routing-table protocol ospf 和 display ip routing-table protocol bgp,对比相同前缀出现在哪一侧。两侧都有,说明引入动作在生效,回灌疑似发生。

第二步,查 LSA 是否在震荡。连续执行三次 display ospf lsdb ase 目标前缀,间隔 3 秒。序列号每次都在增加,说明有设备在反复刷新这个外部 LSA,环在路上。

第三步,查谁的 Tag 和谁不一致。在 R2、R3 两台设备上分别执行 display ospf lsdb ase,对比同一 LS ID 的 Advertising Router 和 Tag 值。不一致就是标记方案没统一。

第四步,临时切断验证。在 R3 上执行 undo import-route ospf 1,观察 R2 的 BGP 表里相关前缀是否消失。消失,说明该前缀依赖 R3 的引入在维持。确认后恢复配置,再观察 LSA 序列号是否停止增长。这条命令操作的是引入关系,不影响 BGP 邻居和 OSPF 邻居本身,比 reset 类命令安全得多。

5.3 回切演练:隔离一侧后路由不抖动才算过关

防环配置的真正验收方式是故障演练。保留 R2、R3 所有配置不动,断开 R3 的 iBGP 对等体连接,或者用 shutdown 命令关闭 R3 的某个 EBGP 接口。此时 R3 收到的 EBGP 路由消失,R2 的 BGP 表不应出现任何新增前缀,OSPF 的 Type-5 LSA 序列号不应变化。然后再恢复 R3 的连接,重新观察 R2 的路由表,确认没有出现旧路由被回灌的现象。

回切后执行 display ospf peer 检查 OSPF 邻居状态回到 Full,display bgp peer 检查 iBGP 状态回到 Established,再用 ping -a 指定源地址对端到端做一次连通性测试。整个演练过程中 LSA 序列号只在拓扑变化瞬间更新一次,之后保持稳定,说明防环策略在两侧都生效。别忘了检查 R3 上 advertise-community 是否配置——Community 标记传不到对端,防环策略就是单向的,这次演练会把这个问题暴露出来。

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

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

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

立即咨询