天天看点

简述ospf的工作原理_OSPF 一文详解

动态路由

在之前的文章中,介绍了基于距离矢量的路由协议。而在今天这这一部分中会主要讲解链路状态的路由协议,对于动态的路由协议来说,需要具备如下的能力:

发现远端网络

路由器可以直接获得直连路由,这是由路由器的接口 IP 地址得到。动态路由能够自动学习远端目的路由条目。

维护和更新路由信息

路由信息保存在路由器的路由表中。但路由的情况有时会发生变动。动态路由支持自动更新这些变化

在多个到达目的网络的路径之中选择最优路径

有时,路由协议会计算出到达同一目的网络的多条可用路径,路由协议需要有办法在多条路径之中选出最优的一条用于转发数据。

在当前路径不可用时发现一条新的可行路径的能力

我们给这种过程(网络发生变化后,路由协议重新对路由进行计算并与其它路由器交换路由信息)起了一个名字,叫收敛。收敛的最终结果是网络重新回到一个稳定的正确的工作状态。收敛的速度越快越好,是体现路由协议性能的重要指标。

链路状态路由协议

在介绍具体 OSPF 协议前,先来比较一下链路状态路由协议和距离矢量路由协议的区别:

  • 链路协议具有更好的扩展性,比如 RIP 只能最多有 15 台路由器,而 OSPF 没有这个限制。
  • 每个路由器都有一张完整的拓扑结构(LSDB)
  • 周期的触发更新(LSA,后面会提到)
  • 在在拓扑有更新时,链路状态的反应速度会更快
  • 路由器之间可以交流更多的信息。

链路状态协议的数据结构:

简述ospf的工作原理_OSPF 一文详解

这里简单说一下过程,假设上面四台路由器中都遵从链路状态协议,在每台路由器启动后,会将 LSA 以泛洪的方式传递给其他路由器,进而在每个路由器中构建出完整的拓扑信息。然后按照最短路径的优先算法,以自己为树根,将到达其他网络的最优路径放入到路由表中。

OSPF

OSPF 特性

开放是指 OSPF 是一种基于开放标准的路由选择协议,其中 OSPFV2 参考 RFC2328,OSPFV3 参考 RFC5340. 路径最短优先是指 OSPF 在路由选择上采用 Dijkstra 所提出的最短路径算法。

OSPF 是基于链路状态的路由协议。(链路状态指这个路由器与哪些路由器相邻,以及它们之间链路的"度量")。OSPF 使用带宽、延迟、负载、距离和费用等多种元素来考虑度量,度量越小,代价越小。

每个使用 OSPF 的路由器中拥有整个拓扑,并且不传递路由,仅仅是发送链路状态通道 (LSA)。

OPSF 使用触发更新加增量更新。(OSPF 有一个非常缓慢的周期更新)

作为对比,RIP 使用周期更新加完整更新(RIP 也具有触发更新的机制) 触发更新:当拓扑发生变化时,立即发送更新。 周期更新:每经过一个时间周期,发送一次更新。 增量更新:只发送变化部分的路由信息。 完整更新:发送所有路由信息

OSPF 有可扩展性(适合大型网络-几百台),以及快速收敛的能力(但比 EIGRP 差,比 RIP 好)

独立于传输层,数据包封装在 IP 报文中。

支持 VLSM

支持手动汇总

支持认证

工作原理

每个路由器回周期性的向相邻路由器发送探测报文(Hello 报文),检测其是否可达。如果邻站给予应答,说明链路正常;否则说明链路出现故障。

如果一个路由器检测到某条链路状态协议发生变化,该路由器就发送链路状态更新报文,采用泛洪操作对全网更新链路状态。

泛洪指某个路由器收到更新报文后都将这个报文发送给自己的相邻路由器,直到报文送到整个网络

即使链路状态没有发生变化,每隔 30min 路由器要向网络中的其他路由器广播链路状态信息,以保证链路状态数据库和全网保持一致。

每个路由器收到其他路由器的链路状态信息后,更新链路状态数据库,构建整个网络的拓扑图,利用 Dijkstra 的最短路径算法计算出到达每个网络的最短路径(就是路由表中的内容)。

工作过程

链路状态路由协议的主要工作原理是:

简述ospf的工作原理_OSPF 一文详解

通过让拓扑中的每台路由器都在整个拓扑的范围内泛洪自己的链路状态通告(LSA),每台路由器都会获得整个拓扑中其它所有路由器的 LSA。

用这些 LSA 生成全拓扑统一的链路状态数据库(LSDB),再使用 SPF 算法计算出一个 SPF 树(每台路由器以自己为起点到达拓扑中所有子网的树形结构)。

然后将最优的路径装载到路由表中。

这个工作过程类似于拼图。每台路由器生成的 LSA 相当于一块地图的碎片,用可靠的机制泛洪这些地图碎片后,每个路由器都能获得一个整张拓扑的地图,这个地图就是 LSDB。

总结就是如下过程:

  1. 发现邻居,建立并维护邻居关系
  2. 生成 LSA,每台路由器都会生成自己的 LSA
  3. 泛洪 LSA,使用 OPSF 自身具备可靠传输能力将 LSA 泛洪到 区域中 的其它路由器上
  4. 将收到的 LSA 组装成LSDB,根据 SPF 算法计算出到达拓扑中所有网络的最短路径
  5. 将计算得出的路由装载到路由表

OSPF 问题 - 分层架构的出现

问题

OSPF 在很多方面有着很大的优势,但也存在着问题随着网络规模越大资源消耗呈指数增长,限制扩展性。网络的带宽和资源的消耗会随着设备数量的增加而增加,因为每台路由器都需要维护 LSDB 的最新状态,以及当发生更新时,进行泛洪的通告。

解决方式

OSPF使用两级区域划分,所有区域被分为普通区域和骨干区域。区域用一个 32bit 的数来进行标识。可以用点分十进制的方法,也可以直接用一个十进制数标识。唯一需要注意的,骨干区域区域号固定为0。骨干区域只有一个,且必须连续。

区域在进行规划的时候,一般要根据一个区域内路由器的型号,性能,以及负载来进行设计,通常一个区域中的路由器数量为30到100台左右。

区域在进行规划的时候,一定要注意,所有普通区域必须与骨干区域直接相连。这样要求主要是为了 OSPF 区域间防环。

由于 SPF 算法本身可以保证 OSPF 在区域内部无环路,所以区域间防环主要依靠网络设计来解决。

因为 OSPF 在区域间使用类似距离矢量路由协议的路由传递方式,所以不能保证没有环路,

所以区域之间采星型的拓扑结构,通信都要经过骨干区域,区域与区域之间无法单独通信,进而无法形成环路。

