ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OSPF动态路由详解:从原理到H3C配置实战

OSPF动态路由详解:从原理到H3C配置实战 我们组前阵子接了一个三十多台设备的中型园区网络改造核心交换和接入全部要启用动态路由。刚把需求发到群里的时候就有同事问用静态路由多简单干嘛非要上OSPF。我没直接回答而是把之前画的一张拓扑图扔了过去。那张图上接入层、汇聚层、核心层到处都是明细路由如果全用静态光书写和排错工作量就能把人逼疯。换成OSPF之后链路状态自动同步、路由自动计算新增一个网段只需要在接口上声明一下剩下的事交给协议就行。今天这篇就把OSPF动态路由基础讲透从选型逻辑、核心机制到H3C设备上的实际操作再到特殊区域和常见排错一次说清楚。先提醒一句网上搜“动态路由”有时候会蹦出来前端框架里的“vue动态路由”那是完全不相干的东西。这里说的动态路由是网络设备之间自动交换路由信息、算出转发路径的一套协议机制OSPF就是其中最典型的代表。这篇文章的目标读者是刚接触网络协议、准备考认证或者正在做网络割接的工程师内容从原理到命令都会覆盖到照着配置是能直接落地的。1. 为什么是OSPF从静态路由到链路状态协议的选型逻辑1.1 三种路由方案的真实对比做网络规划的时候第一道选择题就是“用静态还是用动态”。静态路由的优点是配置简单不占用设备CPU只要拓扑不变它就稳定地待在路由表里。但是静态路由有个天然的短板它不会自己适应网络变化。一条链路断了静态路由不会自动切到备用路径除非你提前写了浮动静默路由否则业务就断了。RIP是动态路由里最古老的一种基于距离矢量算法只知道自己到目标网段有多远、该从哪个方向走根本不知道整张网的拓扑。RIP的跳数上限是15跳第16跳就不可达收敛速度又慢在稍微大一点的网络里根本扛不住。现在很少有人在新建项目里选择RIP了除非是一些老旧的设备互联场景。OSPF属于链路状态协议跟RIP的思路完全不同。它的工作方式是让每台路由器把自己“看到了哪些直连网段、和哪些邻居相连”这些信息做成链路状态通告LSA在整个区域内泛洪最终区域内每台路由器都拿到一份完整的链路状态数据库LSDB。拿到LSDB之后每台设备都会以自己为根节点运行SPF算法算出一棵无环的转发树来。这个机制的含金量在于真正做到了“全网信息共享各自独立计算”。没有逐跳传递的累积误差也没有因为路由互相学习产生的环路风险。相比RIP那套“听邻居说”的模式OSPF是“自己会看地图”。1.2 OSPF到底解决了什么问题OSPF能成为现在园区网和城域网的主流IGP靠的不是一个点而是一整套设计快速收敛链路状态变化以后LSA会立即泛洪触发SPF重新计算。配上BFD检测的话秒级甚至毫秒级就能完成切换。这在核心链路上断电或者光模块被拔掉的时候体现得非常明显。无环路设计SPF算法天然生成无环路径。区域内部不存在路由环路问题这也是链路状态协议对比距离矢量协议最大的底气。分层架构通过划分区域Area把网络分成一个个局部范围LSA泛洪被限制在区域内核心区域的路由计算压力大大降低。这解决的是“网络规模一大所有路由器的CPU和内存都扛不住”的问题。等价负载分担如果去往同一目标网段存在两条等价的路径OSPF默认会同时使用这两条路径做负载分担链路利用率提升很多。实际使用中最直观的感受是OSPF把网络工程师从“逐条配路由”里解放了出来。你只需要把接口加进OSPF进程路由器就会自动学习该接口所在网段并告诉全网。新增设备、新增网段这类日常操作工作量骤减。1.3 OSPF的版本与使用场景目前生产环境里IPv4网络用的是OSPFv2IPv6网络用OSPFv3。v3的机制和v2基本一致区别主要在于v3的协议报文里不再携带IP地址信息变为纯链路状态机制认证方式也不一样了。国内绝大多数企业网、政务网、校园网用的都是OSPFv2。什么规模的网络适合上OSPF我的经验是只要有三层设备互连、路由条目超过二十条、拓扑存在冗余链路就应该考虑OSPF。如果只是一个很小、拓扑简单固定的分支静态路由还能省心但凡是未来要扩容、要加设备、要做冗余的场景早早上OSPF一定比后期被动迁移便宜得多。2. 动手之前先懂这些OSPF的核心概念与协议机制2.1 Router-ID一台设备在OSPF世界里的身份证Router-ID是一个32位的数字相当于设备在OSPF网络中的唯一标识。所有邻居关系、路由计算都围绕着Router-ID展开每台设备必须有一个全网唯一的Router-ID否则后加入的设备会被当成重复Router-ID的设备邻居关系直接建立不起来。Router-ID的选取规则有优先级顺序。在手工配置了router id命令的情况下以手工配置为准如果没有手工配置则选择LoopBack接口上数值最大的IP地址如果也没有LoopBack接口就选择物理接口上数值最大的IP地址。强烈建议在全网规划阶段就统一分配Router-ID比如核心设备规划为1.1.1.1、2.2.2.2汇聚设备规划为10.1.1.1、10.2.2.2这样的规律值。这样发生问题的时候看一眼OSPF邻居表就能快速定位是哪台设备出了问题。热词里提到的“ospf 1 router-id 1.1.1.1”就是这个用法把路由器身份固定下来不依赖接口地址踩坑概率会低很多。2.2 邻居关系与邻接关系建立的完整过程OSPF启动以后路由器会在启用了OSPF的接口上周期性发送Hello报文用来发现和维持邻居关系。Hello报文里携带了Router-ID、Hello间隔、Dead间隔、区域ID、认证信息等关键参数。两端参数一致才能进入下一步。邻居关系的建立过程可以理解为一次“对象确认”的交流Down初始状态没收到对端的任何报文。Init收到了对方的Hello报文但对方还没有在它的Hello报文里看到自己。2-Way双方都在对端报文里看到了自己的Router-ID双向通信确认邻居关系建立成功。ExStart开始协商主从关系确定DD报文的序列号。Exchange双方交换链路状态摘要信息也就是各自的LSA目录用来比对双方数据库的差异。Loading发现自己缺哪些LSA就向对方发送LSR请求对方回复LSU然后返回LS Ack确认。Full链路状态数据库同步完成两台路由器之间建立起完全的邻接关系。这里有一个很重要的概念区分邻居Neighbor和邻接Adjacency不是一回事。在广播型网络中一台路由器可以和很多路由器形成邻居关系但不会和所有邻居都形成Full邻接关系只有DR和BDR会与所有路由器建立Full邻接普通路由器之间只停留在2-Way状态不直接交换LSA。这是减少网络中LSA泛洪量的关键设计。2.3 DR/BDR选举广播型网络里的“发言人”机制在以太网这种多路访问MA网络里如果所有路由器两两之间都建立Full邻接关系并直接交换LSA那链路状态通告的数量会呈平方级增长网络根本吃不消。OSPF的解决办法是选举DR指定路由器和BDR备用指定路由器。选举规则是接口优先级默认为1数值大的当选优先级相同的情况下Router-ID数值大的当选。DR和BDR选举出来以后所有路由器只和DR、BDR建立Full邻接关系其他路由器之间保持2-Way状态然后由DR负责把收到的LSA转发给全网其他路由器。这里有个极其常见的坑DR/BDR的选举是非抢占的。也就是说网络中已经存在DR的情况下即使后来加入一台优先级更高、Router-ID更大的新设备它也不会接管DR的角色。DR只有在故障或者手动重置OSPF进程后才会重新选举。所以想通过提高优先级指定某台设备成为DR必须在初始化阶段就配置好否则就要执行reset ospf process让选举重新发生。考虑到实际业务建议把核心设备设置为较高优先级比如100把接入设备保持默认优先级或设置为0优先级为0的设备不参与选举永远当不了DR避免因为DR落在性能较弱的设备上导致整网LSA转发延迟。2.4 区域与ABR/ASBR网络分治设计的核心OSPF的设计精髓在区域划分。区域0是骨干区域所有非骨干区域必须与骨干区域直接相连。区域间的路由传递必须经过骨干区域不允许非骨干区域之间直接传路由这是OSPF的一条铁律违反了它就会出现路由黑洞。连接不同区域的路由器叫ABR区域边界路由器ABR可以同时属于多个区域为每个区域维护一份独立的链路状态数据库负责把区域间的路由信息汇总之后传给其他区域。热词里反复出现的“ospf abr”指的就是这种角色。ASBR自治系统边界路由器是那些把外部路由比如静态路由、其他协议的路由引入OSPF的设备。ASBR生成Type 5类LSA向全网宣告外部路由。注意ABR和ASBR是两个不同的概念一台设备可以同时是ABR和ASBR但逻辑上别混为一谈。区域划分的实际价值体现在链路状态数据库的规模控制上。如果不分区域全网所有路由器都要保存所有LSA运行SPF计算的时候CPU消耗极大。分成多个区域以后区域内的变化在内部消化只有汇总路由会以Type 3类LSA的形式传给其他区域网络的可扩展性一下就上来了。3. H3C设备上的OSPF基础配置实操3.1 配置前的准备与地址规划动手配OSPF之前先把地址规划和Router-ID规划做好。我一般会在规划表里明确每台设备的Router-ID、LoopBack地址、互联网段、所属区域尽量避免在现场“边配边想”。以一个典型的双核心加汇聚加接入拓扑为例地址规划可以这样设计设备Router-ID用途所属区域核心A1.1.1.1核心层Area 0核心B2.2.2.2核心层Area 0汇聚A3.3.3.3汇聚层Area 1汇聚B4.4.4.4汇聚层Area 2核心设备之间跑OSPF所有汇聚设备上联到核心分别规划进不同的非骨干区域。如果网络规模不大设备数量少于十台也可以全部放在Area 0里面配置最简单管理也方便。只有设备数量多、拓扑路数复杂的时候才需要认真做多区域设计。3.2 单区域OSPF配置全流程在H3C设备上配置OSPF最传统的方式是进入OSPF进程通过network命令宣告网段。下面是一个核心交换机的配置片段H3C system-view [H3C] router id 1.1.1.1 [H3C] ospf 1 router-id 1.1.1.1 [H3C-ospf-1] area 0 [H3C-ospf-1-area-0.0.0.0] network 10.0.12.0 0.0.0.255 [H3C-ospf-1-area-0.0.0.0] network 10.0.13.0 0.0.0.255 [H3C-ospf-1-area-0.0.0.0] network 10.1.1.1 0.0.0.0 [H3C-ospf-1-area-0.0.0.0] quit [H3C-ospf-1] quit需要特别注意的是network配置里使用的是通配符掩码不是子网掩码。通配符掩码就是子网掩码按位取反比如255.255.255.255对应0.0.0.0。宣告的时候应该精确匹配比如某个地址是10.1.1.1/32就写network 10.1.1.1 0.0.0.0这样OSPF只会把这条32位的主机路由宣告出去避免误合并网段。在新版本的Comware系统里还有一种更推荐的方式就是在接口视图下直接启用OSPF[H3C] interface GigabitEthernet0/0/1 [H3C-GigabitEthernet0/0/1] ospf enable 1 area 0这种方式的好处是配置意图非常清晰一眼就能看出哪个接口加了哪个区域不容易出现宣告范围过大的问题。两种写法二选一即可个人建议维护性优先的网段用network方式接口少的小分支用接口方式更省事。3.3 多区域配置与区域间路由传递网络规模变大之后就要考虑多区域了。下面演示一下汇聚设备接入Area 1的配置这台设备同时连接核心区域属于ABRH3C system-view [H3C] router id 3.3.3.3 [H3C] ospf 1 router-id 3.3.3.3 [H3C-ospf-1] area 0 [H3C-ospf-1-area-0.0.0.0] network 10.0.13.0 0.0.0.255 [H3C-ospf-1-area-0.0.0.0] quit [H3C-ospf-1] area 1 [H3C-ospf-1-area-0.0.0.1] network 10.1.3.0 0.0.0.255 [H3C-ospf-1-area-0.0.0.1] network 192.168.10.0 0.0.0.255 [H3C-ospf-1-area-0.0.0.1] quitABR同时维护Area 0和Area 1两份链路状态数据库然后生成Type 3类LSASummary LSA把Area 1学习到的路由汇总传递给Area 0同时也把Area 0的路由以Type 3形式传递给Area 1。配置完成后全网的路由信息就会自动同步。需要注意骨干区域的连通性。如果汇聚设备无法直接和核心设备互连而是绕了某台设备那就需要在中间设备上配置虚链路vlink但我强烈建议不要在生产环境里用虚链路去解决骨干不连续的问题。虚链路是“补救措施”不是“设计方案”一旦中间的设备震荡整条虚链路都会受到牵连。正确做法是调整物理拓扑保证所有区域都直接连接到Area 0。3.4 验证与排错命令速查配置完成后先看OSPF邻居状态display ospf peer正常情况下应该看到邻居状态为Full。如果看到其他状态就要逐项排查。接着看OSPF路由表display ospf routing再看设备上的全局路由表display ip routing-table想确认LSDB里面的LSA类型和数量可以用display ospf lsdb这三条命令是日常巡检和排错最常用的组合。我个人的习惯是配置完以后先看peer确认邻居全Full再看routing表确认关键网段的路由都进来了顺序不要颠倒因为邻居关系是路由学习的前提。4. OSPF特殊区域路由的理解与配置4.1 为什么要设计特殊区域区域划分解决了规模问题但没完全解决末端区域的问题。比如一个分支机构的汇聚设备下面挂着一堆接入网段这个区域只需要一条“去往骨干网”的默认路由根本不需要知道骨干区域里每个网段的细节也不需要知道外部引入的那些路由条目。如果把这些信息全部塞给末端区域会造成两个后果一是LSDB规模变大每台设备都要保存并泛洪大量LSA内存和CPU开销上去了二是网络变化时末端区域内的设备也要跟着做SPF重算骨干区域的震荡会被放大到这个区域里。特殊区域的作用就是把这个“什么都不需要知道”的末端区域的路由信息精简掉。特殊区域的本质是用少量汇总信息换取区域内LSDB的大幅缩减。特殊区域分为Stub、Totally Stub、NSSA、Totally NSSA四类下面逐个说清楚。4.2 Stub区域与Totally Stub区域Stub区域是配置最简单的特殊区域。Stub区域禁止接收Type 4ASBR Summary LSA和Type 5AS External LSA类LSA区域内的设备不再收到外部引入的路由明细只保留一条由ABR生成的Type 3默认路由指向骨干区域出口。在H3C设备上Stub区域的配置是区域视图下执行一条命令[H3C-ospf-1] area 1 [H3C-ospf-1-area-0.0.0.1] stub注意Stub区域内的所有路由器都必须配置这条命令有一台漏配该设备就无法与区域内的其他设备正常建立邻居关系。Totally Stub区域在Stub的基础上更进一步不仅过滤外部路由还过滤区域间的Type 3路由只保留一条默认路由。这样区域内的路由表就变得极其精简。配置上在ABR上做如下处理[H3C-ospf-1] area 1 [H3C-ospf-1-area-0.0.0.1] stub no-summaryno-summary就是“不向该区域发送Type 3汇总路由”的关键。区域内其他设备保持stub配置不变。这种方式的核心优势是路由表精简、网络行为可预期非常适合作终端接入区域。4.3 NSSA区域与Totally NSSA区域Stub区域有个限制区域内不允许存在ASBR也就是说不能把外部路由引入进来。但现实中有些末端区域确实需要引入一些外部路由比如分支机构有一条到专线的静态路由需要重分发进OSPF让全网知道。NSSA区域就是为了解决这个矛盾而设计的。NSSA区域允许配置ASBR该区域内的外部路由以Type 7 LSA的形式在区域内传播。ABR收到Type 7 LSA以后会把它转换成Type 5 LSA再向整个OSPF域通告。配置NSSA区域[H3C-ospf-1] area 2 [H3C-ospf-1-area-0.0.0.2] nssaTotally NSSA区域在此基础上再过滤掉Type 3的区间路由只保留默认路由和本区域的Type 7外部路由。ABR上配置[H3C-ospf-1] area 2 [H3C-ospf-1-area-0.0.0.2] nssa no-summary4.4 特殊区域对比与选型建议区域类型是否接收Type 3是否接收Type 4/5是否允许ASBR区域出口路由方式普通区域接收接收允许明细路由Stub接收拒绝不允许明细路由 默认路由Totally Stub拒绝拒绝不允许仅默认路由NSSA接收拒绝Type 4/5允许明细路由 Type 7Totally NSSA拒绝拒绝Type 4/5允许默认路由 Type 7选型逻辑其实很简单。末端区域不需要引外部路由首选Totally Stub需要引外部路由就选Totally NSSA。普通Stub在中间状态用得少因为过滤不彻底收益不明显。我自己的经验是凡是分支机构、楼层汇聚这类“思路简单、路由少”的区域一律Totally Stub或者Totally NSSA。核心区域保持普通区域。特殊区域的命令看起来简单但配置一致性要求很高所有设备都得一起改改的时候做好变更窗口和回退方案。5. 常见问题与排查技巧实录5.1 邻居状态卡住不动怎么办真正常见的OSPF故障是邻居关系卡在某个中间状态最常见的是卡在ExStart或者Exchange。这两种情况一般指向同一个问题两端接口的MTU不一致。OSPF在Exchange阶段会在DD报文里携带接口的MTU值如果两端MTU不一致大的MTU端发出的DD报文会被另一端直接丢弃邻居就永远停在ExStart状态反复协商。排查命令是display interface GigabitEthernet0/0/1确认两端MTU一致或者把两端的MTU都改为1500默认值问题通常就解决了。邻居卡在Init状态不动一般是对端没有在自己的Hello报文里看到本端需要检查两端是否在同一网段、掩码是否一致、区域ID是否相同。可以在设备上打开调试开关确认报文情况debugging ospf packet看的时候重点看Hello报文里携带的Router-ID和区域ID。这个命令在生产环境要慎用调试信息量非常大用完立刻undo debugging ospf packet关掉否则设备CPU会被刷屏拖垮。5.2 DR/BDR频繁变化导致的震荡前面讲到DR选举是非抢占的但如果你在做割接的时候图省事把新设备直接接到某个网段并且优先级设置特别高而旧网络里已经存在一个DR那么新设备是不会顶替DR的一切看起来正常。但如果有人在某台非DR设备上执行了reset ospf process整个网段的DR会重新选举原本的核心设备优先级和Router-ID没有优势的话DR角色可能落到一个性能很差的接入设备上。这种变更引发的后果就是邻居关系全部重建、LSA大量泛洪、SPF重新计算终端业务在那几秒里会出现明显的卡顿。踩过这个坑之后我的做法是在拓扑稳定以后把核心和汇聚的优先级固定为高值接入设备的优先级明确设置为0[H3C] interface GigabitEthernet0/0/2 [H3C-GigabitEthernet0/0/2] ospf dr-priority 0把优先级为0的设备排除在选举之外DR/BDR的角色就稳定收敛在核心设备上了。5.3 路由黑洞与次优路径问题OSPF的路由黑洞最典型的来源是特殊区域配置错误。比如把区域配置成Stub结果又有人在该区域的某台设备上配置了外部路由引入这台设备会认为自己是一个ASBR但实际上Stub区域不允许Type 5 LSA存在于是路由信息根本传不出去外部路由直接消失。再比如非骨干区域之间不能直接互传路由这件事有些人拓扑上把两个非骨干区域用一条光纤直连同时还配了OSPF结果发现区域之间的路由怎么都学不全。原因就是OSPF规定非骨干区域之间不允许直接交换路由信息所有跨区域流量必须绕经骨干区域。这种场景下正确做法是调整OSPF区域划分让每个非骨干区域都有一条逻辑或物理链路连接到Area 0。次优路径则是ABR汇总导致的问题。ABR在把路由传给其他区域的时候默认会生成Type 3汇总LSA如果掩码规划不合理就可能出现短的汇总路由覆盖了长前缀明细路由的情况。这时候检查LSDB里的Type 3条目和实际的网段掩码做比对基本能快速定位。5.4 认证配置与Hello/Dead时间不匹配OSPF邻居建立的必要条件之一是Hello间隔和Dead间隔完全一致默认情况下Hello是10秒Dead是40秒。有人为了加快收敛把Hello调小到3秒Dead没改结果邻居关系反复闪断。配置各改各的协调不好就会出现这个问题。配置认证的时候也有个类似的坑。区域认证和接口认证要分清区域认证是区域视图下配置接口认证是在接口上配置如果区域配了认证而某个接口没有配这个接口上的邻居建立就会直接失败。最常见的问题是认证类型不一致MD5和HMAC-SHA256或者password key-id不一致这些参数在两端必须完全对应。实际排查认证问题的命令display ospf error这个命令能看到OSPF收发包的错误统计报错计数在涨就说明有问题。经验是按时间顺序检查两端的配置先看Hello/Dead再看认证接着看网络类型和MTU。5.5 一个现场排错案例复盘之前有个客户报障说新加的一台设备在核心交换机上死活建立不了OSPF邻居抓包看到核心一直在发Hello新设备却没有任何回应。远程登录新设备发现它的OSPF进程根本没起来进程编号配成了2而核心上进程编号是1。这里牵涉到一个概念OSPF进程号只在本地有意义两端可以不同但要注意如果你用的是进程间路由重分发那进程号就必须仔细规划。本案例里配置上看起来完全没问题但新设备把接口宣告在了进程2里而核心在进程1里两边自然就建不上邻居了。把新设备的进程编号统一改成1之后邻居马上Full。这种问题看起来低级但实际运维中非常常见。规范化配置模板、每台设备执行display ospf brief确认进程和区域配置就能避免。6. OSPF与MSTP、VRRP的联动经验6.1 园区网三层架构中的协议分工在一个标准的三层园区网里OSPF一般不是孤立存在的。二层用MSTP多生成树协议防环网关用VRRP做冗余上层路由用OSPF打通。三者分工完全不同MSTP负责二层的拓扑收敛防止物理环路造成广播风暴。VRRP负责网关的冗余切换多台设备共享一个虚拟IP主设备故障时备用设备接管。OSPF负责三层路由的学习和传递保证跨VLAN、跨设备的报文能沿着最优路径走。这三个协议不是相互独立的联调的时候容易出问题。最典型的场景是汇聚设备上联到核心的链路断开VRRP感知到的是转发路径的变化但VRRP本身不一定触发主备切换因为VRRP检测的是接口上的真实IP此时报文会走到原主网关设备而OSPF那边已经完成了路由切换流量可能被先吸引到备用设备再通过备用设备绕到核心。6.2 网关冗余切换时OSPF邻居的联动现象有一种常见的中断场景核心设备A故障VRRP的主网关从A切换到B此时OSPF会重新收敛。如果A设备上的OSPF邻居消失所有路由在一段时间内会变成通过B的可达路径。这个过程中部分终端的ARP表项可能还指向A的虚拟MAC地址直到VRRP通告刷新了ARP表否则流量还是会发往已经宕机的设备然后被丢弃。所以在设计这个组合架构的时候我一般会建议启用VRRP的抢占模式并且将VRRP主设备和OSPF的DR设备规划在同一台设备上。这样正常情况下流量在本地完成三层转发不需要绕路。假如DR角色和VRRP主设备不一致就要特别小心链路震荡时的临时环路问题必要时可以配合BFD联动做快速收敛。6.3 设计建议与踩坑提醒核心设备之间建议跑OSPF同时把Router-ID、DR优先级、VRRP优先级统一规划保证主设备重叠减少路径交叉。MSTP的根桥和VRRP的主设备也要尽量规划在同一台物理设备上这样生成树的根和网关的主节点一致二层路径才会收敛到最优。在OSPF里可以配置bfd检测与链路状态联动这样当物理接口down、但三层端口未down比如光模块异常的时候OSPF也能在毫秒级别感知并切换路由。做割接演练的时候不要只在某一台设备上做测试要模拟单设备宕机、单链路中断、上联中断三种情况观察整个联动是否符合预期。联动设计做得好不好往往在平时看不出来一旦出现故障就是业务的生死时速。切换时间从几十秒优化到几秒钟靠的就是这些跨协议的细节规划。写在最后的话OSPF这块东西理论看着多其实真正落地的时候没那么玄乎。我个人最大的体会是先把Router-ID、区域、邻居建立这些基础搞扎实再往上叠加特殊区域、认证、联动这些高级特性一步步推进。不要一上来就想把所有花活都加上基础没打牢只会给自己挖坑。配置完成以后一定要用display ospf peer和display ospf routing做验证设备之间互相ping一下业务地址确认端到端可达。如果这篇文章能帮你少走一次弯路那这个分享就值了。
返回列表