几个简单的 OSPF 实验
这次也来几个简单 OSPF 实验,之所以简单,是因为只要几条命令,即可完成功能配置。这次,让我们看看 Cost 值、OSPF 特殊区域、Virtual Link 、报文认证、多进程是如何实现的。
OSPF Cost 值

R1 和 R2 连接到相同的一个网段:192.168.100.0/24 ,同时下连 R3 。R1 、R2 、R3 都激活 OSPF ,在相同的 Area 中,接口的 Cost 又是默认值,这时 R3 的路由表中,到达 192.168.100.0/24 会有两条等价路由:

如果两条链路以主备方式工作,该如何实现呢?一个最简单的方法就是调整接口 Cost 值。比如把 R3 的 G0/0/2 接口 Cost 值调大,到达 192.168.100.0/24 的报文会转发给 R1 ,当 R1 故障时,R3 自动把流量切到 R2 。
R3 的配置:
查看接口参数:
在查看 R3 的路由表:
配置生效。
OSPF 特殊区域
R1 、R2 、R3 运行 OSPF ,R3 把自己的静态路由引入 OSPF ,让域内的路由器学习到外部路由。
1、基本配置
R1 配置:

R2 配置:

R3 配置:

观察 R1 的路由表:

R1 学习到了区域间路由和外部路由,外部路由标记位 O_ASE( OSPF AS External )。再看看 R1 的 LSDB :
R1 的 LSDB ,有 Type-1 、Type-2 、Type-3 、Type-4 、Type-5 LSA 。Type-3 LSA 描述到达 10.1.23.0/24 的区域间路由。Type-4 LSA 描述到达 ASBR ,也就是 R3 的路由,是由 ABR R2 产生。Type-5 LSA 描述外部路由 10.3.1.0/24 和 10.3.2.0/24 ,并在整个 OSPF 域内泛洪,这时 R1 有到达各个网段的路由。
2、Area1 配置为 Stub 区域
先把 Area1 配置为 Stub 区域,R1 和 R2 的配置如下:

某个区域为 Stub 区域,区域内的路由器都要配置成 Stub 区域,否则无法正确建立邻居关系。Stub 区域的 ABR ,即 R2 ,会阻挡 Type-4 、Type-5 LSA 进入区域内,减少 LSA 泛洪的数量,从而减小路由表规模,降低设备负担。
现在 R1 无法学到 OSPF 外部路由,同时 R2 会下发一条用 Type-3 LSA 描述的外部路由,让 Area1 内的路由器访问域外的网络。观察 R1 的路由表和 LSDB :


R1 的路由表减少,不再有 Type-4 和 Type-5 LSA ,只有 Type-1 、Type-2 、Type-3 LSA 。
3、Area1 配置为 Totally-Stub 区域
如果要进一步减少 LSA 泛洪,可以把区域间的路由也阻挡。在上个实验的基础上,R2 配置如下:

这时,R2 阻挡 Type-3 、Type-4 、Type-5 LSA 进入 Area1 ,同时自动下发一条默认路由,使用 Type-3 LSA 描述。这样当 R1 访问区域外的网络时,就使用默认路由转发数据。
查看 R1 路由表和 LSDB :


R1 路由表只有一条 0.0.0.0/0 的默认路由,极大简化了路由表。同时,R1 的 LSDB 也非常简洁。
4、Area1 配置为 NSSA

网络发生变化,Area1 的 R1 连着一个外部路由,需要引入 OSPF ,让域内路由器获得外部路由,但又希望保持 Stub 区域特性,那么可以把 Area1 配置为 NSSA 。在上个实验的基础上,R1 配置如下:

在 R1 创建静态路由,模拟成外部路由,先取消 Stub 配置,然后配置 NSSA ,再把外部路由引入 OSPF 。
R2 配置如下:

某个区域配置为 NSSA ,则区域内的所有路由器都要进行相应配置,否则建立邻居关系会出现问题。Area1 区域成为 NSSA 后,会阻挡 Type-4 、Type-5 LSA 进入区域。但是 ABR R2 会下发一条 Type-7 LSA 的默认路由,让区域内的路由器,通过默认路由到达域外网络。同时,会向 Area0 通告 Type-5 LSA 描述 10.1.1.0/24 路由,让 OSPF 其它区域的路由器都学习到这条路由。
查看 R1 的 LSDB :

