ARTICLE DETAIL

资讯详情

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

OSPF特殊区域实战:阻止Type-4和Type-5 LSA进入区域

OSPF特殊区域实战:阻止Type-4和Type-5 LSA进入区域 接到这个需求的时候我第一反应是这又是一个网络工程师每天都在做、但新手往往搞不明白的经典操作。OSPF作为最常用的路由协议Type-4和Type-5 LSA的传播控制直接影响区域的LSDB规模、路由表精简和安全性。标题里提到的阻止Type-4和Type-5 LSA进入该区域本质上就是OSPF特殊区域的应用问题。这篇文章我会从LSA的角色讲起把Stub、Totally Stub、NSSA、Totally NSSA这几种区域类型的选型逻辑、配置命令、验证方法和踩坑经验一次讲透。适合正在做网络规划、搞运维排障、或者备考网络认证的工程师参考。1. 先拆清楚Type-4和Type-5 LSA到底是干什么的想搞清楚为什么阻止以及怎么阻止得先明白Type-4和Type-5 LSA在OSPF里扮演什么角色。很多朋友一上来就背区域类型背完就忘就是因为没搞懂LSA本身的行为逻辑。1.1 Type-5 LSA外部路由的传送带Type-5 LSA也叫外部LSAExternal LSA是由ASBR产生的。ASBR就是那些把外部路由引入OSPF域的路由器比如连接了其他路由协议、静态路由或者直连外部网络的路由器。当ASBR将一条外部路由比如一条静态路由或一条从BGP学来的路由重分发进OSPF时它会生成一条Type-5 LSA描述这条外部路由的网段、掩码、开销等信息。关键在于Type-5 LSA一旦生成就会在整个OSPF自治系统内泛洪——除了Stub区域和NSSA区域。它不受区域边界限制跨越骨干区域和非骨干区域传播所有普通区域的路由器都会收到它计算出一条指向ASBR的外部路由。简单类比Type-5 LSA就像是小区门口贴了一张告示告诉大家外面有个新超市地址在这。只要你是这个小区的住户普通区域不管你在哪栋楼哪个区域你都能看到这张告示。1.2 Type-4 LSA给其他区域指路的路标Type-4 LSA也叫ASBR汇总LSASummary ASBR LSA很多人对它理解得比较模糊。它的作用是当ASBR和某些路由器不在同一个区域时这些路由器虽然收到了Type-5 LSA知道有外部路由存在但它们不知道怎么走到ASBR——因为ASBR的具体位置Router ID对应的路由可能不在自己区域里普通的路由查询查不到去ASBR网段的路由。这时候区域边界路由器ABR会生成一条Type-4 LSA描述到达ASBR的路径信息并把这条Type-4 LSA注入到其他区域。其他区域的路由器收到Type-4后就能计算出到达ASBR的路由从而把外部路由的下一跳搞定。还是拿小区类比Type-5是新超市开业的告示Type-4则是告示背面附的怎么走到超市的路线图。没有路线图告示等于白看。这里有个容易混淆的点Type-4不是ASBR自己产生的而是ABR产生的。ASBR所在的区域里路由器可以直接通过区域内路由找到ASBR所以不需要Type-4但其他区域的路由器看不到ASBR的Router LSA就需要ABR帮忙生成一条去往ASBR的汇总路由。换句话说Type-4是跨区域通告ASBR信息的工具。1.3 为什么要阻止它们进入某个区域理解了Type-4和Type-5的作用阻止它们进入某个区域的目的就很清晰了。实际网络里最常见的需求分成几类第一类是LSDB规模控制。骨干网上可能引入了大量外部路由Type-5 LSA动辄几百上千条。如果每个接入区域、分支机构区域都全量承载这些LSA区域内的低端路由器内存和CPU会吃不消。OSPF的SPF计算每次都要处理这些LSA区域越大、LSA越多收敛越慢。第二类是路由策略集中。某些区域比如一个只跑办公网的分支根本不需要知道外网有哪些明细路由它只要一条默认路由把所有出区域流量扔给ABR即可。这时候把区域设置成Stub或Totally Stub区域内路由表会极其干净出区域流量路径也完全可控。第三类是安全问题。规范强行让所有普通区域的路由器接收全量外部LSA等于把全网的路由拓扑信息广播给了每一个角落。从隔离和最小权限角度来看限制LSA进入特定区域能减少路由信息的暴露面。我实际见过一个场景某数据中心核心OSPF域里接入了大量BGP外部路由Type-5 LSA有好几千条。而楼宇接入区域的汇聚交换机还在用老设备内存吃紧SPF计算频繁跑满CPU。最后就是把这些接入区域全部改成Totally Stub只保留一条默认路由问题立刻解决设备负载大幅下降。2. 思路拆解阻止Type-4/5进入区域的几种典型方案真正动手配置之前先要理解OSPF区域类型的设计逻辑。想阻止Type-4和Type-5 LSA进入某个区域手段其实不是靠过滤LSA而是靠变更区域类型。OSPF标准里专门设计了几种特殊区域目的就是让ABR在区域边界上拦截掉Type-4和Type-5。2.1 方案对比总览区域类型允许的LSA类型阻止的LSA类型默认路由来源是否允许区域内ASBR普通区域NormalType-1/2/3/4/5无无按实际路由计算允许Stub区域Type-1/2/3Type-4/5ABR自动注入Type-3默认路由不允许Totally Stub区域Type-1/2Type-3/4/5仅保留ABR注入的默认路由以Type-3形式发布ABR自动注入Type-3默认路由不允许NSSA区域Type-1/2/3/7Type-4/5外部路由通过Type-7承载默认不自动注入需显式配置允许Totally NSSA区域Type-1/2/7Type-3/4/5仅保留ABR注入的默认路由ABR注入默认路由允许这张表建议收藏平时做方案、考试、面试都用得上。注意Stub和Totally Stub的关键区别在于Type-3 LSAStub允许区域间路由Type-3进入Totally Stub连区域间路由都拦掉只放一条默认路由进来。2.2 Stub和Totally Stub最直接的标准做法Stub区域是OSPF里最经典的特殊区域。设计理念很简单这个区域不需要知道外部路由长什么样所有去往OSPF域外的流量直接交给ABR转发。因此ABR在这个区域边界上不会通告Type-4和Type-5 LSA同时自动生成一条Type-3的默认路由告诉区域内路由器去外面都走我这儿。配置上Stub区域要求区域内所有路由器包括ABR和非ABR都配置为Stub模式。如果有一台路由器没配置OSPF邻居关系会起不来直接被卡在Exstart/Exchange状态。这一点很多人踩坑后面排查部分细说。Totally Stub则是Cisco提出来的增强版本后来华为等厂商也支持在Stub的基础上连Type-3都拦掉。区域内的路由器只保留本区域的Type-1/2 LSA和一条默认路由。这种模式下区域内的路由条目少得可怜非常适合接入层、分支节点这类位置。我自己的使用经验是如果某个区域下联用户只访问内网特定几个网段可以保留Stub让Type-3进来方便区域内路由器直接选路但如果这个区域只是接入终端、全部流量上送汇聚那Totally Stub更省资源、更干净。2.3 NSSA和Totally NSSA允许自己引入外部路由的变通Stub区域有个硬性限制区域内不允许存在ASBR也就是说不能在Stub区域里的路由器上做路由重分发比如把静态路由import进OSPF。如果这个区域恰好需要自己引入一些外部路由比如分部有一条专线路由要发布给全网Stub方案就失效了。NSSANot-So-Stubby Area非完全Stub区域专为解决这个问题而生。NSSA区域同样不允许Type-4和Type-5 LSA进入但它允许区域内的ASBR产生Type-7 LSA来承载外部路由。Type-7只在NSSA内部传播当ASBR所在区域的ABR把Type-7转发到其他区域时会把Type-7转换成Type-5再发出去。这样NSSA区域既能引入外部路由又不接收其他区域灌进来的外部LSA可谓两全其美。Totally NSSA则是在NSSA基础上再拦掉Type-3只保留区域内部路由和默认路由同时允许本区域引入外部路由Type-7。实际规划中NSSA多用于这个区域需要自己引一些路由但不想承接全网的Type-5的场景。比如分公司区域里有一条直连运营商专线需要在OSPF里发布同时又不希望收到核心区域成百上千条的外部明细路由NSSA就是标准答案。2.4 为什么不要指望distribute-list和filter-list很多朋友一上来就想用distribute-list或者filter-list去过滤Type-4/5 LSA觉得配置一条策略就行。这里必须泼一盆冷水distribute-list在OSPF里只影响本地路由表不影响LSA数据库的泛洪。也就是说你用distribute-list拦掉某条外部路由只是让本路由器不把这条路由装进路由表但Type-5 LSA该进LSDB还是进LSDB邻居照样收到SPF还是照算。它根本做不到阻止LSA进入区域。ABR上的filter-list华为的area filter-list、思科的area filter-list也只能过滤Type-3 LSA区域间路由汇总对Type-4和Type-5无能为力。因为标准里Type-4和Type-5的泛洪控制就是靠区域类型没有按前缀过滤的机制。所以顶着标题直说要阻止Type-4和Type-5 LSA进入某个区域唯一靠谱的方案就是把这个区域配置成Stub、Totally Stub、NSSA或Totally NSSA。搞明白了这一点配置命令反而非常简单。3. 实操配置从拓扑到验证的完整流程理论讲完进入动手环节。我用一个典型的小型网络拓扑演示配置华为命令为主、思科命令对照。两种厂商的配置逻辑完全一样只是关键字略有差异。3.1 网络拓扑与区域规划假设拓扑如下R1在Area 0骨干区同时连接Area 1和Area 2充当ABRRouter ID为1.1.1.1。R2、R3在Area 1内作为普通路由器。R4、R5在Area 2内。R1和R6之间存在外部连接R6模拟ASBR向OSPF域引入一条静态路由比如外部网段172.16.1.0/24R6在Area 0内。目标让Area 1变成Totally Stub区域彻底阻止Type-3/4/5 LSA进入让Area 2变成Totally NSSA区域阻止Type-4/5进入但允许Area 2内自己引入外部路由这里模拟R5引入直连网段192.168.100.0/24。这样规划的好处是既有Stub的一个典型场景也有NSSA的一个典型场景一台设备上全部覆盖。实际网络中两个区域类型完全可以分开用不必强行相同。3.2 在ABR上配置Totally Stub区域华为华为的配置很直观直接在OSPF进程下进入对应的area视图敲stub或stub no-summary。R1ABR上的配置ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.0.0.0 0.0.0.255 area 0.0.0.1 network 192.168.1.0 0.0.0.255 stub no-summary注意华为对应的Area 1你只要把下面两台路由器也配成stub即可。如果配的是stub no-summary就是Totally Stub如果只配stub就是普通Stub。totally stub情况下ABR会自动下发一条Type-3的默认路由给区域内命令就是no-summary这个参数带出来的。R2、R3Area 1内的非ABR配置ospf 1 router-id 2.2.2.2 area 0.0.0.1 network 192.168.1.0 0.0.0.255 stub对于R2、R3来说只需要敲stub不需要敲no-summary——因为Totally Stub的拦截行为是在ABR上做的区域内路由器只要保证自己的区域类型是stub即可。思科这边等价配置是router ospf 1 router-id 1.1.1.1 network 10.0.0.0 0.0.0.255 area 0 network 192.168.1.0 0.0.0.255 area 1 area 1 stub no-summaryrouter ospf 1 router-id 2.2.2.2 network 192.168.1.0 0.0.0.255 area 1 area 1 stub这里必须强调一个原则Area 1里所有路由器只要启用了OSPF且属于这个区域都必须配置stub关键字否则邻居关系起不来。华为设备如果一端是stub另一端是普通区域OSPF邻居会反复震荡最终停在Exstart状态。这也是后面第4节第一个排查点要重点讲的。3.3 在ABR上配置Totally NSSA区域华为Area 2使用Totally NSSA。华为配置R1ABR上的配置ospf 1 router-id 1.1.1.1 area 0.0.0.2 network 10.0.1.0 0.0.0.255 nssa no-summary等等R1连接Area 2的网段我前面没定义这里补一下R1和R4之间的链路网段假定是10.0.1.0/24R4和R5之间是192.168.100.0/24。这些细节不影响主题但配置里总要说清楚。R1配置ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 10.0.0.0 0.0.0.255 area 0.0.0.1 network 192.168.1.0 0.0.0.255 stub no-summary area 0.0.0.2 network 10.0.1.0 0.0.0.255 nssa no-summaryR4Area 2内普通路由器配置ospf 1 router-id 4.4.4.4 area 0.0.0.2 network 10.0.1.0 0.0.0.255 nssaR5假设作为NSSA区域内的ASBR引入直连路由配置ospf 1 router-id 5.5.5.5 area 0.0.0.2 network 192.168.100.0 0.0.0.255 nssa import-route direct这里用import-route direct把R5的直连路由引入OSPF在NSSA区域内形成Type-7 LSA。如果你用的是思科设备对应写法是redistribute connected加上area 2 nssa。有一点要注意思科在NSSA区域里重分发直连路由有时会因为你把接口也宣告进OSPF而产生重复路由建议在redistribute connected时配合subnets参数并仔细检查引入范围。思科对应的Totally NSSA配置router ospf 1 router-id 1.1.1.1 network 10.0.0.0 0.0.0.255 area 0 network 10.0.1.0 0.0.0.255 area 2 area 2 nssa no-summaryrouter ospf 1 router-id 4.4.4.4 network 10.0.1.0 0.0.0.255 area 2 area 2 nssa这里有个细节NSSA的ABR也就是R1默认情况下不会自动向NSSA区域内注入默认路由。这点和Stub区域不一样。如果希望Area 2里的路由器有一条指向ABR的默认路由通常是出公网用的还需要额外敲一条命令。华为是area 0.0.0.2 nssa no-summary default-route-advertise如果你配的是no-summary实际测试中ABR会自动产生一条Type-3默认路由下发到NSSA区域效果类似Totally Stub。但如果你只配了nssa而没有no-summary则默认不会自动产生默认路由需要显式配置default-route-advertise。不同版本/厂商默认行为可能有差异这里建议养成习惯凡是需要NSSA区域有默认路由的场景显式敲default-route-advertise不要依赖默认行为。思科对应是area 2 nssa no-summary或area 2 nssa default-information-originate想彻底totally nssa阻止Type-3又给默认路由就两个组合着看不同IOS版本对no-summary是否自动下发默认路由的处理并不完全一致建议配置后查一下路由表没有默认路由就补default-information-originate。3.4 配置后的验证命令与预期结果配置完成后重点看三个方面LSA数据库、路由表、邻居状态。华为设备验证命令查看邻居状态display ospf peer在R1、R4上检查Full状态正常查看LSA数据库概要display ospf lsdb或display ospf lsdb brief查看外部LSAdisplay ospf lsdb ase表示Type-5查看ASBR汇总LSAdisplay ospf lsdb asbr-summary表示Type-4查看区域间LSAdisplay ospf lsdb summary表示Type-3查看OSPF区域信息display ospf能看到每个区域的类型。在R2Area 1内的路由器上预期结果应该是display ospf lsdb ase没有任何输出没有Type-5display ospf lsdb asbr-summary没有任何输出没有Type-4display ospf lsdb summary只有一条默认路由0.0.0.0/0来源是ABR下发display ospf routing里有一条默认路由指向ABR在R4Area 2内的路由器上预期结果应该是没有Type-5但有Type-7如果你在Area 2里引了外部路由没有Type-4有一条默认路由如果你配置了default-route-advertise如果R4和R5之间通过OSPF学习到192.168.100.0/24那它是Type-7 LSA承载的路由思科验证命令对应为show ip ospf database、show ip ospf database external、show ip ospf database asbr-summary、show ip route ospf。逻辑一致不再重复。另外建议在R6模拟ASBR上引入外部路由后先在R1上看是否正常收到Type-5。然后在R2上再查一次确认确实进不来Area 1。这种源端确认、目标端复查的习惯能帮你快速定位问题到底出在配置还是区域类型上。4. 常见问题与排查技巧实录这一节是我最想写的部分。特殊区域配置本身不难难的是出问题后的排查。下面这些都是我实际测试和现网维护中反复遇到过的坑每条都值得记下来。4.1 邻居卡在Exstart/Exchange区域类型不一致现象把Area 1改成Stub后R1和R2的OSPF邻居起不来状态一直卡在Exstart或者Exchange反复震荡。原因OSPF邻居建立过程中会交互DBD报文Inside这些报文里带有区域类型的标志位。如果一端认为自己是Stub另一端认为自己是普通区域双方能力集不一致邻居建立必然失败。华为、思科都一样。处理逐台检查区域内所有路由器的area配置。特别是ABR上如果你给Area 1配置了stub那么Area 1内每一台路由器都必须有stub。有一些项目里交换机链路上可能同时还有别的区域只改了一台是不行的。顺便提醒改区域类型前先在维护窗口里把区域内所有设备的配置都准备好统一下发避免一台一台修改导致中间状态时间过长。4.2 Stub区域里偷偷引了外部路由现象某台区域内的路由器配置了import-route static或者其他路由引入命令结果区域内的路由计算出现异常或者ABR设备一直报错。原因Stub区域不允许ASBR存在。如果你在Stub区域内部路由器上重分发路由这台路由器就成了ASBR需要生成Type-5 LSA。但Stub区域的邻居不接收Type-5两边就对不上最后外部路由根本学不到而且很容易导致SPF计算异常。处理要么移除Stub区域里的重分发配置换用NSSA必须保留外部路由引入就把这个区域从Stub改成NSSA或Totally NSSA。做区域规划的时候就要想清楚区域是否需要引入外部路由需要就不要用Stub用NSSA。4.3 NSSA里看不到外部路由或者没有默认路由现象在NSSA区域内部配置了import-route但区域内路由器查不到外部路由或者NSSA区域路由器没有默认路由。原因NSSA里外部路由靠Type-7承载而Type-7只在NSSA内部泛洪。如果外部路由是ABR上引入的比如你在R1上import-route那R1作为ABR同时又是ASBR生成的是Type-7还是Type-5取决于华为的版本实现。有的版本里ABR自己引入的外部路由会直接以Type-5形式在骨干区域通告并不会自动转成Type-7灌回NSSA导致NSSA内路由器反而学不到。这就不是配错而是理解差异。处理关键点就一句话——如果你希望某条外部路由出现在NSSA内部它必须由NSSA区域内的路由器非ABR通过Type-7引入。区域内非ABR设备上做重分发是最稳的做法。至于默认路由检查是否显式配置了default-route-advertise没有就补上。4.4 虚链路和区域类型的不兼容问题现象规划时想用OSPF虚链路virtual-link让某个非骨干区域接入骨干但配置后发现邻居起不来。原因OSPF标准明确要求虚链路不能穿越Stub区域也不能穿越NSSA区域。因为虚链路需要依赖Type-3、Type-4、Type-5 LSA来完成跨区域路径计算而这些LSA在特殊区域里恰恰被拦掉了逻辑上就冲突。处理网络设计阶段就要避免把特殊区域放在需要虚链路的位置。如果确实有个区域需要跨越另一个区域接入骨干那个被穿越的区域必须是普通区域不能是Stub或NSSA。这是很多人做方案时容易忽略的硬约束。4.5 用了过滤命令LSA还在LSDB里现象你在ABR上配了filter-policy或者distribute-list想去掉某些Type-5路由结果display ospf lsdb一看LSA还好好的在里面甚至路由表该有的还在。原因之前讲过distribute-list在OSPF里只影响本路由器路由表的装载不阻止LSA泛洪。ABR上的filter-list只能过滤Type-3拦不住Type-4和Type-5。如果非要滤Type-5标准做法是改变区域类型而不是靠策略过滤。处理记住这个结论能省下大量排障时间。我见过太多工程师在filter-policy上折腾半天最后发现理论方向就错了。4.6 区域类型改了但路由没有变化现象把Area 1从普通区域改成Totally Stub后区域内路由表还是能看到一堆Type-3的外部网段没有收敛成一条默认路由。原因很可能是区域内某台路由器没有同步配置stub或者配置下发后没有等待足够的时间SPF还没重新计算。也可能是你改的是ABR但非ABR设备上OSPF进程没有刷新区域类型信息在广播型网络上还在用旧的。处理改完配置后用reset ospf process华为或clear ip ospf process思科重置一下OSPF进程让它强制重新建立邻居关系并重新泛洪LSA。再逐台检查display ospf里的区域类型是否全部变成Stub。这种软重启在做特殊区域变更时很常用。排查速查表现象可能原因首选排查命令邻居卡Exstart/Exchange区域内stub/nssa类型不一致display ospf peer、display ospfStub区域里外部路由不通区域内部存在ASBR/重分发display ospf lsdb aseNSSA区域学不到外部路由外部路由引入位置错误或缺少Type-7display ospf lsdb nssaNSSA区域没有默认路由未配置default-route-advertisedisplay ospf routingLSDB里有不该出现的LSA区域类型没生效/设备没同步display ospf lsdb虚链路邻居起不来虚链路穿越了特殊区域display ospf vlink结尾做OSPF区域设计做了这么多年我最深的体会是特殊区域本质上是对LSA传播范围的一种制度性约束它比任何策略过滤都可靠。Stub和NSSA不是简单的命令差异而是对整个区域的运行模式重新做了定义。规划网络时我习惯在一张表上先列清楚每个区域要不要引入外部路由、要不要接收区域间明细、需不需要默认路由再来反推区域类型基本不会出大错。最后分享一个小技巧在现网里做区域类型变更之前先在一台空闲设备上搭个最小复刻环境模拟三个区域、挂了外部路由源把预期LSA变化跑一遍。之前我在一个接入区域把普通区域改成Totally Stub时就是因为提前在测试环境里确认了ABR下发的默认路由开销才避免了上线后流量路径异常的问题。OSPF这种东西看着简单细节全在验证上。
返回列表