进而将路由器分成了几类:

  1. 区域内部路由器(所有的接口都位于同一区域)
  2. 区域边界路由器(ABR)(有不同的接口位于不同的区域且其中一个为骨干区域)。ABR 路由器的性能要求更高,因为需要同时装载不同区域的 LSDB。
  3. 自治系统边界路由器(ASBR)(进行重分布操作,将其它路由器源学习到的路由引入 OSPF 的路由器)
  4. 骨干路由器(BR)(只有一个接口位于骨干区域)
简述ospf的工作原理_OSPF 一文详解

这样的设计,是每个路由器仅装载本区域的 LSDB,大大提升了效率。而对于 ABR 这样的路由器来说,由于横跨多个区域,所以需要装载不同的区域的路由器,自然要求的性能也比较高。在访问不同的区域的网络时,不需要传递 LSA,而是传递路由信息,使得效率进一步提高。

OSPF 报文类型

  1. Hello 报文,用于 OSPF 邻居动态发现,邻居参数协商,邻居关系维护。
  2. DBD 报文,数据库描述。
  3. 用于传递 LSDB 摘要信息,实际上是 LSDB 中 所有 LSA 的头部信息。OSPF 路由器通过交换 DBD 报文,来统计自己缺少的 LSA 并向对端发送 LSR 报文进行请求
  4. 用于主从路由器的选举
  5. LSR 报文,用于向邻居请求自己 LSDB 中没有的 LSA
  6. LSU 报文,LSU 用于给邻居发送它们请求的 LSA,只有 LSU 报文中会包含完整的 LSA
  7. LSAck 报文,LSAck 用于向邻居确认收到的 LSU,如果没收到 LSAck 的话,邻居会不断重传请求的 LSU。注意区分 LSA 和 LSAck
注意 LSA 本身不是报文

邻居与邻接

OSPF 邻居关系,分为邻接和邻居两种。LSA 只在邻接关系的邻居之间同步,普通邻居关系之间不同步 LSA 信息。

邻居关系:路由器之间仅通过 Hello 报文,知道目前处于同一区域。

邻接关系:在邻居关系的基础上,DR 和 BDR 之间互相发送 LSA。

我们知道,在运行着多台 OSPF 的路由器中,为了让对方能够发现自己,需要互相发送 HELLO 消息,建立邻居关系。接着发送在路由器之间传送 LSA 碎片。但这就有一个问题,由于每台路由都需要知道完整的拓扑信息,所以所有路由器都需要广播和接受 LSA 的碎片,假设有 n 个路由器之间连接邻接关系,那么将需要建立 n(n-1)/2 个邻接关系。这无疑是对网络资源的很大损耗。

为了解决这个问题就提出了一个 DR 和 BDR 的概念,将路由器的类型分为三种:

DR: 选举成功的路由器 - 理解成掌门

BDR:作为backup 的路由器 - 理解成副掌门,时刻监听掌门状态,掌门一死,副掌门就是掌门。

Other:未选举成功的其他路由器。

接着在一个多路访问链路上,所有的路由器都需要与 DR 路由器建立邻接关系,同时也要与 BDR 路由器建立邻接关系,DR Other 之间,只建立邻居关系,不会同步数据库信息。换句话说,区域中的普通路由器只和老大和老二建立关系。进而依靠这种方式降低 OSPF 进程对路由器资源占用的。

OSPF 建立邻居过程

Hello 报文:用于动态邻居发现,邻接参数协商,邻接关系保持。

动态邻居发现:OSPF 的邻居关系,在支持广播(支持组播)的链路上,可以自动建立,而不需要管理员进行显式配置。通过向组播地址(224.0.0.5)发送 OSPF Hello 包,OSPF 能动态发现链路上的其它 OSPF 路由器。

Other -> DR/BDR 组播发送:224.0.0.6

DR -> Other 组播发送:Other 会监听 224.0.0.5 的 IP,接受 DR 的 LSA

选举步骤:

判断网络中是否有 DR 和 BDR:

  • 如果网络中有 DR,BDR 新加入的路由要承认
  • 如果有 DR,没有 BDR,选择 BDR
  • 没有 DR,有 BDR,则 BDR 晋升为 DR,选举 BDR

选举 DR 和 BDR 的过程:

  1. 区域内中所有路由器发送 Hello 报文,进行 PK 选举出 BDR。
  2. 原则是先比较 Hello 报文中的优先级(0 - 255),其次 Router ID。
  3. 称为BDR后,监听网络中是否存在 DR,没有再晋升为 DR.

如果想要重新选举,则要重启 OSPF 进程。如果是两个运行 OSPF 的网络整合在一起,如果都存在 DR 和 BDR,则两个网络中 DR 和 BDR 同层次进行比较。

选举成功后:

  1. DR Other 和 DR,BDR 之间是邻接关系
  2. DR 和 BDR 之间是邻接关系
  3. DR Other 之间是邻居关系
  4. DR other 监听组地址是 224.0.0.5
  5. DR BDR 监听组地址 224.0.0.5, 224.0.0.6(BDR 和 DR 之间通信)

邻居协商参数

  1. Router-ID,路由器标识符。两台路由器想建立 OSPF 邻居关系,Router-ID 必须不同。Router-ID 可以由管理员进行手工配置,一个点分十进制的 32bit 值。
  2. 如果管理员没有显式配置 Router-ID,路由器获取自身最大的环回接口 IP 地址作为自己的 Router-ID
  3. 如果没有配置环回接口,则获取最大物理接口 IP 地址作为自己的 Router-ID。推荐对 Router-ID 进行手工配置。
  4. Hello Interval&Dead Interval,Hello 计时器和死亡计时器。默认在高速链路上,为10秒 40秒。当 Hello 计时器超时,路由器将发送Hello 报文,当死亡计时器超时,路由器将会断掉与该邻居的邻居关系。而每次从邻居收到 Hello 报文将重置死亡计时器。建立邻居关系的路由器要求拥有完全一致的 Hello 和 Dead Interval。
  5. Active Neighbors,活跃邻居,一个发送 Hello 报文路由器的邻居列表。
  6. Area ID,区域号,代表该接口属于哪个 OSPF 区域。建立邻居关系的两个路由器(两个接口)必须属于同一个区域。
  7. Router Priority: 接口的优先级,影响 DR,BDR 选举。越大越好,默认为 1,最大为 255,当优先级为 0 时,代表不参与 DR,BDR 选举。
  8. DR 指定路由器,BDR 备份指定路由器。在每个链路上通过选举产生,路由器优先级越大越好,当优先级都相等时,选举 Router-ID 最大的路由器。
  9. Authentication Type&Date,认证类型与认证数据,认证类型指示邻居关系使用什么方式进行认证(空:不认证,明文认证,MD5 摘要认证),默认使用空认证且不携带认证数据。认证类型或认证数据不一致都会导致 OSPF 邻居建立失败。
  10. Stub Area Flag 末节区域标记,建立邻居的路由器必须拥有完全一致的末节区域标记。