R1 的 LSDB 中,有 Type-1 、Type-2 、Type-3 、Type-7 LSA ,其中两条 Type-7 LSA ,一条是 R1 生成的,描述引入的外部路由 10.1.1.0/24 ,另一条是 R2 生成的,是一条默认路由。再看看 R1 的路由表:

再看看 R3 的 LSDB :

R3 有三条 Type-5 LSA ,其中两条是自己生成的,描述外部路由 10.3.1.0/24 和 10.3.2.0/24 ,另一条是 R2 生成的,描述外部路由 10.1.1.0/24 。R2 把从 Area1 收到的 Type-7 LSA 转换成 Type-5 LSA ,并通告到 Area0 中。查看 R3 路由表:

5、Area1 配置为 Totally NSSA
为了进一步减少 Area1 的 LSA ,把 Area1 配置成 Totally NSSA 实现。在上个实验的基础上,R2 配置如下:

这样 Area1 内不会有 Type-3 LSA 泛洪,R1 也学不到区域间路由。
看下 R1 的 LSDB :

R1 的 LSDB 中,只有 Type-1 、Type-2 、Type-7 LSA 和一条描述的默认路由 Type-3 LSA 。当 NSSA 内同时存在 Type-3 LSA 和 Type-7 LSA 描述的默认路由时,路由器优先使用 Type-3 LSA 的默认路由,忽略 Type-7 LSA 的默认路由。
Virtual Link

R1 、R2 、R3 运行 OSPF ,规划两个区域 Area0 和 Area23 。R3 有两条路由到达 192.168.2.0/24 网段,因为 R3 不能使用非 0 区域的 Type-3 LSA 来计算区域间路由,因此无论路径的 Cost 如何,R3 都会选择 R1 到达目的网段。查看 R3 的 OSPF 路由表:

如果向让 R3 从 R2 到达 192.168.2.0/24 ,即使用高带宽链路转发,一个简单的方法是,在 R2 和 R3 之间跨越 Area23 建立一条 Virtual Link ,通过这条 Virtual Link ,R2 直接把 Type-1 LSA 发送给 R3 。
R2 配置如下:

R3 配置如下:

配置完成后,R2 和 R3 建立一条 Virtual Link ,Virtual Link 穿过 Area23 ,在 R3 查看 Virtual Link 信息:

Virtual Link 建立完成后,状态为 Full ,Cost 为 1 ,再看下 R3 的 OSPF 路由表:

192.168.2.0/24 路由的下一跳变成了 192.168.23.2 ,说明到达这个网段的下一跳切换到了 R2 ,达到预期目标。
OSPF 报文认证

OSPF 支持两种报文认证方式:区域认证和接口认证。R1 、R2 、R3 、R4 运行 OSPF ,Area0 开启区域认证,MD5 的验证方式,密码为 fox@123 。R3 和 R4 之间开启 OSPF 接口认证,使用明文的认证方式,密码为 FOXarea1 。
R1 、R2 、R3 的区域认证配置如下:



R3 、R4 激活接口认证配置:


接口认证优先级高于区域认证方式,如果同时配置两种认证方式,只有接口认证方式生效。命令中的 simple
关键字表示明文,即认证口令是明文保存在 OSPF 报文中,这样是不安全的,推荐使用 MD5 的方式。
OSPF 多进程
1、OSPF 进程和 Process-ID
华为设备,OSPF 支持多进程,ospf 命令加上 Process-ID 可在设备上创建一个 OSPF 进程。多个 OSPF 进程,使用不同 Process-ID 区分不同进程。Process-ID 只在设备本地有意义,换句话说,两台设备使用 OSPF 对接时,Process-ID 可以是不一样的。虽然两台设备的 Process-ID 可以不同,但是接口的区域 ID 必须相同。

在实际使用中,如果网络中只有一个 OSPF 域,建议使用相同的 Process-ID ,方便网络管理和维护。
2、运行 OSPF 多进程
当设备运行多个 OSPF 进程时,这些进程相互独立,每个进程独立维护自己的 LSDB ,而不同进程的 LSDB 相互隔离,设备从 OSPF 进程学到的 LSA ,只会保存在这个进程的 LSDB 中。

