Areas and Virtual Links
理解 OSPF area 和 virtual link 的概念。
Areas 和 Virtual Links
OSPF 的一个显著特性是可以将一个 AS 划分为多个路由 area,每个 area 都有自己的一组邻居。设想一个拥有 300 多台路由器且它们之间有多条链路的大型网络。每当链路发生振荡或网络中发生其他拓扑变化时,这种变化都会被泛洪到网络中的所有 OSPF 设备。这会给网络带来沉重负载,甚至导致停机,因为对于如此庞大的网络,网络收敛可能需要一些时间。
单个大型 area 网络可能产生严重问题:
- 每当网络拓扑发生变化时,每台路由器都会重新计算数据库。该过程会消耗 CPU 资源。
- 每台路由器都持有一个完整的链路状态数据库,其中显示了整个网络的拓扑。这会占用内存资源。
- 路由表的完整副本以及路由表条目数量可能远多于网络数量,这会占用更多内存资源。
- 更新大型数据库需要更多带宽。
引入 area 可以实现更好的资源管理,因为一个 area 内部的拓扑变化不会被泛洪到网络中的其他 area。area 的概念使网络管理更加简单,并支持 area 之间的路由汇总,从而显著减小每个 OSPF 邻居上需要存储的数据库大小。这意味着每个 area 都有自己的链路状态数据库和相应的最短路径树。有关 OSPF 邻居如何相互发现并同步数据库的更多信息,请参见邻居关系。
area 的结构对其他 area 是不可见的。这种知识的隔离使得在使用多个 area 时协议更具可扩展性。路由表计算消耗的 CPU 资源更少,路由流量也减少了。
然而,多 area 设置会带来额外的复杂性。不应将少于 50 台路由器的网络划分为多个 area。一个 area 中路由器的最大数量主要取决于你用于路由表计算的 CPU 能力。

OSPF area 具有唯一的 32 位标识(Area ID)。Area ID 为 0.0.0.0 的 area(称为 Backbone area)是主 area,任何其他 area 都应连接到它。连接到多个 area 的路由器称为 ABR(Area Border Routers),其主要职责是所连接 area 之间的汇总和更新抑制。连接到另一个路由域的路由器称为 ASBR(Autonomous System Boundary Router)。
每个 area 都有自己的链路状态数据库,由描述该 area 中所有路由器如何互连的 router-LSA 和 network-LSA 组成。对该 area 拓扑的详细知识会向所有其他 area 隐藏。Router-LSA 和 network-LSA 不会泛洪到 area 边界之外。Area Border Router(ABR)通过 OSPF summary-LSA 将寻址信息从一个 area 泄露到另一个 area。这允许路由器在向来自另一个 area 的目标转发数据时选择最佳的 area border router,这称为 intra-area routing。有关路由表如何计算的更多信息,请参见路由表计算。
area 之间的路由信息交换本质上是一种 Distance Vector 算法。为防止诸如计数到无穷之类的算法收敛问题,所有 area 都必须直接连接到 backbone area,从而形成简单的 hub-and-spoke 拓扑。backbone area 的 area-ID 始终为 0.0.0.0,不能更改。有关路由决策过程的更多信息,请参见路由决策。
在 /routing/ospf/area 菜单中配置 RouterOS area。例如,一个连接多个 area(一个 Stub area 和一个默认 area)的 ABR 路由器的配置:
/routing/ospf/area
add name=backbone_v2 area-id=0.0.0.0 instance=v2inst
add name=stub_area area-id=1.1.1.1 instance=v2inst type=stub
add name=another_area area-id=2.2.2.2 instance=v2inst type=default
OSPF 可以有 5 种 area 类型,由 type 参数配置。每种 area 类型定义了该 area 支持哪些类型的 LSA:
- Standard/default - 可以在此 area 中传输 OSPF 数据包。它支持类型 1、2、3、4 和 5 的 LSA。
- Backbone - 如前所述,这是主 area,任何其他 area 都连接到它。它基本上与标准 area 相同,但以 ID 0.0.0.0 标识。
- Stub - 此 area 不接受任何外部路由。
- Totally stubby - Stub area 的一种变体。
- Not-so-stubby (NSSA) - Stub area 的一种变体。
LSA 类型
在继续详细了解每种 area 类型之前,请先熟悉 LSA 类型:
- type 1 - (Router LSA)由 area 中的路由器发送,包含直连链路的列表。这些 LSA 不会跨越 ABR 或 ASBR。
- type 2 - (Network LSA)为 area 中的每个 "transit network" 生成。transit network 至少有两台直连的 OSPF 路由器。以太网就是 transit network 的一个例子。Type 2 LSA 列出了组成该 transit network 的每台所连接的路由器,由 DR 生成。
- type 3 - (Summary LSA)ABR 发送 Type 3 Summary LSA。Type 3 LSA 将一个 area 拥有的所有网络通告给 OSPF AS 中的其余 area。默认情况下,OSPF 会为发起 area 中定义的每个子网通告 Type 3 LSA,这可能导致泛洪问题。你应在 ABR 上使用手动汇总。
- type 4 - (ASBR-Summary LSA)通告 ASBR 地址,显示 ASBR 所在的位置,通告其地址而不是其路由表。
- type 5 - (External LSA)通告通过 ASBR 学到的路由,并泛洪到除 Stub area 之外的所有 area。此 LSA 分为两个子类型:external type 1 和 external type 2。
- type 6 - (Group Membership LSA)为 OSPF 的组播扩展而定义,RouterOS 不使用。
- type 7 - Type 7 LSA 将导入 NSSA area 的外部路由告知 ABR。Area Border Router 随后将这些 LSA 转换为 type 5 外部 LSA,并将它们泛洪到 OSPF 网络的其余部分。
- type 8 - External Attributes LSA(OSPFv2)/ link-local LSA(OSPFv3)。
- type 9 - Link-Local Scope Opaque(OSPFv2)/ Intra Area Prefix LSA(OSPFv3)。此类型的 LSA 不会泛洪到本地(子)网络之外。
- type 10 - Area Local Scope Opaque。此类型的 LSA 不会泛洪到其关联 area 的范围之外。
- type 11 - Opaque LSA,泛洪到整个 AS(范围与 type 5 相同)。它不会在 stub area 和 NSSA 中泛洪。
说明
在没有 ASBR 的情况下,网络中没有 LSA Type 4 和 5。
标准区域
此 area 支持 1、2、3、4 和 5 类型的 LSA。