OSPF状态机-建立邻接状态过程

简述ospf的工作原理_OSPF 一文详解
建立邻居关系: 1. Down 初始状态

与邻居之间的接口没有宣告 OPSF 进程。某些情况下也会让邻居处于 DOWN 的状态比如链路两端分别为点到点和点到多点网络类型

2. Init 初始化状态

从邻居收到一个 Hello 包,其中不包含自己的 Router-ID。会让自己处于初始化状态。如果链路存在单向链路问题,会让邻居关系保持在初始化的状态无法继续向前迁移。

3. Attempt(NBMA)尝试状态

每 poll 时间(120秒)向对面发送一个 Hello 包尝试建立一个邻居关系。只在低速的 NBMA 链路上出现。

3. 2-WAY 双向通信状态

收到邻居发来的 Hello 包,且其中包含自己的 router-id,则认为与邻居之间的双向通信已经建立,进入 2-WAY 状态。

2-WAY 状态邻居两端需要进行如下操作:

  • 先判断网络类型,是否需要选举 DR,BDR
  • 如果不需要选举 DR,BDR,则直接转换到 EX-START。
  • 如果是广播型或 NBMA 网络,则选举 DR, BDR。
  • 判断邻居之间是否需要建立邻接关系。
  • 这个是邻居路由器之间的稳定工作状态。
  • 当 DR,BDR 选举结束,且邻居之间需要建立邻接关系,则继续向 ExStart 状态迁移。
建立邻接关系:
简述ospf的工作原理_OSPF 一文详解
4. ExStart

该状态下路由器的主要任务是选举主从路由器主导 DBD 的交互。发送空的,标志位置位情况为 111 的 DBD 报文来进行主从选举, 确定初始序列号,比较接口 MTU.

  • 当从路由器发出标志位置位情况为 010 或 000 的报文后,则进入 Ex-Change 状态。
  • 如果接口的 MTU 设置不一致,则邻居关系会停留在 ExStart 状态

为什么要进行主从的选举?

想象有 R1,R2 两台路由器。其中 R1 共有 1000 个 LSA 碎片,对应 DBD 假设共有 10 个。而 R2 有 300 个 LSA 碎片,DBD 有 3 个。假设只能一次发送一个 DBD. 如果没有主从关系的话,R1 和 R2 直接会向对方发送,但这就存在对方可能没有收到的情况,到时数据库不一致。

但如果先选择了主从关系后,这里假设 R1 为主,R2 为从。这时 R1 需要给 R2 发送 10 个 DBD。R2 需要给 R1 发送 3 个 DBD。由 R1 先给 R2 发送第一个 DBD 报文,R2 收到后将自己的 DBD 报文再发送 R1。R2 给 R1 恢复,表明两件事。第一之前的 DBD 我收到了。并把自己的 DBD 发送 R1。R1 收到后给 R2 发送第二个 DBD 报文,同样表示之前的 DBD 收到了,下面是序号为 2 的 DBD 报文。假设某次没有收到对方的回复,则会重复发送。这样就保证了可靠性。

如果想 R1 和 R2 DBD 数量不对等的情况,如第三次 R2 给 R1 发送了序号为 3 的 DBD 报文,自己所有的 DBD 都已经发送 R1了。之后再给 R1 的回复中就是空报文,表示 R1 给自己的报文收到了,并且自己已经没有要发送的报文了。

5. ExChange

通过发送 DBD 报文,同步数据库结构。 当主发出 001,从回复 000 报文的时候,DBD 报文交互结束。根据链路状态请求列表的情况,进入 Loading 或者 Full 状态。 Loading 继续发送 LSR,请求数据库中缺少的 LSA。同步数据库。 Full 数据库同步完成。一个邻接关系成功建立。Full 是邻接关系的稳定工作状态。

在哪些情况下需要选举 DR,BDR? 根据链路类型进行选择 (点对点不选,以太网线选)

为什么要在多路访问网络当中选举 DR,BDR ? 为了减少邻接关系的数量,减少 LSA 的泛洪流量,减少 CPU 资源和链路带宽的占用。

如何选举 DR, BDR? 根据接口优先级。优先级越大,越可能称为 DR。默认优先级为 1,优先级为 0 时,代表不参与选举。如果优先级相同,则比较 Router-ID 来进行选举,Router-ID 大的路由器,成为 DR

6. Loading State:

加载收到的 DBD 的内容,发现本地缺少的 LSA,接着取请求需要的 LSA。收到 LSR 报文,回复 LSU 报文。

7. Full State

回复对方收到了需要的 LSA。回复 LSAck 报文。

OSPF 邻居无法建立原因汇总

  1. 邻居路由器发送的 HELLO 包中,Router-ID 字段相同
  2. 邻居路由器发送的 HELLO 包中,Area-ID 与本端接口 Area 宣告不一致,邻居无法建立
  3. 邻居两端认证类型不一致,邻居无法建立
  4. 邻居两端认证数据不一致,邻居无法建立
  5. 邻居两端接口掩码配置不一致,邻居无法建立
  6. 邻居两端的 Hello-interval 配置必须一致,否则邻居无法建立
  7. 邻居两端的 dead-interval 配置必须一致,否则邻居无法建立
  8. 如果邻居两端末节区域标记不一致,则邻居无法建立

抓包 OSPF 通信过程

简述ospf的工作原理_OSPF 一文详解

选取 DR 和 BDR 的区别

这里首先假设 R1,R2,R3 已经配置了 OSPF 的协议。

这时我们将 R1 宣告的 12.1.1.0 网络删除掉,在 R2 查看邻居状态:

Router#show ip ospf neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
34.1.1.1          1   FULL/DR         00:00:31    23.1.1.2        Ethernet0/1
12.1.1.1          1   FULL/BDR        00:00:39    12.1.1.1        Ethernet0/0
           

可以看到, 没有立马消失,在 Dead time 到达 0 时,会将 12 网络删除。

之后在 R1 网络上重新宣告,在 R2 上可以看到,非常快就建立邻接关系成功了:

Router#show ip ospf neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
34.1.1.1          1   FULL/DR         00:00:30    23.1.1.2        Ethernet0/1
12.1.1.1          1   FULL/BDR        00:00:38    12.1.1.1        Ethernet0/0
           

但是如果我们把,R1 和 R2 宣告的 12 网络都删掉,再重新宣告,就会发现状态卡在 2-Way 状态很长时间:

Router#show ip ospf neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
34.1.1.1          1   FULL/DR         00:00:35    23.1.1.2        Ethernet0/1
12.1.1.1          1   2WAY/DROTHER    00:00:33    12.1.1.1        Ethernet0/0
           

这里卡成的时间,是在选举 DR 和 BDR,可见 DR 和 BDR 的选举在是非常影响网络的性能的。

链路的状态变化

从 down 状态到 init 状态:
简述ospf的工作原理_OSPF 一文详解

可以看到这时发送的 Hello 包发往 224.0.0.5 组播地址。并且报文里,没有记录活跃的邻居。

init 到 2-way 状态:
简述ospf的工作原理_OSPF 一文详解

这时 R1 收到了 R2 的 Hello 报文,并告诉对方我的邻居是你,这时就可以成为 2-Way 状态了。对应就是 Active Neighbor 字段,这里是 23.1.1.1 是因为 R2 的 router-id 没有指定,也没有 loopback 接口,所以用的是物理接口。

2-way到 exstart状态:
简述ospf的工作原理_OSPF 一文详解

红框的部分,就是通过发送空的 DBD 报文,置位 111 进行主从选举的过程。

Exchange状态到 Full 状态:
简述ospf的工作原理_OSPF 一文详解

R1 发送 LSR 报文,获取缺少的链路状态。R2 回复 LSU 报文。之后发送 LSU 到组播,然后对方进行 Ls Ack 进行确认。

OSPF 基本 Header

简述ospf的工作原理_OSPF 一文详解
  • version: ospf 版本
  • Message Type: 共有五种报文
  • Packet Length:包括 Header Ospf 总长度
  • Source OSPF Router:发送者的 Router-id
  • Area ID:发送接口表示所在区域
  • Checksum: 整个数据包的校验和
  • Auth Type:
  • 0:没有认证
  • 1:明文认证
  • 2:MD5 认证

Auth Data: 所需要的认证信息

Hello 报文

简述ospf的工作原理_OSPF 一文详解
  • Network Mask: 发送接口的网络掩码
  • Hello Interval [sec]: Hello 报文发送的时间间隔
  • Options: OSPF 启用的功能
  • Router Priority: 优先级,用于 DR 和 BDR 的选举
  • Router Dead Interval [sec]: 路由失效周期
  • Designated Router: 选举出的 DR IP
  • Backup Designated Router: 选举出的 BDR IP
  • Active Neighbor: 当前的邻居,在刚开始的 Hello 包中并没有

DBD 报文

空 DBD 用于选举:

简述ospf的工作原理_OSPF 一文详解

正常 DBD 用于同步状态:

简述ospf的工作原理_OSPF 一文详解
  • Interface MTU: 在数据包不分片的情况下,始发路由器接口可以发送的最大 IP 数据包的大小,如果 MTU 不一致,会导致邻接关系无法建立
  • Options: OSPF 启用的功能
  • DB Description:
  • R:保留位
  • I:Init = 1,代表此报文用于选举主从,I = 0,表示主从选择完毕,发送带摘要信息的 DBD.
  • M:M = 1,表示 DBD 并未发完,后续还有。M = 0,报名此 DBD 报文最 last DBD.
  • MS: 表示主从位,MS=1 为 Master,=0 为 Slave.
  • DD Sequence: DBD 的序列号,主从双方利用序列号来确保DD报文传输的可靠性和完整性
  • LSA - type: LSA 头部信息

LSR 报文

简述ospf的工作原理_OSPF 一文详解
  • LS Type: LSA 种类
  • Link State ID:根据 LS Type 而变化
  • Advertising Router: 始发这条 LSA 的路由器的 Router Id.

LSU 报文

简述ospf的工作原理_OSPF 一文详解
  • number of LSAs: 包含 LSA 的数量
  • LSA :具体的 LSA 信息

LS ACK 报文

简述ospf的工作原理_OSPF 一文详解

OSPF 网络类型

简述ospf的工作原理_OSPF 一文详解

Point-to-Point:点到点网络,不需要选择 DR 和 BDR,二层封装为 P2P 和 HDLC

Broadcast:二层协议为以太网协议,为广播型,需要选 DR 和 BDR,解决 LSA 泛洪的类型

NMA:二层协议为帧中继,为低速网络,已经淘汰

P2MP:需要管理员手动配置,为帧中继网络使用

P2MP-nobrocast:P2MP 的子类,帧中继网络,已经淘汰

Loopback:环回口网络类型,会将环回口路由掩码设置为 /32. 通过修改网络类型来改变掩码。

其中 P2P,Broadcast:发送 Hello 间隔为 10s

NMA P2MP P2MP-nobrocast :发送 Hello 周期为 120s

LSA 类型

OSPFV2 中共有 6 中 LSA:

  • Router LSA (TYPE 1)
  • Network LSA (TYPE 2)
  • Network Summary LSA (Type 3)
  • SABR Summary LSA (Type 4)
  • AS-External LSA (Type 5)
  • NSSA LSA(Type 7)

从如下角度考虑 LSA:

  • 由谁始发
  • 传播范围
  • 作用

Router LSA : 一类 LSA

只要运行 OSPF,都会产生,在区域内传播,描述了路由器的链路状态和开销,可根据一类 LSA 还原拓扑结构

简述ospf的工作原理_OSPF 一文详解

LSA 头部:

  • Age:16 bit,后 15 位表示 age,最多在数据库存在 3600s,LSA 每 1800s 泛洪一次,最高位为 1 表示 LSA 在 LSDB 永不老化.
  • Option: 表示 LSA 支持的可选性能
  • LS Type:标识 LSA 类型, 这里是类型1
  • Link State ID:产生该 LSA 路由器的 Router ID
  • advertising Router:产生该 LSA 路由器的 Router ID
  • Sequence Number:识别 LSA 新旧问题,初始值从Ox80000001 开始
  • Checksum:对 Age 外的字段进行校验
  • Length:包含 LSA 头部的 LSA 大小

LSA 内容:

  • Flags:
  • V:1 表示始发路由器是一条或者多条具有完全邻接关系的虚链路的端带
  • E:1 表示始发路由是一个 ASBR 路由器
  • B:1表示是 ABR 路由器
  • Number of links:链路的数量
  • Type:OSPF 定义了四种 Link 类型(根据网络类型不同)
  • | | Link Type | Link ID | Link Data | | ---- | --------------------- | ------------------------ | ----------- | | 1 | P2P(P2P 网络) | 邻居路由器的 Router ID | 自己接口 IP | | 2 | Transit(广播型网络) | DR 的接口 IP 地址 | 自己接口 IP | | 3 | Stub(描述环回接口) | IP 所在网络 | 子网掩码 | | 4 | Virtual-Link | 虚拟邻居路由器 Router ID | 本虚链路 IP |
  • number of Metrics:开销 metrics