R1 、R2 、R3 运行 OSPF ,R2 运行两个 OSPF 进程,对应 Process-ID 分别是 100 和 200 。OSPF 进程 100 与 R1 对接,OSPF 进程 200 与 R3 对接。网络中的两个域是互相隔离、互相独立的,因此每个 OSPF 域都由自己的骨干区域和非骨干区域。
R1 、R2 、R3 配置如下:



先看 R2 的邻居表:

R1 和 R3 分别属于进程 100 和 200 。
再看下 R2 的 LSDB :

R2 的两个进程分别维护一个 LSDB 。
虽然 R2 的两个进程互相隔离,但都是为 R2 提供路由。也就是说,R2 的进程 100 得到 10.1.1.0/24 的路由,进程 200 得到 10.2.2.0/24 的路由,再把 OSPF 路由加载到自己的路由表中。
查看 R2 的 OSPF 路由表:


果然,两个 OSPF 路由表都为 R2 提供了路由表项。R2 学习到了 10.1.1.0/24 和 10.2.2.0/24 的路由,但是 10.1.1.0/24 和 10.2.2.0/24 是无法互相访问的。因为 R1 依然没有到达 10.2.2.0/24 的路由,R3 也没有到达 10.1.1.0/24 的路由。如果要实现两个网段的互访,就要在 R2 的两个 OSPF 进程中,互相进行路由重分发。也就是把进程 100 的路由引入到进程 200 ,进程 200 的路由引入到进程 100 。
先把 OSPF 进程 200 的路由引入进程 100 :

OSPF 进程 200 的路由 10.1.23.0/24 和 10.2.2.0/24 路由都引入到进程 100 中。实际上,R2 是向进程 100 中通告了两条外部路由的 Type-5 LSA 。查看 R1 的 LSDB 和路由表:


已经有 Type-5 和 Type-4 LSA ,并计算出到达 10.1.23.0/24 和 10.2.2.0/24 的路由。
再在 R2 上把 OSPF 进程 100 引入进程 200 :

这样,R3 就可以学习到 10.1.1.0/24 和 10.1.12.0/24 的路由,进而实现 10.1.1.0/24 和 10.2.2.0/24 的数据互通。
3、什么时候使用 OSPF 多进程
通常,一个网络中,只有一个 OSPF 进程,即整个网络都属于同一个 OSPF 域。但在一些场景中,单 OSPF 进程无法满足业务需求,就需要在网络中规划多个 OSPF 域、特定设备部署多 OSPF 进程。

这是一个大型企业的网络拓扑,SW1 、SW2 、RT1 、RT2 是省公司核心网的设备,SW3 、SW4 是市公司的设备,RT1 、RT2 下面还有多个区县站点。为了实现区县站点、市公司的网络互通,需要部署 OSPF 并且规划多区域。省公司核心网内的网络互通、多个核心业务对接,都需要路由互通。
由于网络规模大,打通全网路由,一个 OSPF 域已经无法满足需求。一来是 OSPF 域太大,路由数量太多,二来多区域设计并不适用于大规模、多业务的需求场景,三来骨干网和省公司核心网不需要市公司、区县站点的路由明细,因此要考虑路由汇总和路由策略。因此,为省公司网络规划另一个 OSPF 域,R1 和 R2 创建两个 OSPF 进程,进程 100 面向省公司,进程 1 面向下面的市公司和区县站点。两个 OSPF 域可以独立规划,互不干扰。
同时,为了实现省公司、市公司、区县站点的网络互通,可以在 OSPF 进程上进行路由引入。路由引入时,可以执行路由策略、路由过滤和路由汇总等操作。
大型网络中使用 OSPF 时,采用多进程也是常见的部署方式。
结尾
OSPF 多进程虽然是隔离的,但是执行路由引入的 ASBR 拥有全部的路由,显然还是不够安全的。这里可以使用 VRF( Virtual Routing Forwarding ,虚拟路由转发),也叫做 VPN 实例( VPN Instance ),把进程关联到 VRF 实例中,可以彻底隔离路由,可以想象成两台物理隔离的设备,有兴趣的同学,可以了解下。