ARTICLE DETAIL

资讯详情

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

OSPF与BGP双点重发布实战:路由引入、环路规避与策略控制

OSPF与BGP双点重发布实战:路由引入、环路规避与策略控制 1. 重发布的本质它到底在解决什么问题干了几年数通你会发现一个很残酷的现实你学过的那些单协议网络在真实项目里几乎不存在。企业网络演进到今天很少有一张网从头到尾跑一种路由协议。老设备跑OSPF新业务区跑IS-IS和运营商对接要跑BGP偶尔还夹着几段静态路由。协议之间各说各话OSPF的路由表里看不到BGP-learned的路由BGP的数据库里也不认OSPF算出的最短路径——这就是典型的协议孤岛。而HCIP里反复强调的重发布Route Redistribution也常叫路由引入本质就是给这些孤岛架桥。它的官方定义是把一种路由协议学到的路由通过另一种协议重新发布出去让全网路由可达。但我要说句实在话重发布的技术含量不在配通而在配稳。命令就那么几条真正让无数网工在面试和项目里翻车的是重发布之后的路由环路、次优路径、路由回灌、度量值错乱这些连环坑。这篇文章我想用一套基于eNSP搭建的OSPF与BGP双协议综合拓扑把重发布的完整玩法走一遍从环境搭建、双点重发布的核心配置到路由控制策略的落地再到故障排查的思路。不是教你怎么敲命令应付HCIP考试而是让这些命令在真实网络里能站得住脚。先说清楚重发布的两个适用层次这也是HCIP考试和实际项目最大的分水岭协议边界对接比如OSPF区域和BGP自治系统之间交换路由。这种场景下重发布通常是单向的、有明确边界的配置相对简单。协议冗余互备比如两个AS之间跑了两条链路各跑各的协议需要双向重发布来实现冗余。这种场景下路由环路和次优路径几乎必然出现必须配合路由过滤和优先级调整才能收场。说白了重发布就像两个国家之间的海关。单向放行容易双向放行且保证货物路由不回流、不走冤枉路才是真正见功底的地方。HCIP的考试重点恰恰全压在后者。2. 环境准备eNSP拓扑搭建与地址规划的底层逻辑先把拓扑说清楚。我用的eNSP版本是V1.3搭载了AR2220路由器和S5700交换机。整体拓扑分三个区域AS 100运行OSPF包含R1、R2、R3三台路由器。AS 200运行BGP包含R4、R5两台路由器。AS 300运行BGP包含R6一台路由器模拟外部自治系统。关键连接关系如下设备接口对端设备接口网段所属协议R1GE0/0/0R2GE0/0/010.0.12.0/24OSPF Area 0R1GE0/0/1R3GE0/0/010.0.13.0/24OSPF Area 0R2GE0/0/1R3GE0/0/110.0.23.0/24OSPF Area 0R2GE0/0/2R4GE0/0/010.0.24.0/24重发布边界OSPF↔BGPR3GE0/0/2R5GE0/0/010.0.35.0/24重发布边界OSPF↔BGPR4GE0/0/1R5GE0/0/110.0.45.0/24BGP IBGPR4GE0/0/2R6GE0/0/010.0.46.0/24BGP EBGPR5GE0/0/2R6GE0/0/110.0.56.0/24BGP EBGPLoopback地址R1是1.1.1.1/32R2是2.2.2.2/32R3是3.3.3.3/32R4是4.4.4.4/32R5是5.5.5.5/32R6是6.6.6.6/32。为什么这套拓扑能覆盖HCIP重发布的绝大多数考点我看重三点第一它制造了双点重发布的经典场景。R2和R3同时作为OSPF与BGP的边界路由设备这就是双点重发布。双点意味着流量天然存在两条路径环路和次优路径问题必然出现做路由控制的必要性就体现出来了。第二它把IGP和EGP的差异同时摆上台面。OSPF是链路状态协议计算的是costBGP是路径向量协议拿手的是AS_Path和Local_Pref。两者之间的度量值体系完全不同重发布时如何翻译度量值正是HCIP考的细节。第三它保留了外部自治系统AS 300。有了EBGP邻居关系才能测试路由过滤、AS_Path控制这些BGP特有的路由控制手段这些在真实项目里比OSPF内部的cost调优频繁得多。地址规划的细节很多人忽略但我要多说一句互联地址和Loopback地址的规范程度直接决定你后续排查的效率。10.0.XY.0/24这种X-Y互联的编址方式看一眼路由表就知道哪条链路是R2到R4还是R3到R5不用每次抓包去猜。Loopback地址用X.X.X.X/32也方便在BGP里用network命令逐条发布。别小看这些细节真实项目里地址乱成一锅粥导致排障三天三夜的例子我见过太多了。3. OSPF与BGP真实路由的对接核心配置实操3.1 首先把底层协议跑起来在配置重发布之前必须保证每个协议域内部是通的。这个顺序别搞反了——很多新手上来就直接配重发布结果底层的OSPF邻居和BGP邻居都没起来排错半天发现是hello报文被防火墙挡了这就是典型的白费功夫。OSPF配置部分以R1为例sys sysname R1 interface GigabitEthernet0/0/0 ip address 10.0.12.1 255.255.255.0 interface GigabitEthernet0/0/1 ip address 10.0.13.1 255.255.255.0 interface LoopBack0 ip address 1.1.1.1 32 quit ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.0.12.0 0.0.0.255 network 10.0.13.0 0.0.0.255 network 1.1.1.1 0.0.0.0R2和R3的OSPF配置类似多用一条network命令宣告10.0.23.0/24即可。这里不展开每个设备的完整配置但要强调一点router-id必须全局唯一这是OSPF和BGP共同的铁律。如果R1的router-id误配成了2.2.2.2那R2建立邻居时会直接冲突OSPF会通过选举机制保留router-id大的那个看似通了实际邻居关系里的身份是错的后续用display ospf peer查看会一脸懵。BGP部分以R4为例bgp 200 router-id 4.4.4.4 peer 10.0.45.5 as-number 200 peer 10.0.46.6 as-number 300 ipv4-family unicast peer 10.0.45.5 enable peer 10.0.46.6 enableIBGP邻居R4和R5之间按HCIP标准做法还需要配置Loopback作为更新源bgp 200 peer 5.5.5.5 as-number 200 peer 5.5.5.5 connect-interface LoopBack0 ipv4-family unicast peer 5.5.5.5 enable这里注意iBGP邻居用Loopback地址建立是为了不依赖直连接口。如果直连链路闪断Loopback地址只要路由可达BGP会话不会中断。当然前提是R4和R5之间通过OSPF能学到彼此的Loopback路由所以OSPF里必须宣告4.4.4.4和5.5.5.5。3.2 重发布配置主动发布与被动引入配置完底层协议后重发布正式开始。这里分两个方向方向一把OSPF路由引入BGP被动引入在R4上执行bgp 200 ipv4-family unicast import-route ospf 1这条命令把OSPF 1进程学习到的所有路由引入BGP。注意这里说的是学习到的所有路由包括OSPF自身产生的区域内路由、区域间路由以及OSPF从外部引入的静态路由和直连路由。换句话说只要OSPF路由表里有BGP就能引。方向二把BGP路由引入OSPF作为外部路由发布在R4上执行ospf 1 import-route bgp这条命令把BGP路由表里的路由引入OSPF引入后会以Type 5ASE外部路由的形式在OSPF域内泛洪。默认情况下引入的度量值为1度量类型为Type 2不累加内部cost。至此R2和R4之间的单向通道就打通了。但这只是能通远没到稳的程度。为什么因为双点重发布的情况下R3和R5那条链路也在做同样的事两边同时互相发布路由环路和次优路径很快就会冒头。3.3 核心参数背后的为什么如果你只看命令会觉得重发布太简单了三行就能配完。但HCIP考试真正考的是你对参数的理解。我挑三个最关键的讲透第一OSPF引入外部路由的默认度量值。在华为设备上import-route bgp默认度量值是1类型是Type 2。这意味着整个OSPF域内所有路由器看到这条外部路由的cost都是1不管它距离边界路由器有多远。这在多数场景下是灾难性的——OSPF域内的路由器会倾向于把所有去外部网络的流量都扔给最近的边界路由器哪怕那条路径的物理带宽已经饱和。真实项目里这一步几乎必加cost参数手动指定一个合理值。第二BGP引入OSPF路由时的默认优先级。BGP路由的PrefVal和Local_Pref默认都是0MED值继承OSPF的cost。这意味着BGP选路时完全没有考虑OSPF域内的cost差异。R4从OSPF学到的10.0.12.0/24这条路由cost是1R5从OSPF学到的同一条路由cost也是1如果走相同跳数。那BGP怎么选按Router-ID大小选这就纯粹是运气了。路由控制策略的价值就在这里。第三防环机制的本质。OSPF和BGP各有各的防环机制。OSPF靠区域划分和SPF算法保证域内无环但对域外引入的路由它靠的是水平分割原则——从某区域引入的路由不会再被该区域的其他ABR重新引入回原区域。BGP靠AS_Path属性凡是从IBGP学到的路由绝不允许再传给其他IBGP邻居这就是IBGP的水平分割。重发布打破了两者的安全边界防环机制在某些路径上会失效这也就是为什么双点重发布必然伴随路由回灌。4. 双点重发布的环路与次优路径绕不开的深坑双点重发布即两台边界路由器同时做OSPF↔BGP双向引入是HCIP考试的重灾区也是真实项目的噩梦。我先把问题发生的过程完整走一遍然后说解决方案。4.1 环路是怎么被制造出来的假设R2和R3都执行了双向重发布配置如下以R2为例ospf 1 import-route bgp // 把BGP路由引入OSPF bgp 200 ipv4-family unicast import-route ospf 1 // 把OSPF路由引入BGPR3做同样的配置。第一轮发布后R2把OSPF学到的路由包括从R1、R3学到的内部路由全部引入BGPR3同理。这些路由进入BGP后会通过IBGP邻居互相传递。第二轮发布时R2从BGP又把这些路由引入OSPF——请注意这些路由本来就是OSPF产生的现在被BGP绕了一圈又回到了OSPF路由表里。路由回灌就此发生。具体到转发层面最典型的环路是这么形成的R1把去往10.0.46.0/24R4和R6之间的网段的流量发给R2因为R2是Area 0内部的OSPF边界路由器。R2的路由表里10.0.46.0/24是从BGP引入OSPF的外部路由下一跳是R4。但R4的路由表里10.0.46.0/24的下一跳是直连接口这没问题。问题出在另一条路由上——10.0.46.0/24如果也被R3引入了OSPFR2从OSPF学到的可能是经过R3的路径下一跳是R3而R3从OSPF学到的可能是经过R2的路径下一跳是R2。R2和R3互相把对方当下一跳流量就在两台路由器之间反复横跳直到TTL耗尽。用一条命令就能验证环路display ip routing-table 10.0.46.0 24如果在R2上看到下一跳是R3而R3上看到下一跳是R2环路条件成立。4.2 次优路径的隐蔽陷阱环路是最极端的情况更多时候双点重发布带来的是次优路径——路由能通但走的不是最短路径。举个例子R6通告一条BGP路由10.0.66.0/24Loopback。R4和R5都会从EBGP学到它然后通过IBGP互传。此时R4把10.0.66.0/24引入OSPFR2和R3都会学到这条外部路由。R5也把10.0.66.0/24引入OSPFR2和R3同样会学到。问题来了R2收到两条去往10.0.66.0/24的OSPF外部路由一条来自R4cost1内部cost一条来自R5cost1内部cost。OSPF Type 2外部路由只比较外部cost不比较内部cost所以两条路由的cost完全相同OSPF只能靠负载均衡或者先到先得。但真实情况是R2访问10.0.66.0/24最优路径是R2→R4→R6因为R2和R4是直连。如果路由表把下一跳指向了R5流量就得绕道R2→R3→R5→R6多走一跳物理链路。这条路是通的但是绕了远路这就是次优路径。HCIP的隐藏考点就在这里双点重发布的核心矛盾是路由可达和路由最优之间的博弈。考试不会直接问你怎么配重发布而是给你一个双点重发布的拓扑让你分析为什么会出现次优路径然后让你写策略解决它。4.3 解决思路路由过滤 优先级调整解决双点重发布的路由回灌和次优路径业界标准方案是一边完全过滤另一边设置高优先级。具体到这套拓扑我采用的方式是在R2上把从BGP学到的OSPF路由即被BGP绕了一圈回来的内部路由过滤掉不允许再引入OSPF。用ip-prefixroute-policy实现。ip ip-prefix OSPF_INTERNAL permit 10.0.0.0 8 less-equal 24 ip ip-prefix OSPF_INTERNAL permit 1.1.1.1 32 ip ip-prefix OSPF_INTERNAL permit 2.2.2.2 32 ip ip-prefix OSPF_INTERNAL permit 3.3.3.3 32 route-policy FILTER_OSPF deny node 10 if-match ip-prefix OSPF_INTERNAL route-policy FILTER_OSPF permit node 20然后在BGP引入OSPF路由时调用bgp 200 ipv4-family unicast import-route ospf 1 route-policy FILTER_OSPF这段配置的意思是BGP引入OSPF路由时凡是匹配到OSPF内部路由前缀10.0.0.0/8范围内的、以及三台Loopback的全部拒绝。剩下的非内部路由比如引入的静态路由、外部直连路由才允许进入BGP。这样BGP里就不会再出现OSPF内部路由的副本第二轮引入时自然就不会回灌了。在R3上做对称但方向不同的操作。R3也要过滤OSPF内部路由同时还要配合优先级调整确保去往外部网络的流量优先走R2这条路径。ospf 1 import-route bgp cost 10 type 2把R3引入BGP路由时的cost调高到10R2保持默认cost 1。这样OSPF域内路由器比较两条外部路由时R2引入的那条cost更低自然成为首选。R3引入的那条作为备份路径留着一旦R2和R4之间的链路断了OSPF会自动切换到R3这条路径业务不中断。提示过滤和优先级调整要成对出现只做一边不做的后果更严重。只过滤不调优先级次优路径还在只调优先级不过滤路由回灌依然存在只是被高优先级掩盖了一旦高优先级路径抖动回灌的旧路由会立刻变成活动路由。5. BGP Route Control用路由策略掌控路径选择重发布打通只是第一步真正决定网络质量的是BGP层面的路由控制。HCIP对BGP路由控制的要求概括起来就是一句话用策略控制学什么、传什么、选哪条。我在这套拓扑里实践了三种最常用的控制手段。5.1 用Route-Policy控制路由发布以R4为例假设我只想把R6发来的外部路由中前缀以172.16开头的通告给IBGP邻居R5其余忽略。用Route-Policy可以精确到前缀、掩码长度、甚至AS_Path属性。ip ip-prefix EXTERNAL permit 172.16.0.0 16 less-equal 32 route-policy PERMIT_EXTERNAL permit node 10 if-match ip-prefix EXTERNAL route-policy PERMIT_EXTERNAL deny node 20 bgp 200 peer 5.5.5.5 route-policy PERMIT_EXTERNAL export这段配置的意图R4向R5通告路由时调用PERMIT_EXTERNAL策略先匹配172.16.0.0/16范围内的前缀允许其他前缀全部被deny。注意BGP的route-policy export是在路由发送时才生效不影响本地BGP表。如果是控制从邻居学习的路由用import方向bgp 200 peer 10.0.46.6 route-policy FILTER_IN import5.2 用AS_Path属性引导选路AS_Path是BGP最核心的选路属性之一。HCIP里最常考的一个场景R4和R5同时从R6学到同一条外部路由怎么让R4优先生效R6通告路由时AS_Path长度是1AS 300。R4从EBGP学到后AS_Path仍为1。R4向R5传递时AS_Path不变iBGP不追加AS号。所以R5从R4学到的路由AS_Path为1R5从EBGP直连R6学到的路由AS_Path也为1。两个来源AS_Path一样长BGP会继续比较MED、Local_Pref等属性选择结果不确定。要在R5上明确让R4传来的路由优先可以给R4传来的路由手动追加AS_Pathroute-policy ADD_ASPATH permit node 10 apply as-path 400 400 400 400 bgp 200 peer 4.4.4.4 route-policy ADD_ASPATH importAS_Path从1变成了1 400 400 400 400长度5BGP选路时AS_Path更短的是R5直连R6的EBGP路由AS_Path更长的R4路径被自动冷落。反过来如果我想让R4传来的路径成为优选备份路径更短的情况下可以用apply as-path none清除AS_Path或者在R6通告的路由上追加AS_Path让EBGP路径变长。方向不同手段相同核心原理就是通过操纵AS_Path长度来影响BGP决策。5.3 用MED值实现细粒度路径控制MEDMulti-Exit Discriminator只在同一个AS的多个入口之间比较是BGP选路里很实用的工具。拓扑里R4和R5同属AS 200它们从AS 300的R6学到同一条路由时可以通过设置不同的MED值引导R4入口优先。在R6上通告给R4的路由设置MED为50通告给R5的路由设置MED为100route-policy SET_MED permit node 10 apply med 50 bgp 300 peer 10.0.46.4 route-policy SET_MED exportR5那边同理apply med 100。这样AS 200内的路由器会比较MEDMED小的R4通告的50优先。注意MED比较的前提是AS_Path长度相同且Local_Pref相同所以在设置MED前先理清BGP选路顺序最大Local_Pref → 最短AS_Path → 最优MED → 优选EBGP → IGP cost小者。HCIP考试里BGP选路顺序几乎是必考题我建议背下来实际项目排障也靠它。只要你能说清楚流量为什么走了这条路就掌握了BGP路由控制的核心能力。6. 实测验证与故障排查从路由表到数据转发的全链路配置全部完成后真正的考验来了验证链路是否正常、是否存在环路或次优路径。这里给你一套完整的排查方法论。6.1 验证协议邻居状态首先确认所有协议邻居都处于Established状态display ospf peer // 查看OSPF邻居 display bgp peer // 查看BGP邻居正常输出应该包含OSPF Process 1 with Router ID 2.2.2.2 Neighbors Interface: GigabitEthernet0/0/0 Neighbor ID: 1.1.1.1, Address: 10.0.12.1 State: Full Mode: Nbr is Slave Priority: 1BGP邻居状态是Established如果显示Active说明TCP连接建立有问题通常是地址或AS号配错。6.2 验证核心路由条目重发布是否生效直接看路由表display ip routing-table 10.0.66.0 24在R2上期望看到一条通过OSPF引入的外部路由类型为O_ASE下一跳为10.0.46.4去往R4的路径。同时在R4上看到BGP路由10.0.66.0/24来自10.0.46.6EBGP邻居R6。再查看BGP路由表确认AS_Path和MED值display bgp routing-table 10.0.66.0 24重点关注输出里的Path/Ogn字段。比如300?代表AS_Path为300i代表起源属性为IGP。6.3 常见故障的逐层排查我在实验里故意制造了几类故障逐个说排查思路故障一OSPF和BGP邻居都正常但R2学不到10.0.66.0/24的路由排查链路在R4上执行display bgp routing-table 10.0.66.0 24确认R4的BGP表里有这条路由。如果R4没有检查R4和R6之间的EBGP邻居是否Established。如果R4有检查R4向OSPF引入时是否被route-policy过滤了执行display route-policy确认策略逻辑。还有一种隐蔽可能10.0.66.0/24被OSPF域内已有路由覆盖display ip routing-table看到的是域内路由BGP引入的路由因为优先级低被隐藏了。查看display ip routing-table protocol ospf能看到O_ASE条目是否存在。故障二R2上能看到10.0.66.0/24但下一跳指向R3而非R4这就是典型的次优路径。排查方法在R2上执行display ospf routing-table 10.0.66.0 24看两条O_ASE路由的cost分别是多少。如果两条cost相同说明R3引入时没有调高cost或者R2的OSPF做了负载均衡。在R3上检查import-route bgp是否带了cost 10 type 2参数。故障三全网路由表都在但ping不通这大概率是环路。用tracert跟踪路径tracert -a 2.2.2.2 10.0.66.6如果第二跳是R3第三跳又回到R2说明R2和R3之间路由回灌形成了转发环路。解决方法回到第4章的过滤策略把OSPF内部路由从BGP引入路径上彻底过滤掉。6.4 用display current-configuration做最终复核配置全部完成后我习惯用display current-configuration把所有关键配置导出来复核一遍。重点确认三件事重发布命令存在且方向正确import-route bgp在OSPF进程下import-route ospf 1在BGP视图下。路由策略被正确调用route-policy后面跟的名字必须在ip ip-prefix和route-policy定义中存在且被peer或import-route正确引用。AS号没配错R4的BGP AS号是200R5也是200R6是300。如果R5误配成300EBGP邻居会变成iBGP邻居路由学习会彻底混乱。7. 我在HCIP备考与项目实践中的几点体会最后说几句掏心窝子的话。HCIP的重发布考点很多人在练习时能配通但真到项目里就抓瞎原因往往不是命令不会而是对路由协议的信任边界没有概念。第一重发布永远要带着业务影响评估来做。生产环境里一条import-route命令发下去影响的不是一个路由器而是整个OSPF域的所有路由器。所有设备同时收到大量外部路由CPU和内存监控曲线会瞬间拉高。我习惯在变更窗口前先写好回退预案——把import-route改成undo import-route就能回退但前提是你要知道这条命令在哪些设备上配的回退顺序是什么。第二路由过滤策略宁缺毋滥。我在真实项目里见过有人用ACL做重发布过滤前缀列表写了整整一百行最后导致某条业务路由被误过滤全网瘫痪。过滤的关键是要先精确放行再默认拒绝而不是先默认放行再逐个阻断。前者的安全边界是闭环的后者的漏洞是无穷的。第三eNSP模拟器和真实设备的差异一定心里有数。模拟器里路由收敛是即时的真实设备的BGP收敛可能要几十秒甚至几分钟。在模拟器上怎么配置都行的方案拿到真机上不一定能经得住路由震荡的考验。所以HCIP考试过了只是起点项目的复杂度和随机性永远比考试题高一个量级。如果你正在备考HCIP这套拓扑建议你亲手敲一遍尤其是双点重发布的过滤策略和BGP的MED控制。不要只满足于能ping通要试着制造故障再排障那才是真正长本事的过程。重发布这条路配通只是及格配稳才是优秀。希望这篇分享能让你少走几个月的弯路。
返回列表