Network LSA:二类 LSA

网络 LSA,由 DR 产生,区域内传播,描述了 DR 所在网络中的网络信息和拓扑信息

简述ospf的工作原理_OSPF 一文详解

LSA 头部:

  • Age:16 bit,后 15 位表示 age,最多在数据库存在 3600s,LSA 每 1800s 泛洪一次,最高位为 1 表示 LSA 在 LSDB 永不老化.
  • Option: 表示 LSA 支持的可选性能
  • LS Type:标识 LSA 类型, 这里是类型 2
  • Link State ID:DR IP 地址
  • advertising Router:产生该 LSA 路由器的 Router ID
  • Sequence Number:识别 LSA 新旧问题,初始值从Ox80000001 开始
  • Checksum:对 Age 外的字段进行校验
  • Length:包含 LSA 头部的 LSA 大小

LSA 内容:

network mask:网络掩码,用于表示 Transit 网络使用的网络掩码

Attached:由哪些路由器连到网络中,列出 MA (multiple access多路访问,广播型) 网络中与 DR 形成邻接关系,包括自身的 ID.

伪节点:二类 LSA 是 DR 代替伪节点产生的。为了方便表示广播网络中的 Metric 开销和表示。

Network Summary LSA : 三类 LSA

由 ABR 产生,

在区域内传播

,描述区域内某个网段的路由。

由于 ABR 具有 Area 0 和 Are1 的两个数据库,为了传输的方便和性能,会将数据库的信息转换为路由信息进行传输。比如这里的 R2,会将 Area 0 的数据库转换为路由信息,发送给 Area1 里的路由器。将 Area 1 的数据库转换为路由信息,发送给 Area0 里的路由器。发送的报文就是网络汇总 LSA - 三类 LSA.

简述ospf的工作原理_OSPF 一文详解
  • Link State ID: 网络号
  • Network Mask:子网掩码
  • Metric:度量值
  • Advertising Router:产生报文的路由器

在 R2 查看 3 类 LSA 信息,可以发现在 Area 0 中,自己产生了

12

网段的路由信息。

Router>show ip ospf database

            OSPF Router with ID (2.2.2.2) (Process ID 100)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
2.2.2.2         2.2.2.2         329         0x80000004 0x00D40D 1
3.3.3.3         3.3.3.3         312         0x80000007 0x004032 2
4.4.4.4         4.4.4.4         245         0x80000005 0x00199F 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
23.1.1.1        2.2.2.2         329         0x80000002 0x00EE14
34.1.1.2        4.4.4.4         245         0x80000002 0x005D89

                Summary Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
12.1.1.0        2.2.2.2         329         0x80000002 0x00FB20
45.1.1.0        4.4.4.4         245         0x80000002 0x0011E1
           

在 R1 上查看引入的路由(区域间的路由,不是本区域的路由):

简述ospf的工作原理_OSPF 一文详解

AS-External LSA:五类 LSA

由 ASBR 产生,描述 AS 外部的路由信息,如果将外部路由在 OSPF 区域内,做了重分布(redistribute ), 则会在整个 OSPF (AS)内泛洪。

如 R6 中并没运行 OSPF,在 R6 的回环接口上配置 6.6.6.6/24 的 IP, 这时在 R5 就会通过静态路由的方式,通过重分布引入 AS,然后将去往 6.6.6.6/24 网络的数据包通过 E0/1 转发给 R6.

在 R4 E0/1 抓包 ,可以收到五类 LSA 的更新:

简述ospf的工作原理_OSPF 一文详解
  • Link State ID:目标网络
  • Netmask: 网络子网掩码
  • Advertising Router:始发该报文的 Router ID
  • Options - E 位: 用于更改引入 OSPF 外部路由的 Metric 计算方式
  • 置位 1:为 E2 类型, 仅仅计算外部开销。在思科设备中,默认为 20,永远为 20.
  • 置位 0:为 E1 类型, 计算外部和内部开销.
  • Forwarding Address:转发地址,用于优化网络,解决网络中次优路由的问题(多台路由器接口,在同一网络)。
  • 转发地址为 0.0.0.0, 则会将数据包报转发至始发 ASBR 上。
    • 在 ASBR 上,如果引入外部路由的外部接口不参与 OSPF,则为全 0
  • 转发地址非 0 ,则会将数据包转发至 FA 地址。
    • 在 ASBR 上,满足下面则 FA 不为 0,IP 为 是 ASBR 路由器 AS 外部邻居的接口 IP 地址
    • ASBR 外部接口参与 OSPF
    • 该接口网络类型不是 P2P 或 P2MP
    • 该接口不能是被动接口

ASBR Summary:四类 LSA

ABR 产生,描述到 ASBR 的路由,整个 AS 区域内传播(ASBR 区域除外).

这时考虑,当 R1 在知道五类 LSA 的信息后,知道要去往 6.6.6.0/24 网络,需要找 Router-Id 为 5.5.5.5 的路由器。但由于并不知道 5.5.5.5 路由器的路由信息,所以就需要四类 LSA,要告知其需要的路由。由 ABR - R4 产生。

在 R3 E 0/1 口进行抓包:注意报文格式和三类 LSA 一样。

简述ospf的工作原理_OSPF 一文详解

AS External Link States - 7 类 LSA

由 ASBR 产生,描述 AS 外部路由,NSSA 区域内传播。

OSPF 特殊区域:在一些场景下,由于某些路由器的性能不高,不足以接受和计算特别大量的路由信息,减小链路状态数据库,会将这样的区域配置成特殊区域。

特殊区域的类型:

  • Stub 区域:末节区域,Stub 区域的 ABR 不传播接受到的自治系统外部路由。一般在该区域,只会有一类,二类,三类 LSA。默认情况下,Stub 区域中的 ABR 会向 Stub 区域自动通告三类 LSA OIA 的缺省路由。默认路由,开销值为 1.
  • 完全 Stub 区域:在 Stub 区域的基础上,也不允许区域间的路由传播。不发送三类 LSA,仅有一类和二类的 LSA。配置时需要在所有 ABR 设备上进行 no-summary 配置。
  • NSSA 区域:Not So Stubby Area. 外部区域引入的路由不要,但是本身区域想要可以引入外部路由。NSSA 区域没有 LSA 5,但允许外部路由通告到 NSSA 区域。通过 NSSA 内的 ASBR 发送 LSA 7 类将外部路由通告到 NSSA 区域中。在 NSSA 区域内泛洪,存在 1,2,7 类 LSA。
  • NSSA 区域不会通告默认路由,需要在 ABR 上手动下发路由
  • 完全 NSSA 区域:完全非末节区域。不予许区域间路由进入,仅存在 LSA 1, 2, 7 和 LSA 3 类默认路由的信息。配置时需要在所有 ABR 设备上增加关键字 no-summary.
  • 由于 7类 LSA 只能在 NSSA 区域内泛洪,需要 NSSA 区域 ABR 将 LSA7 转换成 LSA5 进行泛洪。如果存在多台 ABR,由 Router-Id 大的路由器泛洪。

