首页 / 资讯中心 / 文章详情

思科OSPF多路访问网络DR/BDR选举配置与故障排查

思科OSPF多路访问网络DR/BDR选举配置与故障排查 ★ FEATURED ARTICLE
多路访问网络里的DR/BDR选举是OSPF里最不起眼、却最容易在割接窗口里翻车的一块。我这几年调过不少园区核心和运营商接入的OSPF域真正因为路由算法本身出问题的少大多数“邻居起不来”“路由学不全”“流量绕远路”的根子都埋在DR/BDR的选举结果和预期不一致上。这篇文章就围绕思科设备上多路访问网络的DR及BDR选举配置展开把选举规则、优先级和Router ID的配合、配置步骤、验证命令、特殊网络类型下的处理以及我踩过的坑一次讲透。不管你是刚接触OSPF、能敲几条network命令的新手还是已经做过几个项目、但对选举细节还停留在“优先级高的当DR”这种模糊认知上的老手都能从下面找到能直接抄作业的配置和排查思路。1. 多路访问网络为什么非要选DR/BDR1.1 全互联邻接的代价有多大先把问题摆出来。以太网、帧中继这类多路访问网络的特点是同一个网段里挂着的路由器彼此之间都能二层直达。如果OSPF不做任何优化让每台路由器都和同网段的其他所有路由器建立完整的邻接关系那么n台路由器就要维护n(n-1)/2条邻接。四台路由器是6条十台就是45条。每条邻接背后都是一整套Hello、数据库描述、链路状态请求、链路状态更新的交互还要各自泛洪LSA。路由器CPU和内存扛不扛得住是一回事更麻烦的是链路状态数据库的同步会变得又慢又乱任何一次拓扑变化都会在这个网段里引发大量重复的泛洪。我见过一个典型的反面场景某办公区接入层用一台三层交换机下挂八台路由器跑OSPF没做任何网络类型调整也没关注选举结果每次重启一台设备整个网段的路由收敛要接近一分钟。抓包一看八台设备两两建立Full邻接LSA泛洪在网段里反复来回。后来把网络类型和选举理顺收敛时间直接压到几秒。OSPF的解决办法很直接在这个网段里选一个“代言人”和一个“备用代言人”也就是DRDesignated Router指定路由器和BDRBackup Designated Router备份指定路由器。其余路由器叫DRother它们只和DR、BDR建立Full邻接DRother之间停留在2-Way状态不交换完整的链路状态信息。这样一来Full邻接的数量从n(n-1)/2降到2n-3泛洪的路径也从网状变成星型。1.2 DR和BDR各自承担什么活DR的核心职责是代表这个多路访问网络生成Network LSAType 2 LSA把网段里所有路由器的情况汇总成一条描述向整个区域泛洪。所有DRother把各自的链路状态更新用组播地址224.0.0.6发给DR和BDRDR再统一用224.0.0.5发给网段内所有OSPF路由器。这个组播地址的分工是很多人忽略的细节224.0.0.5是AllSPFRouters所有跑OSPF的接口都监听224.0.0.6是AllDRouters只有DR和BDR监听。DRother发更新走224.0.0.6就是为了避免网段内每台设备都收到重复的更新。BDR则是热备。它和DR一样与所有DRother建立Full邻接同步完整的链路状态数据库随时准备接管。DR一旦失效BDR在几秒内顶上重新生成Network LSA网段内的邻接关系不会断。这里有个容易被误解的点BDR不是“只备份不干活”它平时也在接收和同步所有LSA只是不生成Network LSA。所以BDR的负载并不比DR低多少规划时不能把它当成闲置资源。注意DR/BDR是“按网段、按区域”存在的概念不是按路由器存在。一台路由器有多个接口跑OSPF可能在一个网段是DR在另一个网段是DRother在第三个网段是BDR互不影响。2. 选举规则拆解优先级、Router ID与等待计时器2.1 选举的判定层级其实只有四层很多人把DR/BDR选举想得很复杂实际上规则非常干脆按顺序逐层比较一旦分出胜负就停止接口优先级范围0到255默认1。数值越大越优先。优先级为0的接口直接放弃选举资格连BDR都不当。Router ID优先级相同时Router ID数值大的胜出。只有BDR参与DR的补位DR选举先于BDR选出DR后再在剩下的有资格的路由器里选BDR。非抢占已经存在的DR/BDR不会被后来者挤掉除非它失效或者被人为清除。这个顺序里第一层优先级是最可控的也是实际工程中最常用的手段。第二层Router ID则经常被忽视默认情况下Router ID的选举顺序是手工配置的router-id优先其次是最大的Loopback接口地址最后是最大的物理接口地址。如果不手工指定很可能出现“我明明想要某台设备当DR结果它Router ID偏小优先级又和人家一样”的尴尬。我给一个实操建议只要网络里有多台设备跑OSPF就养成手工写router-id的习惯用Loopback0的地址或者规划好的整数地址比如1.1.1.1、2.2.2.2这种。这样选举结果可预测排查时也不用去翻接口地址。2.2 非抢占特性和等待计时器这是DR/BDR选举里最容易踩的两个坑。非抢占的意思是假设网段里先启动了一台优先级为1的路由器它成了DR后来启动一台优先级为100的路由器它不会把原来的DR挤下去自己只能当DRother。很多人在实验室里做完“改优先级”的实验发现show命令里DR还是老设备就以为配置没生效。其实配置是生效的只是OSPF的选举结果不会因为新设备加入而重新洗牌。要让新优先级生效必须让选举重来一次手段包括清除OSPF进程、重启接口、或者在接口下先shutdown再no shutdown。等待计时器Wait Timer则决定了选举什么时候开始。在广播网络和NBMA网络里路由器启动后不会立刻选举而是等一个等于Dead Interval的时间广播网络默认40秒NBMA默认120秒。这段时间里邻居状态停留在2-Way。等待计时器的设计意图是给网段内所有路由器一个集结的时间避免先启动的设备“抢跑”当上DR后启动的高优先级设备再引发不必要的重新选举。我在实际割接中遇到过这样的情况变更窗口里先重启了核心交换机它起来后抢成了DR二十分钟后再重启备机备机优先级更高但因为非抢占它只能当DRother。结果整个网段的流量路径和设计文档对不上。后来我们的标准做法是凡是涉及DR/BDR变更的割接所有相关设备一起重启或者干脆在变更前用clear ip ospf process把选举结果归零变更后第一时间用show ip ospf neighbor核对。3. 实操配置把DR/BDR钉在指定设备上3.1 先规划拓扑和地址再动配置我拿一个最常见的三台路由器接同一台二层交换机的场景来演示。三台设备分别叫R1、R2、R3接口都是GigabitEthernet0/0同处10.0.0.0/24网段都划进OSPF区域0。规划目标是R1当DRR2当BDRR3当DRother。为什么这么规划因为R1是性能最好的核心设备R2是它的热备R3是接入设备只负责把直连网段通告进来。这个角色划分要在配置之前就定好不要等选举完了看谁当上再补文档。地址规划如下设备接口IP地址Router IDOSPF优先级R1Gi0/010.0.0.1/241.1.1.1100R2Gi0/010.0.0.2/242.2.2.250R3Gi0/010.0.0.3/243.3.3.31这里的优先级取值是有讲究的。默认值是1R3保持默认即可。R1给100、R2给50中间留出足够的空间以后如果临时插入一台设备想让它当DR给个101就行不用把现有配置全改一遍。我不建议把优先级直接拉到255那样以后没有调整余地。3.2 接口优先级和Router ID的配置方法配置分两步全局的router-id和接口的优先级。先看R1的完整配置R1(config)# interface Loopback0 R1(config-if)# ip address 1.1.1.1 255.255.255.255 R1(config-if)# exit R1(config)# router ospf 1 R1(config-router)# router-id 1.1.1.1 R1(config-router)# network 10.0.0.0 0.0.0.255 area 0 R1(config-router)# network 1.1.1.1 0.0.0.0 area 0 R1(config-router)# exit R1(config)# interface GigabitEthernet0/0 R1(config-if)# ip address 10.0.0.1 255.255.255.0 R1(config-if)# ip ospf priority 100 R1(config-if)# no shutdownR2和R3的配置结构一样只改地址、Router ID和优先级。这里的关键命令是接口下的ip ospf priority 100它只影响该接口所在网段的选举不影响其他接口。Router ID则建议显式写在router ospf进程下别依赖自动选举。提示如果设备已经跑起来OSPF再去改router-id新值不会立刻生效必须执行clear ip ospf process并确认。改优先级也一样接口下的优先级改完现有选举结果不会自动重算。配置完成后用show ip ospf interface GigabitEthernet0/0确认优先级和网络类型R1# show ip ospf interface GigabitEthernet0/0 GigabitEthernet0/0 is up, line protocol is up Internet Address 10.0.0.1/24, Area 0 Process ID 1, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1 Transmit Delay is 1 sec, State DR, Priority 100 Designated Router (ID) 1.1.1.1, Interface address 10.0.0.1 Backup Designated router (ID) 2.2.2.2, Interface address 10.0.0.2 Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5输出里的State DR、Priority 100、Designated Router和Backup Designated Router这几行就是验证选举结果的核心。能看到Wait 40说明等待计时器等于Dead Interval这是广播网络的默认行为。3.3 用邻居表交叉验证选举结果接口视图看的是本机视角邻居表看的是全局视角两个要对照着看R1# show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface 2.2.2.2 50 FULL/BDR 00:00:36 10.0.0.2 GigabitEthernet0/0 3.3.3.3 1 FULL/DROTHER 00:00:31 10.0.0.3 GigabitEthernet0/0在R1DR上R2显示FULL/BDRR3显示FULL/DROTHER。切到R3上看会看到R1是FULL/DRR2是FULL/BDR而如果网段里还有第四台DRotherR3和它之间会是2WAY/DROTHER。这个2-Way状态是正常的不是故障很多人第一次看到就慌以为邻居没起来。我一般还会补一条show ip ospf neighbor detail把优先级、Dead Time、接口地址都列出来排查时比简表信息全。另外show ip ospf database里能看到DR生成的Network LSALSA的Link State ID就是DR接口地址这也是一种反查手段。3.4 想把某台设备排除出选举怎么办有些场景下比如一台低性能的接入路由器我们根本不想让它参与DR/BDR选举省得它占着BDR位置却扛不住泛洪。做法很简单把接口优先级设为0R3(config)# interface GigabitEthernet0/0 R3(config-if)# ip ospf priority 0优先级0意味着永远不参与选举状态固定为DRother。注意优先级0和“优先级低”是两回事优先级1的设备在DR和BDR都挂掉后还能补位优先级0的设备永远不补位。所以核心网段里不要把关键设备的优先级误设成0。4. 特殊场景NBMA、点到点网络与手工邻居4.1 帧中继NBMA下必须手工指定邻居广播网络里设备能自动发现邻居是因为Hello包走224.0.0.5组播二层天然支持广播。帧中继这类NBMA网络默认不转发广播OSPF的Hello包发不出去邻居自然起不来。思科的处理方式是把接口网络类型改成non-broadcast然后手工指定邻居R1(config)# interface Serial0/0 R1(config-if)# ip address 10.0.1.1 255.255.255.0 R1(config-if)# ip ospf network non-broadcast R1(config-if)# exit R1(config)# router ospf 1 R1(config-router)# neighbor 10.0.1.2 R1(config-router)# neighbor 10.0.1.3NBMA网络的Hello是30秒、Dead是120秒等待计时器也是120秒选举过程比广播网络慢得多。而且NBMA下DR/BDR的选举同样遵循优先级和Router ID规则但因为邻居是手工指定的一定要保证所有设备都配了邻居关系否则单向邻居会导致选举结果残缺。我在一个老帧中继项目里见过只在一端配neighbor的情况结果那台设备认为自己没有邻居选举根本不发生网段里一直没有DRNetwork LSA也生成不出来。注意NBMA网络里如果中心节点是DR分支之间要互访流量必须经过中心节点。这时DR的位置就决定了流量路径规划时要把中心节点的高优先级配好别让某个分支抢了DR。4.2 用点到点网络类型直接绕开选举如果网段里其实只有两台设备或者你根本不关心DR/BDR这套机制最省事的办法是把接口网络类型改成point-to-pointR1(config)# interface GigabitEthernet0/0 R1(config-if)# ip ospf network point-to-point改成点到点后不再有DR/BDR选举两台设备直接建立Full邻接Hello 10秒、Dead 40秒不生成Network LSA。这个做法在GRE隧道、点对点专线、以及一些云上互联场景里非常常见。我个人的习惯是只要确认网段里只有两个OSPF参与者优先用point-to-point省掉选举带来的不确定性和收敛延迟。还有一种情况是Loopback接口它默认就是point-to-point类型不受选举影响通告出去的是/32主机路由。这也是为什么Router ID常用Loopback地址稳定、不参与选举、不会因为物理接口抖动而变。4.3 广播网络里也能手工指定邻居吗可以但不推荐。广播网络下如果同时配了neighbor命令OSPF会以单播方式发送Hello但网络类型判断上仍可能按广播处理容易出现一边组播一边单播、邻居状态卡在Init的情况。除非有特殊的访问控制需求否则广播网络就让设备自动发现别手工加neighbor。5. 故障排查实录与避坑清单5.1 选举结果和预期不符按这个顺序查第一类高频问题是“我改了优先级为什么DR还是别人”。排查路径我整理成了一条线show ip ospf interface确认优先级真的改上去了别只看配置文件。确认改完之后有没有触发重新选举。没clear进程、没重启接口结果不会变。确认等待计时器是否已经走完。设备刚起来40秒内邻居还在2-Way选举没开始。确认Router ID是不是和预期一致优先级相同时它说了算。确认有没有设备优先级被误设为0直接退出了选举。第二类问题是“邻居卡在2-Way不动”。这时候先看对方是不是DRother两个DRother之间停在2-Way是正常设计。如果对方应该是DR或BDR却还是2-Way那就要查网络类型是否一致、MTU是否匹配、Hello/Dead计时器是否一致。网络类型一边是broadcast一边是point-to-point邻居能到Init但永远到不了Full这是很隐蔽的坑。第三类问题是“DR频繁切换”。常见原因是接口抖动、Dead计时器超时、或者有人反复clear进程。频繁切换会导致Network LSA反复重新生成整个区域的路由都在抖。遇到这种情况先查物理链路和接口errordisable再查有没有设备配置了相同的Router ID——Router ID冲突会导致选举结果混乱这个坑非常深。5.2 常见问题速查表现象可能原因处理办法改了优先级但DR没变非抢占特性选举未重来clear ip ospf process或重启接口邻居一直2-Way双方都是DRother正常无需处理确认角色即可邻居卡Init组播不通、ACL拦截、网络类型不一致检查ACL和ip ospf network没有DR产生NBMA未配neighbor、优先级全为0补neighbor命令检查优先级DR频繁切换链路抖动、Dead超时、Router ID冲突查物理层、查router-id唯一性路由学不全DR/BDR选举异常导致Network LSA缺失show ip ospf database核对Type 2 LSA5.3 几条用血换来的经验第一条变更前先备份选举结果。把show ip ospf neighbor和show ip ospf interface的输出存下来变更后逐行对比。别凭记忆判断“以前DR是谁”记忆在凌晨三点的机房里最不可靠。第二条优先级规划要留余量。默认1核心给100备给50这个梯度足够应付大多数调整。别用1、2、3这种紧挨着的值以后想插一台设备都没法插。第三条Router ID必须全域唯一且手工指定。自动选举的Router ID在接口地址变更后会跟着变一变就可能引发选举重算。我现在的标准模板里router-id是必填项和主机名一样属于开局配置。第四条别在业务高峰期做选举相关变更。clear ip ospf process会让整个进程重启所有邻居重建哪怕是毫秒级的抖动也可能导致短暂丢包。窗口期选在业务低谷变更后观察至少十分钟的邻居状态和路由表。第五条文档里写清楚每个网段的DR/BDR角色。这不是形式主义。我接手过一个运行了三年的网络文档里只写了“OSPF区域0”没写任何选举规划结果一次设备更换后DR跑到了一台接入设备上网段流量全部绕行查了两天才定位到原因。从那以后我的交付文档里每个多路访问网段都有一张角色表谁当DR、谁当BDR、优先级多少、Router ID多少一目了然。最后分享一个小技巧如果你不确定某次选举会是什么结果可以在实验环境里用三台虚拟路由器搭同样的拓扑把优先级和Router ID配成和生产一致先跑一遍。选举规则是确定性的实验环境的结果和生产环境不会有偏差这比在生产网上反复clear进程稳妥得多。
阅读完成 · 觉得有帮助?
咨询建站