一个使用默认 area 的简单多 area 网络。在此示例中,area1 中的所有网络都被泛洪到 backbone,而 backbone 中的所有网络都被泛洪到 area1。
R1
/ip/address/add address=10.0.3.1/24 interface=ether1
/ip/address/add address=10.0.2.1/24 interface=ether2
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.1
/routing/ospf/area
add name=backbone_v2 area-id=0.0.0.0 instance=v2inst
add name=area1 area-id=1.1.1.1 type=default instance=v2inst
/routing/ospf/interface-template
add networks=10.0.2.0/24 area=backbone_v2
add networks=10.0.3.0/24 area=area1
R2
/ip/address/add address=10.0.1.1/24 interface=ether2
/ip/address/add address=10.0.2.2/24 interface=ether1
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.2
/routing/ospf/area
add name=backbone_v2 area-id=0.0.0.0 instance=v2inst
/routing/ospf/interface-template
add networks=10.0.2.0/24 area=backbone_v2
add networks=10.0.1.0/24 area=backbone_v2
R3
/ip/address/add address=10.0.3.2/24 interface=ether2
/ip/address/add address=10.0.4.1/24 interface=ether1
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.3
/routing/ospf/area
add name=area1 area-id=1.1.1.1 type=default instance=v2inst
/routing/ospf/interface-template
add networks=10.0.3.0/24 area=area1
add networks=10.0.4.0/24 area=area1
Stub 区域
Stub area 的主要目的是防止此类 area 承载外部路由。从这些 area 到外部世界的路由基于默认路由。Stub area 可减小 area 中的数据库大小以及该 area 中路由器的内存需求。