开销计算

OSPF 使用 Metric 组委度量值,Metric 越低,表示路径越好。默认情况下,接口的开销与接口带宽成反比。,带宽越高则开销越低。

在思科设备上,OSPF 开销计算公式:

Metric = 参考带宽 / 实际带宽

  • 默认参考带宽为 10^8 bit/s

cost = 10^8 / 10 mbps = 10

cost = 10^8 / 100 mbps = 1

cost = 10^8 / 1000 mbps = 0.1

但由于只能是整数,所以千兆链路也是 1 所以无法区分百兆和千兆链路。这里可以采用修改标准比如将 十兆带宽的标准修改为 10^9 ,但需要注意的是,在所有的链路都要修改.

修改方式:

  1. 如上修改参考带宽
  2. 修改接口开销,ip ospf cost(推荐)

虚链路

虚链路通过在两台边界设备之间,穿越所属的

非骨干区域

所建立的一条逻辑上的连接通道。让非骨干区域连接到骨干区域或骨干区域被分割的情况。

虚链路所穿越的区域称为传输区域。

比如下面的 R4 和 R2 之间连接的虚链路,让非骨干区域连接到骨干区域:

简述ospf的工作原理_OSPF 一文详解

或者像 R1 和 R4 所在 Area0 区域被分割的情况:

简述ospf的工作原理_OSPF 一文详解

在配置虚链路时需要注意:

  • 在两端设备同时配置,并且处于同一区域。
  • 传输区域不能是特殊区域。
  • 其中一台设备必须连接骨干区域。
  • 如果骨干区域配置认证,虚链路也需要配置认证。

配置

按照第一个图正常配置 OSPF 后,在 R3 和 R5 上查询 database:

# 发现 Area3 区域的路由并没有收到
R3#show ip ospf database

            OSPF Router with ID (34.1.1.3) (Process ID 100)

                Router Link States (Area 2)

Link ID         ADV Router      Age         Seq#       Checksum Link count
23.1.1.2        23.1.1.2        219         0x80000003 0x004575 1
34.1.1.3        34.1.1.3        117         0x80000005 0x003AFE 2
46.1.1.4        46.1.1.4        113         0x80000002 0x00155C 1

                Net Link States (Area 2)

Link ID         ADV Router      Age         Seq#       Checksum
23.1.1.2        23.1.1.2        219         0x80000001 0x00DEE2
34.1.1.3        34.1.1.3        117         0x80000001 0x00C5CA

                Summary Net Link States (Area 2)

Link ID         ADV Router      Age         Seq#       Checksum
10.1.0.1        23.1.1.2        323         0x80000002 0x007297
10.1.1.1        23.1.1.2        323         0x80000002 0x0067A1
10.1.2.1        23.1.1.2        323         0x80000002 0x005CAB
10.1.3.1        23.1.1.2        323         0x80000002 0x0051B5
12.1.1.0        23.1.1.2        323         0x80000002 0x004DBB

# 发现 Area0,1,2 区域的路由并没有收到
R5#show ip ospf database

            OSPF Router with ID (45.1.1.5) (Process ID 100)

                Router Link States (Area 3)

Link ID         ADV Router      Age         Seq#       Checksum Link count
45.1.1.5        45.1.1.5        272         0x80000003 0x00F760 1
46.1.1.4        46.1.1.4        282         0x80000003 0x00E375 1

                Net Link States (Area 3)

Link ID         ADV Router      Age         Seq#       Checksum
45.1.1.4        46.1.1.4        282         0x80000001 0x001B4F
           

没有收到路由的原因就因为 R4 并不是 ABR,并不能传递区域间的路由,所以需要配置虚链路,让 R4 称为 ABR.

# R2 配置
R2(config)#router ospf 100
# 46.1.1.4 为 R4 的 Router-id
R2(config-router)#area 2 virtual-link 46.1.1.4

# R4 配置
R4(config)#router ospf 100
# 23.1.1.2 为 R2 的 Router-id
R4(config-router)#area 2 virtual-link 23.1.1.2

# 查询虚链路
R4#show ip ospf virtual-links
Virtual Link OSPF_VL0 to router 23.1.1.2 is up
  Run as demand circuit
  DoNotAge LSA allowed.
  Transit area 2, via interface Ethernet0/0
 Topology-MTID    Cost    Disabled     Shutdown      Topology Name
        0           20        no          no            Base
  Transmit Delay is 1 sec, State POINT_TO_POINT,
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:01
    Adjacency State FULL (Hello suppressed)
    Index 1/1/3, retransmission queue length 0, number of retransmission 0
    First 0x0(0)/0x0(0)/0x0(0) Next 0x0(0)/0x0(0)/0x0(0)
    Last retransmission scan length is 0, maximum is 0
    Last retransmission scan time is 0 msec, maximum is 0 msec
           
虚链路使用单播发送 hello 包建立邻居,建立成功后,Hello 包将不再发送。

通过虚链路学到的 LSA,AGE 字段为 DNA,表示永不老化。

认证

OSPF 提供认证功能,共有三种模式:

  1. 不启用认证
  2. 明文认证
  3. MD5 密文认证

OSPF 有三种认证部署类型:

  1. 接口认证
  2. 区域认证
  3. 虚链路认证

接口认证

为 R1 E0/0 和 R2 E0/0 配置:

明文认证:

# R1 开启明文认证
R1(config)#int e0/0
R1(config-if)#ip ospf authentication me
R1(config-if)#ip ospf authentication-key 123456

# R2 开启明文认证
R2(config)#int e0/0
R2(config-if)#ip ospf authentication me
R2(config-if)#ip ospf authentication-key 123456
           

密文认证:

R1(config)#int e0/0
R1(config-if)#ip ospf authentication message-digest
R1(config-if)#ip ospf message-digest-key 1 md5 1234

R2(config)#int e0/0
R2(config-if)#ip ospf authentication message-digest
R2(config-if)#ip ospf message-digest-key 1 md5 1234
           

区域认证

为某个区域下同时配置认证,比如为 Area 0 区域,比在每个接口下配置认证更加方便:

# R1 为 Are0 下的接口开启认证功能
R1(config)#router ospf 100
R1(config-router)#area 0 authentication
# 去接口下设置密码
R1(config)#int e 0/0
R1(config-if)#ip ospf authentication-key 123

