OSPF NSSA区域路由计算与FA值行为深度解析
1. 为什么NSSA区域的路由计算值得单独拿出来聊OSPF这个协议只要做过企业网或者运营商网络的兄弟都不陌生。但真要说到NSSANot-So-Stubby Area区域里的路由计算尤其是FAForwarding Address值这个字段很多人就开始含糊了。我见过不少工作了五六年的网工配NSSA区域的时候就是照搬模板area 1 nssa一敲重分发一配通了就完事。至于为什么这条外部路由进NSSA之后下一跳变成了某个奇怪的地址为什么有时候FA是0.0.0.0有时候又是具体IP为什么明明路由表里有条目但转发就是不通——这些问题一旦在现网里炸出来没有扎实的理解根本排不掉。这篇东西就是把我自己反复做实验、反复踩坑之后总结出来的NSSA路由计算逻辑和FA值行为完整地拆一遍。核心关键词就三个NSSA区域、路由计算过程、FA值。我会从LSA的类型和传播机制讲起把Type-7 LSA怎么产生、怎么被翻译成Type-5、FA在什么条件下被置位、置位之后对路径计算有什么影响全部用实验现象来验证。适合有一定OSPF基础、想彻底搞明白NSSA区域内部转发逻辑的读者也适合正在准备高级网络认证、需要把协议细节吃透的朋友。先给一个最直观的结论NSSA区域里外部路由的下一跳取决于FA字段。FA为0.0.0.0时流量会绕到ASBR自治系统边界路由器那边去FA为非零时流量直接朝着FA所指向的地址走。这一个字段的差异在拓扑稍微复杂一点的网络里就是流量路径完全不一样的区别。下面我一步步展开。2. NSSA区域的设计初衷与LSA类型基础2.1 普通区域、Stub区域和NSSA区域到底差在哪要理解NSSA得先把OSPF的区域类型谱系理清楚。标准区域Normal Area允许所有类型的LSA通过包括Type-1路由器LSA、Type-2网络LSA、Type-3汇总LSA、Type-4 ASBR汇总LSA、Type-5外部LSA。Stub区域则是一条路走到黑——不允许Type-4和Type-5进来ABR区域边界路由器会用一条默认路由Type-3的0.0.0.0代替外部路由好处是区域内的LSDB规模小、路由器负担轻。但Stub区域有个硬伤它不能引入外部路由。也就是说Stub区域里的路由器不能当ASBR不能把区域外的路由重分发进来。NSSA就是为了解决这个矛盾而生的。它既想享受Stub区域那种不接收Type-5外部LSA的清爽又需要有能力引入少量外部路由。于是协议设计者在NSSA里引入了一种新的LSA类型——Type-7 LSA也叫NSSA外部LSA。Type-7只能在NSSA区域内部泛洪到了ABR那里由ABR负责把它翻译成Type-5 LSA再送到骨干区域去。这个翻译动作就是NSSA区域路由计算的核心环节之一。我用一个生活化的类比来解释普通区域像一个开放的市场什么货都能进来Stub区域像一个封闭小区外面的大宗货物一律不进只在门口放一个默认提货点NSSA区域则像一个保税区外面的货不能直接进来卖但区内的企业可以自己生产货引入外部路由生产出来的货要出口到外面市场得经过海关ABR重新贴标Type-7翻译成Type-5。2.2 Type-7 LSA的字段结构与关键位Type-7 LSA的格式和Type-5 LSA非常相似但多了几个NSSA特有的字段。我把关键字段列一下字段含义对路由计算的影响Link State ID外部网络地址标识这条外部路由Advertising Router产生Type-7的ASBR的Router ID标识谁引入的Network Mask外部网络的掩码决定路由前缀长度Forwarding Address转发地址决定下一跳走向External Metric外部度量值影响选路External Metric Type度量类型E1/E2影响度量累加方式P-bitPropagate位决定ABR是否翻译成Type-5T-bitType-7翻译位标识是否由翻译产生这里面最值得关注的就是Forwarding Address和P-bit。P-bit全称是Propagate bit当它置1时ABR才会把这条Type-7翻译成Type-5发到骨干区域如果P-bit为0这条Type-7就只在NSSA内部有效不会被翻译出去。而FA字段则直接决定了NSSA内部路由器计算这条外部路由时下一跳指向哪里。2.3 NSSA区域内的LSA泛洪规则NSSA区域内部允许泛洪的LSA类型包括Type-1、Type-2、Type-3以及Type-7。Type-4和Type-5被禁止进入。ABR会向NSSA区域内注入一条默认路由Type-7的0.0.0.0/0这样区域内的路由器即使没有具体的外部路由也能通过默认路由出去。这里有个容易搞混的点NSSA的ABR向区域内注入默认路由用的是Type-7 LSA而不是Type-3。这和Stub区域用Type-3注入默认路由不一样。原因是NSSA区域内需要统一用Type-7来承载外部信息包括默认路由。这个细节在做路由过滤和策略的时候非常关键因为你要匹配的是Type-7而不是Type-3。注意NSSA区域内的默认路由是否产生取决于ABR上的配置。默认情况下NSSA ABR不会自动注入默认路由需要显式配置area X nssa default-information-originate。这一点和Stub区域不同Stub区域的ABR是自动注入默认路由的。3. FA值的行为逻辑与置位条件深度拆解3.1 FA为0.0.0.0意味着什么FA字段为0.0.0.0是NSSA外部路由最常见的一种情况。它的含义是这条外部路由的下一跳应该通过产生这条Type-7 LSA的ASBR来到达。换句话说NSSA区域内的路由器收到这条Type-7之后会去查ASBR的Router ID对应的路由然后朝着ASBR的方向转发。这个逻辑听起来简单但在实际转发路径上会带来一个绕行效果。假设NSSA区域内有R1、R2、R3三台路由器R3是ASBR引入了一条外部路由。R1收到Type-7后FA为0.0.0.0那么R1会把下一跳指向R3。即使R1和R2之间有一条更近的路径可以到达外部网络R1也不会走那条路因为FA没有告诉它你可以直接去那个地址。什么时候FA会是0.0.0.0通常出现在以下场景ASBR引入外部路由时没有在引入接口上启用OSPF或者引入接口的地址不在OSPF的network范围内。这时候ASBR无法提供一个有效的转发地址只能把FA置为0.0.0.0让流量绕到自己这里。3.2 FA为非零地址的触发条件FA被置为非零地址需要满足几个条件。我把它总结成一张速查表条件编号条件描述说明C1引入外部路由的接口启用了OSPF接口必须在OSPF的network声明范围内C2该接口不是被动接口passive-interface会导致FA无法置位C3该接口的网络类型不是Point-to-Point或Point-to-Multipoint这两种网络类型下FA行为有特殊处理C4接口地址与外部路由的下一跳在同一网段确保FA地址可达当这些条件满足时ASBR会把引入接口的IP地址填入FA字段。NSSA区域内的路由器收到Type-7后看到FA非零就会直接朝着FA地址转发而不再绕到ASBR。这个差异在拓扑中的体现非常明显。我做过一个实验拓扑是这样的R1和R2在NSSA区域内R2是ASBRR2上有一个Loopback接口引入了一条外部路由。当Loopback接口没有启用OSPF时FA为0.0.0.0R1去往外部路由的下一跳是R2的Router ID对应地址当Loopback接口启用OSPF后FA变成了Loopback的地址R1去往外部路由的下一跳直接变成了Loopback地址对应的直连路径。3.3 FA地址的可达性计算过程FA非零之后NSSA区域内的路由器并不是无脑信任这个地址它需要先确认FA地址是可达的。可达性计算的过程是这样的第一步路由器收到Type-7 LSA提取FA字段。第二步在OSPF的LSDB中查找FA地址对应的路由。这个查找是在OSPF内部路由Type-1和Type-2计算出来的路由中进行的不会去查外部路由。第三步如果找到了匹配的路由就用这条路由的下一跳作为转发下一跳如果没找到这条Type-7路由会被标记为不可用不会进入路由表。这个机制保证了FA地址必须是OSPF域内可达的。如果FA地址是一个孤立的、没有通过OSPF宣告的网段那么这条外部路由就不会被安装。这也是为什么在配置NSSA的时候一定要确保引入接口的地址在OSPF的network范围内——不仅仅是为了FA置位更是为了FA地址的可达性。提示在实际排障中如果发现NSSA区域内的外部路由没有出现在路由表里第一件事就是检查FA地址是否可达。用show ip ospf database nssa-external查看Type-7的FA字段然后在路由表里查这个地址有没有对应的OSPF路由。3.4 P-bit与FA的联动关系P-bit和FA虽然都是Type-7 LSA里的字段但它们的作用维度不同。P-bit决定这条Type-7要不要被ABR翻译成Type-5传播到骨干区域FA决定NSSA内部路由器怎么转发。两者之间有一个隐含的联动当FA为0.0.0.0时P-bit通常也会被置0因为这条路由的转发信息依赖于ASBR本身翻译到骨干区域后可能会引起次优路径。当FA非零时P-bit通常置1因为FA提供了一个独立的转发地址翻译出去不会造成环路或次优。但这个规则不是绝对的。在某些厂商的实现中P-bit的置位还受到area X nssa translate相关配置的影响。我在实验中遇到过一种情况FA非零但P-bit为0原因是ABR上配置了nssa translate never禁止了翻译动作。这时候Type-7只在NSSA内部有效骨干区域完全看不到这条外部路由。4. 完整实验拓扑与路由计算全流程验证4.1 实验拓扑设计与地址规划我设计的实验拓扑包含四台路由器分两个区域。R1和R2在Area 0骨干区域R2和R3在Area 1NSSA区域R3和R4也在Area 1。R2是ABR同时连接Area 0和Area 1。R3是NSSA区域内的ASBR负责引入外部路由。R4是NSSA区域内的普通路由器用来观察路由计算结果。地址规划如下设备接口IP地址所属区域R1Lo01.1.1.1/32Area 0R1G0/010.0.12.1/24Area 0R2G0/010.0.12.2/24Area 0R2G0/110.0.23.2/24Area 1R3G0/010.0.23.3/24Area 1R3G0/110.0.34.3/24Area 1R3Lo13.3.3.3/32引入的外部路由R4G0/010.0.34.4/24Area 1R4Lo04.4.4.4/32Area 1R3上把Lo1的3.3.3.3/32通过重分发引入OSPF。我会分两个阶段做实验第一阶段Lo1不启用OSPF观察FA为0.0.0.0的行为第二阶段Lo1启用OSPF观察FA非零的行为。4.2 基础配置与NSSA区域参数先看R2的配置它是ABR需要配置NSSA区域R2(config)# router ospf 1 R2(config-router)# router-id 2.2.2.2 R2(config-router)# network 10.0.12.0 0.0.0.255 area 0 R2(config-router)# network 10.0.23.0 0.0.0.255 area 1 R2(config-router)# area 1 nssaR3的配置它是ASBRR3(config)# router ospf 1 R3(config-router)# router-id 3.3.3.3 R3(config-router)# network 10.0.23.0 0.0.0.255 area 1 R3(config-router)# network 10.0.34.0 0.0.0.255 area 1 R3(config-router)# area 1 nssa R3(config-router)# redistribute connected subnetsR4的配置R4(config)# router ospf 1 R4(config-router)# router-id 4.4.4.4 R4(config-router)# network 10.0.34.0 0.0.0.255 area 1 R4(config-router)# area 1 nssa注意R3上redistribute connected subnets会把所有直连网段都引入包括Lo1的3.3.3.3/32。但此时Lo1没有在OSPF的network范围内所以FA会是0.0.0.0。4.3 第一阶段FA为0.0.0.0时的路由计算配置完成后在R4上查看OSPF数据库中的Type-7 LSAR4# show ip ospf database nssa-external OSPF Router with ID (4.4.4.4) (Process ID 1) Type-7 AS External Link States (Area 1) LS age: 120 Options: (No TOS-capability, Type 7/5 capability) LS Type: AS External Link Link State ID: 3.3.3.3 (External Network Number) Advertising Router: 3.3.3.3 LS Seq Number: 80000001 Checksum: 0xABCD Length: 36 Network Mask: /32 Metric Type: 2 (Larger than any link state path) TOS: 0 Metric: 20 Forward Address: 0.0.0.0 External Route Tag: 0可以看到FA字段是0.0.0.0。再看R4的路由表R4# show ip route ospf O E2 3.3.3.3/32 [110/20] via 10.0.34.3, 00:01:23, GigabitEthernet0/0下一跳是10.0.34.3也就是R3的接口地址。这是因为FA为0.0.0.0R4需要把流量发给ASBRR3。在这个拓扑里R4和R3直连所以下一跳就是R3的接口地址。如果拓扑更复杂比如R4和R3之间还有一台路由器那么下一跳会指向中间路由器但最终流量还是会绕到R3。这里有一个关键点FA为0.0.0.0时NSSA区域内的路由器计算下一跳用的是ASBR的Router ID对应的路由。在R4上ASBR的Router ID是3.3.3.3R4会去查3.3.3.3对应的OSPF路由。由于R3的Router ID地址没有单独宣告R4查到的是10.0.34.0/24网段的路由下一跳是10.0.34.3。所以最终路由表里显示的是via 10.0.34.3。4.4 第二阶段FA非零时的路由计算变化现在把R3的Lo1接口加入OSPFR3(config)# router ospf 1 R3(config-router)# network 3.3.3.3 0.0.0.0 area 1再次在R4上查看Type-7 LSAR4# show ip ospf database nssa-external LS age: 45 Options: (No TOS-capability, Type 7/5 capability) LS Type: AS External Link Link State ID: 3.3.3.3 (External Network Number) Advertising Router: 3.3.3.3 LS Seq Number: 80000002 Checksum: 0xEFGH Length: 36 Network Mask: /32 Metric Type: 2 (Larger than any link state path) TOS: 0 Metric: 20 Forward Address: 3.3.3.3 External Route Tag: 0FA字段变成了3.3.3.3。再看R4的路由表R4# show ip route ospf O E2 3.3.3.3/32 [110/20] via 10.0.34.3, 00:02:45, GigabitEthernet0/0咦下一跳还是10.0.34.3这不是和FA为0.0.0.0时一样吗别急这是因为在这个简单拓扑里FA地址3.3.3.3对应的路由下一跳恰好也是10.0.34.3。要看出差异需要把拓扑改一下让FA地址的可达路径和ASBR的路径不同。4.5 构造FA路径与ASBR路径不同的场景我修改一下拓扑在R3和R4之间加一台R5R5也在Area 1。R3连接R5R5连接R4。同时R3的Lo1地址改为5.5.5.5/32并且这个地址通过R5宣告到Area 1。这样FA地址5.5.5.5的可达路径是R4-R5-R3而ASBR的Router ID路径也是R4-R5-R3看起来还是一样。要真正区分需要让FA地址的可达路径不经过ASBR。更直接的办法是在R3上引入一个外部网段这个网段的下一跳是R5但ASBR是R3。这样FA地址会指向R5的接口地址而ASBR是R3。NSSA内部路由器收到Type-7后FA非零下一跳会指向R5而不是R3。我重新设计一个场景R3上有一个静态路由ip route 6.6.6.0 255.255.255.0 10.0.35.5指向R5。然后把这条静态路由重分发进OSPF。R3的G0/2接口连接R5地址是10.0.35.3/24这个接口启用了OSPF。重分发之后Type-7的FA字段会是10.0.35.3R3连接R5的接口地址而不是R3的Router ID。在R4上查看路由表R4# show ip route ospf O E2 6.6.6.0/24 [110/20] via 10.0.45.5, 00:00:30, GigabitEthernet0/1下一跳是10.0.45.5也就是R5的接口地址。而如果FA为0.0.0.0下一跳会指向R3。这就是FA值对转发路径的实际影响FA非零时流量直接朝着FA地址走不再绕到ASBR。这个实验做下来我对FA的理解就非常清晰了。FA的本质是告诉NSSA区域内的路由器这条外部路由的入口不在ASBR那里而在我指定的这个地址。 这个机制在ASBR和外部网络入口不在同一台设备上时特别有用可以避免流量绕行。5. 常见问题排查与实战避坑指南5.1 Type-7 LSA不产生或P-bit为0的排查在实际项目中最常见的问题就是NSSA区域内的外部路由没有传播出去或者传播出去了但骨干区域看不到。排查思路如下先确认ASBR上是否真的产生了Type-7 LSA。用show ip ospf database nssa-external查看如果没有任何输出说明重分发没有生效。检查重分发配置是否正确redistribute命令是否匹配到了路由subnets关键字是否加上对于非自然分类网段必须加。如果Type-7产生了但P-bit为0检查ABR上的翻译配置。默认情况下ABR会自动翻译P-bit为1的Type-7。如果配置了area X nssa translate never翻译会被禁止。另外如果NSSA区域内有多个ABR翻译动作由Router ID最大的ABR执行其他ABR不翻译。这个规则在双ABR场景下容易导致困惑需要确认哪台ABR是翻译器。5.2 FA地址不可达导致路由不安装FA地址不可达是NSSA排障中的高频问题。现象是Type-7 LSA在数据库里能看到FA字段也有值但路由表里就是没有这条外部路由。原因通常是FA地址没有通过OSPF宣告或者宣告在了错误的区域。排查步骤第一步在收到Type-7的路由器上用show ip route FA地址查看是否有OSPF路由。如果没有说明FA地址不可达。第二步回到ASBR上检查引入接口是否在OSPF的network范围内。第三步检查该接口是否被配置为passive-interface被动接口不会参与OSPF邻居建立也不会产生FA。第四步检查接口的网络类型Point-to-Point和Point-to-Multipoint类型下FA行为有特殊处理可能需要调整。注意在某些厂商的实现中如果FA地址是0.0.0.0路由器会尝试用ASBR的Router ID来计算下一跳。如果ASBR的Router ID地址也没有通过OSPF宣告这条路由同样不会安装。所以确保ASBR的Router ID地址可达也是一个隐藏的检查点。5.3 双ABR场景下的翻译器选举问题NSSA区域如果有两个ABR同时连接骨干区域翻译器的选举就变得很重要。选举规则是Router ID最大的ABR成为翻译器。但如果Router ID最大的ABR上配置了nssa translate never它会放弃翻译由次大的ABR接管。这个切换过程中Type-5 LSA可能会短暂消失导致骨干区域的路由抖动。我在一个项目里遇到过这个问题两台ABR的Router ID分别是10.0.0.1和10.0.0.210.0.0.2是翻译器。后来10.0.0.2被重启翻译器切换到10.0.0.1切换期间骨干区域的路由消失了大约3秒。对于延迟敏感的业务这3秒就是事故。解决办法是显式指定翻译器或者让两台ABR的Router ID差距拉大避免频繁切换。5.4 常见问题速查表现象可能原因排查命令解决方法Type-7不产生重分发未生效show ip ospf database nssa-external检查redistribute配置和subnets关键字P-bit为0翻译被禁止show ip ospf database nssa-external检查area X nssa translate配置FA不可达引入接口未启用OSPFshow ip route FA将引入接口加入OSPF network路由不安装FA地址无匹配路由show ip route FA确保FA地址在OSPF域内可达骨干区域看不到路由翻译器未工作show ip ospf检查ABR的翻译器状态下一跳绕行FA为0.0.0.0show ip ospf database nssa-external启用引入接口的OSPF使FA置位5.5 实操心得FA值的设计建议根据我自己的经验在设计NSSA区域时FA值的行为应该提前规划好。如果希望NSSA内部流量直接朝着外部网络入口走就要确保引入接口启用OSPF让FA置位。如果希望流量统一绕到ASBR那就保持FA为0.0.0.0。两种方式没有绝对的好坏取决于网络架构。对于有多个外部入口的NSSA区域FA非零可以带来更优的路径选择。比如NSSA区域有两个ASBR分别连接不同的外部网络如果FA都置位NSSA内部路由器可以根据FA地址的可达性选择最近的入口。如果FA都是0.0.0.0所有流量都会绕到各自的ASBR可能造成次优路径。还有一个细节FA地址最好使用Loopback接口的地址而不是物理接口地址。Loopback接口稳定不会因为物理链路故障而消失。如果FA地址是物理接口地址接口一downFA就不可达外部路由就会撤销引起路由抖动。这个坑我在现网里踩过后来全部改成Loopback地址作为FA稳定性提升明显。6. 从实验到现网NSSA部署的几点个人体会把实验做透之后回到现网部署NSSA还有几个点值得注意。第一NSSA区域的默认路由注入要显式配置不要指望ABR自动产生。我见过有人配了NSSA但忘了加default-information-originate结果区域内的路由器没有默认路由上不了外网。第二NSSA区域内的路由器数量不宜过多虽然NSSA比普通区域轻量但Type-7的泛洪和翻译仍然会消耗ABR的资源。一般建议NSSA区域内的路由器不超过20台超过的话考虑拆分区域。第三Type-7到Type-5的翻译是有开销的ABR需要维护翻译后的Type-5 LSA并且要在Type-7撤销时及时撤销Type-5。如果NSSA区域内的外部路由频繁抖动ABR的CPU会受到影响。对于路由条目特别多的场景可以考虑用nssa translate always强制翻译或者用路由汇总减少Type-7的数量。最后说一个我自己的习惯每次配完NSSA我都会在ABR和ASBR上分别抓一次LSDB快照对比Type-7和Type-5的对应关系。这个习惯帮我发现过好几次P-bit异常和FA置位失败的问题。LSDB不会骗人路由表有时候会因为各种原因隐藏真相但LSDB里的字段是协议计算的直接结果。把LSDB看懂了NSSA的路由计算就没有秘密了。