Stub area 有一些限制。ASBR 路由器不能位于该 area 内部,并且 stub area 不能用作 virtual link 的中转 area。存在这些限制是因为 stub area 被配置为不承载外部路由。
此 area 支持 1、2 和 3 类型的 LSA。
考虑前面的示例。Area1 被配置为 stub area,这意味着路由器 R2 和 R3 不会从 backbone area 收到任何路由信息,只有默认路由除外。
R1:
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.1
/routing/ospf/area
add name=backbone_v2 area-id=0.0.0.0 instance=v2inst
add name=area1 area-id=1.1.1.1 type=stub instance=v2inst
/routing/ospf/interface-template
add networks=10.0.0.0/24 area=backbone_v2
add networks=10.0.1.0/24 area=area1
add networks=10.0.3.0/24 area=area1
R2:
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.2
/routing/ospf/area
add name=area1 area-id=1.1.1.1 type=stub instance=v2inst
/routing/ospf/interface-template
add networks=10.0.1.0/24 area=area1
R3:
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.3
/routing/ospf/area
add name=area1 area-id=1.1.1.1 type=stub instance=v2inst
/routing/ospf/interface-template
add networks=10.0.3.0/24 area=area1
如果未设置 default-cost 参数,则不会产生 stub area 的 type-3 默认 LSA。
Totally Stubby 区域
Totally stubby area 是 stub area 的扩展。Totally stubby area 阻止外部路由和汇总(inter-area)路由进入该 area。只有 intra-area 路由会被注入该 area。Totally stubby area 被配置为带附加 no-summaries 标志的 stub area。此 area 支持 Type 1、Type 2 LSA 以及带默认路由的 Type 3 LSA。
/routing/ospf/area
add name=totally_stubby_area area-id=1.1.1.1 instance=v2inst type=stub no-summaries
NSSA
Not-so-stubby area(NSSA)适用于需要注入外部路由,但不需要注入 type 5 LSA 路由的情况。有关 NSSA RFC 参考,另请参见理解 OSPF。

该图展示了两个 area(backbone 和 area1)以及一条到位于 area1 中的路由器的 RIP 连接。area1 必须配置为 stub area,但外部 RIP 路由也必须注入 backbone。在这种情况下,area1 应配置为 NSSA。
该配置示例不涵盖 RIP 的配置。
R1
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.1
/routing/ospf/area
add name=backbone_v2 area-id=0.0.0.0 instance=v2inst
add name=area1 area-id=1.1.1.1 type=nssa instance=v2inst
/routing/ospf/interface-template
add networks=10.0.0.0/24 area=backbone_v2
add networks=10.0.1.0/24 area=area1
R2
/routing/ospf/instance
add name=v2inst version=2 router-id=1.0.0.2
/routing/ospf/area
add name=area1 area-id=1.1.1.1 type=nssa instance=v2inst
/routing/ospf/interface-template
add networks=10.0.1.0/24 area=area1
信息
Virtual link 不能用于 NSSA area 之上。使用
nssa-translator参数来控制 type-7 到 type-5 的 LSA 转换。
外部路由信息和默认路由
在 OSPF 路由域的边缘,你可以找到运行其他路由协议之一的、称为 AS boundary router(ASBR) 的路由器。这些路由器的职责是将从其他路由协议学到的路由信息导入 OSPF 路由域。外部路由可以根据度量类型在两个不同的级别导入。
- Type1 - OSPF 度量值是内部 OSPF cost 与外部路由 cost 之和。
- Type2 - OSPF 度量值仅等于外部路由 cost。
提示
Type 1 外部路径总是优先于 type 2 外部路径。当所有路径都是 type 2 外部路径时,总是优先选择通告的 type 2 度量值最小的路径。(RFC2328) 外部路由可以通过多种方式导入,并按所列顺序处理:
- 选择匹配
redistribute或originate-default实例参数的路由。 - 如果指定了输出路由过滤器链:
- 如果使用了
redistribute或originate-default参数,则仅处理选中的路由。 - 否则,处理所有活跃路由。
- 如果使用了
- 在
out-filter-select中处理选中的路由。
仍然需要路由过滤器来设置路由 cost 和类型(在需要时)。
以下配置示例会选取并重分发所有静态和 RIP 路由:
/routing/ospf/instance
add name=v2inst version=2 router-id=1.2.3.4 redistribute=static,rip
默认路由的重分发是一种特殊情况,应使用 originate-default 参数:
/routing/ospf/instance
set v2inst originate-default=if-installed
当重分发由 originate-default 和 redistribute 参数控制时,默认路由过滤会出现一些边界情况。
- 如果启用了
redistribute,则选取所有匹配 redistribute 参数的路由。 - 如果
originate-default=never,则默认路由将被拒绝。 - 将选中的路由(如果未设置 redistribute 参数,则为所有路由)通过
out-filter-select处理(如果已配置)。 - 将选中的路由通过
out-filter-chain处理(如果已配置)。有关路由过滤器参考,请参见/routing/filter。 - 如果
originate-default设置为always或if-installed:- OSPF 会创建一个不带属性的假默认路由。
- 将此路由通过
out-filter-chain处理,在此期间可以应用属性,但动作会被忽略(始终接受)。
有关重分发值的完整列表,请参见 /routing/ospf/instance。
路由汇总
路由汇总是将多条路由合并为单条通告。它在 area 边界(Area Border Router)上完成。
你应向 backbone 方向进行汇总。这样,backbone 会收到所有聚合路由,并将它们以已汇总的形式注入其他 area。存在两种类型的汇总:inter-area 和外部路由汇总。
Inter-area 路由汇总在 area 边界(ABR)上工作。它不适用于通过重分发注入 OSPF 的外部路由。默认情况下,ABR 会为特定 area 中的每条路由创建一条 summary LSA,并在相邻 area 中通告。
Range 允许为多条路由只创建一条 summary LSA,并只向相邻 area 发送单条通告,或完全抑制通告。
如果使用 advertise 参数配置了 range,则只要特定 area 在该 range 下有任意路由,就会为每个 range 通告一条 summary LSA。否则(当 advertise 参数被禁用时),不会创建任何 summary LSA,也不会在 area 边界之外通告。
Inter-area 路由汇总可以从 /routing/ospf/area/range 菜单进行配置。
考虑两个 area:backbone 和 area1。Area1 有若干来自 10.0.0.0/16 范围的 /24 路由,当可以汇总时,你不必用每个 /24 子网来泛洪 backbone area。在连接 area1 与 backbone 的路由器上,你可以设置 area range:
/routing/ospf/area/range
add prefix=10.0.0.0/16 area=area1 advertise=yes cost=10
有关 advertise 和 cost 参数的参考,请参见 /routing/ospf/area/range。
信息
对于活跃的 range(即至少有一条来自指定 area 的 OSPF 路由落在其下的 range),会创建一条类型为 'blackhole' 的路由并安装到路由表中。 外部路由汇总可以通过使用路由过滤器来实现。考虑与上一个示例相同的示例,只是 area1 重分发了来自其他协议的 /24 路由。要发送单条汇总 LSA,请添加一条黑洞路由并配置适当的
/routing/filter/rule以仅接受该汇总路由:
/ip/route/add dst-address=10.0.0.0/16 blackhole
/routing/ospf/instance
set v2inst out-filter-chain=ospf_out
/routing/filter/rule
add chain=ospf_out rule="if (dst == 10.0.0.0/16) {accept} else {reject}"
Virtual Link
所有 OSPF area 都必须连接到 backbone area,但有时物理连接无法实现。为克服这一限制,可以使用 virtual link 在逻辑上连接 area。
有两种常见的使用 virtual link 的场景:
- 将碎片化的 backbone area 粘合在一起。
- 连接没有直接连接到 backbone 的远程 area。
分区 Backbone
OSPF 允许使用 virtual link 将 backbone area 的不连续部分连接起来。当两个独立的 OSPF 网络合并为一个大型网络时,可能需要这样做。Virtual link 可以配置在分别从两侧接触 backbone area 且具有公共 area 的不同 ABR 之间。