# R2 为 Are0 下的接口开启认证功能
R2(config)#router ospf 100
R2(config-router)#area 0 authentication
# 去接口下设置密码
R2(config)#int e 0/0
R2(config-if)#ip ospf authentication-key 123
           

虚链路认证

当为骨干区域配置了区域认证时,如果启用了虚链路,也要为虚链路配置认证,因为虚链路也需要骨干区域

虚链路明文认证:

R2(config)#router ospf 100
R4(config-router)#area 0 authentication
R2(config-router)#area 2 virtual-link 46.1.1.4 authentication
R2(config-router)#area 2 virtual-link 46.1.1.4 authentication-key 123123

R4(config)#router ospf 100
R4(config-router)#area 0 authentication
R4(config-router)#area 2 virtual-link  23.1.1.2 authentication
R4(config-router)#area 2 virtual-link  23.1.1.2 authentication-key 123123
           

密码认证:

R2(config)#router ospf 100
R4(config-router)#area 0 authentication
R2(config-router)#area 2 virtual-link 46.1.1.4 authentication message-digest
R2(config-router)#area 2 virtual-link 46.1.1.4  message-digest-key 1 md5 1234

R4(config)#router ospf 100
R4(config-router)#area 0 authentication
R4(config-router)#area 2 virtual-link  23.1.1.2 authentication message-digest
R4(config-router)#area 2 virtual-link  23.1.1.2  message-digest-key 1 md5 1234
           

路由汇总

汇总后将减小产生 3 类 LSA 的数量,减少带宽,提高性能。

区域间汇总

在 ABR 配置: Area1 的路由进行汇总

# 在 R1 上配置
R1(config)#router ospf 100
# area 1 表示所需汇总路由的区域
R1(config-router)#area 1 range 10.1.0.0 255.255.252.0
# 可加参数,进行路由过滤
not-advertise

# 在 R2 查看
R2#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

      10.0.0.0/22 is subnetted, 1 subnets
O IA     10.1.0.0 [110/11] via 12.1.1.1, 00:00:08, Ethernet0/0
      12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        12.1.1.0/24 is directly connected, Ethernet0/0
L        12.1.1.2/32 is directly connected, Ethernet0/0
      23.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        23.1.1.0/24 is directly connected, Ethernet0/1
L        23.1.1.2/32 is directly connected, Ethernet0/1
      34.0.0.0/24 is subnetted, 1 subnets
O        34.1.1.0 [110/20] via 23.1.1.3, 01:04:26, Ethernet0/1
      45.0.0.0/24 is subnetted, 1 subnets
           

区域外汇总

在 ASBR 配置: 将外部路由进行汇总后再重分布到上 OSPF

R4(config)#router ospf 100
# 将 eigrp 中的路由重分布到 ospf 中
R4(config-router)#redistribute eigrp 50
# 将路由汇总
R4(config-router)#summary-address 60.1.0.0 255.255.252.0
           

缺省路由下发

向 OSPF 区域内发布缺省路由,无法使用重分布命令进行路由的下发

# 假设 R4 连接的是 ISP 的网络,会在 R4 配置默认路由,并引入到 OSPF 区域内
R4(config)#ip route 0.0.0.0 0.0.0.0 46.1.1.5
R4(config)#router ospf 100
R4(config-router)#default-information originate
# 加入 always 表示无论是否自身有缺省路由,都会想 OSPF 域内下发
           

被动接口

当一些路由器连接的是交换机接口时,这时发送 OSPF 报文给交换机是没有意义的,所以一般会将和交换机连接的接口设置成被动接口。

R1(config)#router ospf 100
R1(config-router)#passive-interface ethernet 0/1
           

OSPFV3 配置

ipv6 router ospf 100
router-id 1.1.1.1
int e 0/0
ipv6 ospf 100 are3
           

SPF 算法

简述ospf的工作原理_OSPF 一文详解
简述ospf的工作原理_OSPF 一文详解

cost = 10^8 / 10mbps = 10

cost = 10^8 / 100mbps = 1

cost = 10^8 / 1000mbps = 0.1

但由于只能是整数,所以千兆链路也是 1 所以无法区分百兆和千兆链路。这里可以采用修改标准比如将 十兆带宽的标准修改为 10^9 ,但需要注意的是,在所有的链路都要修改

排错

  1. 检查直连连通性
  1. 查看邻居表是否正常建立
  2. router-id 唯一(

    show ip protocols

  3. 链路两端 Area 号不一致(

    show run | s router ospf

    ,

    show run interface x

  4. 认证方式是否匹配
  5. Hello 报文 Dead 计时器设置不一致
    1. Broadcast,P2P: Hello 10s, Dead 20s;
    2. NBMA,P2MP,P2MP-NB: Hello 30s, Dead:120s
  6. 广播型网络,接口掩码是否一致
  7. DBD mtu 设置不一致(卡到 ExStart 状态)
    1. 配置相同 MTU
    2. 在小的 MTU 端配置,忽略 MTU(ip ospf mtu-ignore)
  8. Hello包:特殊区域标识位不一致
  9. Hello 包: 优先级相同(都为 0 无法建立连接)
  1. 查看是否有路由
    1. 对应网络是否通告
    2. 是否配置路由过滤

OSPF 配置

实验1:模拟特殊区域情况。

在 R1 和 R5 配置去往 6.6.6.6 / 24 的默认路由,但在 R6 是通过重分布引入 OSPF,开销计算为 Type1.

而 R1 所在区域模拟性能不好的情况,配置为特殊区域.

简述ospf的工作原理_OSPF 一文详解

在 R5 上配置到 6.6.6.6 网络的默认路由,并设置开销计算为 Type1:

# R5 - 配置静态路由
ip route 6.6.6.0 255.255.255.0 56.1.1.6
# 重分布到 OSPF
router ospf 100
redistribute static metric-type 1

# 在 R1 上查看 metric:
类型为 E1,并且 Metric 为 60:以太网口默认为 10 mbps = 10^8/ 10^7=10, 所以内部开销为 10 + 10 + 10 + 10 + 40.
对于思科设备来说,外部开销默认为 20,所以加起来一共 60.
           
简述ospf的工作原理_OSPF 一文详解

将 Area1 配置 Stub 区域 - ABR 不传播自治系统外的路由:

# R1 配置 stub 区域,
Router1(config-router)#area 1 stub
# R2 配置 stub 区域
Router2(config-router)#area 1 stub

可以发现,之前去往 6.6.6.6 的外部路由已经没有了,多了一条 O*IA 的默认路由
           
需要将 stub 区域中的路由器都配置成 stub,否则会因为 Hello 中无法匹配 Stub 标识,导致无法连接邻居。
简述ospf的工作原理_OSPF 一文详解

并且在 R1 查看数据库:可以发现,无法区域外部路由已经没有了。

Router#show ip ospf database

            OSPF Router with ID (1.1.1.1) (Process ID 100)

                Router Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         1329        0x80000008 0x007786 1
2.2.2.2         2.2.2.2         1324        0x80000009 0x003AB8 1

                Net Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum
12.1.1.2        2.2.2.2         1324        0x80000005 0x0028EB

                Summary Net Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum
0.0.0.0         2.2.2.2         1324        0x80000002 0x0073C1
23.1.1.0        2.2.2.2         1324        0x80000004 0x00868A
34.1.1.0        2.2.2.2         1324        0x80000004 0x005BA0
45.1.1.0        2.2.2.2         1324        0x80000004 0x0030B6
           

将 Area 区域配置为完全 stub 区域, 连区域间的路由信息也不要 - 在 ABR 上配置:

# 在 ABR R2 配置完全 stub 区域
Router2(config-router)#area 1 stub no-summary

# 在 R1 上查看,发下区域间的路由也没有了
Router#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is 12.1.1.2 to network 0.0.0.0

O*IA  0.0.0.0/0 [110/11] via 12.1.1.2, 00:00:02, Ethernet0/0
      1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        1.1.1.0/24 is directly connected, Loopback0
L        1.1.1.1/32 is directly connected, Loopback0
      12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        12.1.1.0/24 is directly connected, Ethernet0/0
L        12.1.1.1/32 is directly connected, Ethernet0/0
Router#show ip ospf database

            OSPF Router with ID (1.1.1.1) (Process ID 100)

                Router Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         1666        0x80000008 0x007786 1
2.2.2.2         2.2.2.2         1661        0x80000009 0x003AB8 1

                Net Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum
12.1.1.2        2.2.2.2         1661        0x80000005 0x0028EB

                Summary Net Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum
0.0.0.0         2.2.2.2         7           0x80000004 0x006FC3
           

将 Area 区域配置为NSSA 区域, 不要区域外部路由,但允许本区域内配置外部路由 :

# R1 配置 nssa 区域,
Router1(config-router)#area 1 nssa
# R2 配置 nssa 区域
Router2(config-router)#area 1 nssa

# 在 R6 上配置 7.7.7.7/24 的回环口 Lo 2
# 在 R1 配置到 6.6.6.6 的静态路由
Router1(config)#ip route 7.7.7.0 255.255.255.0 16.1.1.6
# 重分布 static
Router1(config-router)#redistribute static

# 此时 R1 作为 ABR 连接了外部路由器
# 查看 R2 路由信息,多出了去往 7.0 网络的路由:
Router#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

      2.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        2.2.2.0/24 is directly connected, Loopback0
L        2.2.2.2/32 is directly connected, Loopback0
      6.0.0.0/24 is subnetted, 1 subnets
O E1     6.6.6.0 [110/50] via 23.1.1.2, 00:08:38, Ethernet0/1
      7.0.0.0/24 is subnetted, 1 subnets
O N2     7.7.7.0 [110/20] via 12.1.1.1, 00:04:32, Ethernet0/0
      12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        12.1.1.0/24 is directly connected, Ethernet0/0
L        12.1.1.2/32 is directly connected, Ethernet0/0
      23.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        23.1.1.0/24 is directly connected, Ethernet0/1
L        23.1.1.1/32 is directly connected, Ethernet0/1
      34.0.0.0/24 is subnetted, 1 subnets
O        34.1.1.0 [110/20] via 23.1.1.2, 00:08:38, Ethernet0/1
      45.0.0.0/24 is subnetted, 1 subnets
O IA     45.1.1.0 [110/30] via 23.1.1.2, 00:08:38, Ethernet0/1

# 在 R2 需要手动配置,为其他设备添加默认路由信息:
Router2(config-router)#area 1 nssa default-information-originate

# 在 R1 查看路由,多了一条默认路由,注意下发的是 7 类默认路由
Router#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is 12.1.1.2 to network 0.0.0.0

O*N2  0.0.0.0/0 [110/1] via 12.1.1.2, 00:00:18, Ethernet0/0
      1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        1.1.1.0/24 is directly connected, Loopback0
L        1.1.1.1/32 is directly connected, Loopback0
      7.0.0.0/24 is subnetted, 1 subnets
S        7.7.7.0 [1/0] via 16.1.1.6
      12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        12.1.1.0/24 is directly connected, Ethernet0/0
L        12.1.1.1/32 is directly connected, Ethernet0/0
      16.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        16.1.1.0/24 is directly connected, Ethernet0/1
L        16.1.1.1/32 is directly connected, Ethernet0/1
      23.0.0.0/24 is subnetted, 1 subnets
O IA     23.1.1.0 [110/20] via 12.1.1.2, 00:21:19, Ethernet0/0
      34.0.0.0/24 is subnetted, 1 subnets
O IA     34.1.1.0 [110/30] via 12.1.1.2, 00:21:19, Ethernet0/0
           

将 Area 区域配置为完全 NSSA 区域, 不要区域外部路由,但允许本区域内配置外部路由 :

# 在 R2 开启 
Router2(config-router)#area 1 nssa no-summary
# 在 R1 查看路由,发现区域间路由没有了
Router1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is 12.1.1.2 to network 0.0.0.0

O*IA  0.0.0.0/0 [110/11] via 12.1.1.2, 00:00:09, Ethernet0/0
      1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        1.1.1.0/24 is directly connected, Loopback0
L        1.1.1.1/32 is directly connected, Loopback0
      7.0.0.0/24 is subnetted, 1 subnets
S        7.7.7.0 [1/0] via 16.1.1.6
      12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        12.1.1.0/24 is directly connected, Ethernet0/0
L        12.1.1.1/32 is directly connected, Ethernet0/0
      16.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        16.1.1.0/24 is directly connected, Ethernet0/1
L        16.1.1.1/32 is directly connected, Ethernet0/1
           

注意此时默认路由变成了 OIA 原因在于,执行 no-summary 会产生一条3类LSA 0.0.0.0 的默认路由,会优先选择该路由。

Router#show ip ospf database

            OSPF Router with ID (1.1.1.1) (Process ID 100)

                Router Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         198         0x80000014 0x00ECFA 1
2.2.2.2         2.2.2.2         15          0x80000019 0x00A731 1

                Net Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum
12.1.1.2        2.2.2.2         525         0x80000004 0x00B15B

                Summary Net Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum
0.0.0.0         2.2.2.2         16          0x80000001 0x00FC31

                Type-7 AS External Link States (Area 1)

Link ID         ADV Router      Age         Seq#       Checksum Tag
0.0.0.0         2.2.2.2         1118        0x80000001 0x00D0D8 0
7.7.7.0         1.1.1.1         1616        0x80000001 0x00E38A 0