当不存在公共 area 时,可以创建额外的 area 作为中转 area。上一张图对此进行了说明。
当非 backbone area 发生分区时,不需要为它们建立 virtual link。OSPF 不会主动尝试修复 area 分区。当某个 area 发生分区时,每个部分就简单地成为单独的 area。Backbone 在新 area 之间执行路由。某些目标可通过 intra-area 路由到达。area 分区需要 inter-area 路由。
然而,要在分区后维持完整路由,地址范围不能跨越 area 分区的多个部分拆分。考虑使用 BFD 来实现 virtual link 上更快的故障检测。
没有到 Backbone 的物理连接
某个 area 可能没有到 backbone 的物理连接。Virtual link 为断开连接的 area 提供到 backbone 的逻辑路径。必须在共享公共 area 的两个 ABR 之间建立链路,且其中一个 ABR 连接到 backbone。

R1 和 R2 都是 ABR,且 R1 连接到 backbone area。Area2 将用作 transit area,R1 是进入 backbone area 的 entry point。必须在两台路由器上都配置 virtual link。
在 /routing/ospf/interface 菜单中添加 virtual link 配置。必须在两台路由器上都配置 vlink-transit-area 和 vlink-neighbor-id 参数。基于该图的配置如下:
R1:
/routing/ospf/interface
add vlink-transit-area=area2 area=backbone_v2 type=virtual-link vlink-neighbor-id=2.2.2.2
R2:
/routing/ospf/interface
add vlink-transit-area=area2 area=backbone_v2 type=virtual-link vlink-neighbor-id=1.1.1.1