实验目的
通过对 OSPF 邻居关系建立进行相关的实验,从中学习到如何调整 OSPF Hello 包间隔,Dead 间隔,以及影响 OSPF 邻居建立的因素,例如 RID,MTU,OSPF 认证。并且将总结 OSPF在不同网络类型上的不同行为
上述拓扑由三台路由器组成,其中 R1 和 R2 之间由以一组太网接口和一组串行口连接,以太网接口为 12.0/24 网段,串行口为 21.0/24 网段。同时 R2 和 R3 之间由帧中继交换机相连接,分配的 DLCI 号为 102 和 201。
实验步骤
- 首先配置好各个路由器相应接口,并且保持直连接口的连通性。同时在每台路由器
上配置一个环回口,其地址为 X.X.X.X/24。
2. 在 R1 和 R2 之间,开启串行接口,并且配置 OSPF 进程,使得在串行接口上能够正
常形成邻居,并且相互学习到环回口路由。
R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1 //指定 OSPF 的 router ID
R1(config-router)#exit
R1(config)#int s1/0
R1(config-if)#ip ospf 1 area 0 //在 s1/0 接口开启 OSPF 1 进程,接口在区域 0
R1(config-if)#exit
R1(config)#int lo0
R1(config-if)#ip ospf network point-to-point //更改环回口网络类型
R1(config-if)#ip ospf 1 area 0 //将环回口加入进程,并在区域 0
R1(config-if)#exit
R1(config)#
R2(config)#router ospf 1
R2(config-router)#router-id 2.2.2.2
R2(config-router)#exit
R2(config)#int lo0
R2(config-if)#ip ospf network point-to-point
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit
R2(config)#int s1/1
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit
从上面的配置我们可以发现,这和我们之前使用 network 命令将接口加入 OSPF 进
程的方式有所不同。上述配置方法是在需要加入 OSPF 进程的接口下使用命令 ip
ospf process-id area area-id 来明确指定该接口处于哪个 OSPF 进程和该进程的什么
区域中。这种配置方式从意义上而言更加明确,因此推荐采用这种配置。
而在 OSPF 进程下,我们只是指定了 OSPF 的 RID,没有其他额外的配置。
在上述配置完成后,便能够同系统实时日志发现 R1 和 R2 在串行口上建立了 OSPF
邻居关系。
*Mar 1 00:04:36.083: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/0 from
LOADING to FULL, Loading Done
当然,如果你需要防止 OSPF 在不必要的接口形成邻居关系,你同样可以使用我们
学过的 passive-interface 命令。以下是实例命令:
R1(config)#router ospf 1
R1(config-router)#passive-interface s1/0
如果加入上述命令,那么 R1 将停止在 s1/0 接口上发送 Hello 包。
3. 更改 R1 和 R2 串行链路上 OSPF 的 hello 和 dead 时间。
首先查看目前 R1 串行链路上的 Hello 时间。
可以发现,现在的 Hello 时间为 10s,Dead 间隔为 4 倍关系,即 40s。
然后对该链路上的 Hello 和 Dead 时间进行更改。
R1(config)#int s1/0
R1(config-if)#ip ospf hello-interval 5 //更改 Hello 时间为 5s 一次
R1(config-if)#ip ospf dead-interval 20 //更改 Dead 间隔为 20s,如果不显式更改,
那么 Dead 间隔将会根据 Hello 间隔的四倍关系自动更改。
更改计时器后不久,会发现 R1 和 R2 之间的 OSPF 邻居关系 down 掉。
*Mar 1 00:16:35.823: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/0 from
FULL to DOWN, Neighbor Down: Dead timer expired
分析得知,是因为 R1 和 R2 的 OSPF hello 间隔不一致所造成的。因此使得 OSPF 对
于邻居之间的 Dead 间隔的认识不同,从而造成邻居 down。
因此我们在 R2 的相应接口更改 Hello 间隔和 Dead 间隔,使得两台路由器计时器保
持一致。
R2(config)#int s1/1
R2(config-if)#ip ospf hello-interval 5
R2(config-if)#ip ospf dead-interval 20
R2(config-if)#
一旦更改完成,很快,R1 和 R2 之间的 OSPF 邻居关系便能够恢复。
*Mar 1 00:20:50.567: %OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.1 on Serial1/1 from
LOADING to FULL, Loading Done
4. 由于之前我们手工指定了R1的RID为1.1.1.1,因此现在我们更改R1的RID为2.2.2.2。
使之与 R2 的 RID 刻意一致。
R1(config)#router ospf 1
R1(config-router)#router-id 2.2.2.2
Reload or use “clear ip ospf process” command, for this to take effect
R1(config-router)#end
R1#clear ip ospf process
Reset ALL OSPF processes? [no]: yes
R1#
*Mar 1 00:23:57.367: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/0 from
FULL to DOWN, Neighbor Down: Interface down or detached
R1#
*Mar 1 00:23:59.871: %OSPF-4-DUP_RTRID_NBR: OSPF detected duplicate router-id
2.2.2.2 from 10.10.21.2 on interface Serial1/0
R1#
在更改 R1 的 RID 以后,还无法立即生效,需要对 OSPF 进程进行重启。
重启 OSPF 进程以后,我们可以发现,上述着重标号日志显示,OSPF 进程检测到对
端路由器和本地路由器使用了重复了 RID,因此此时无法建立 OSPF 邻居。
我们将 R1 的 RID 更改回来,便能够使得 R1 和 R2 之间的 OSPF 关系正常。
R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1
R1(config-router)#exit
R1(config)#
*Mar 1 00:27:06.055: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/0 from
LOADING to FULL, Loading Done
R1(config)#
5. 查看目前 R1 的串行口 MTU。
从上面的输出可以发现,目前接口 MTU 为 1500 字节。
更改 R1 的 s1/0 接口的 MTU。
R1(config)#int s1/0
R1(config-if)#ip mtu 1492
R1(config-if)#end
R1#clear ip ospf process
Reset ALL OSPF processes? [no]: yes
R1#
*Mar 1 00:30:13.799: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/0 from FULL
to DOWN, Neighbor Down: Interface down or detached
R1#
在更改了 R1 的 s1/0 接口的 MTU 以后,然后重启 OSPF 进程,并没有发现 OSPF 进程
能够再次正常重启。
查看此时 OSPF 邻居情况。
可以发现,此时 R1 和 R2 的 OSPF 进程卡在了 Exstart 状态。无法进行到 Full。因此
如果 MTU 不一致,也将阻止 OSPF 形成正常的邻居关系。
再将 R1 的 s1/0 接口的 MTU 值更改回原值。
R1(config)#int s1/0
R1(config-if)#ip mtu 1500
R1(config-if)#exit
R1(config)#end
*Mar 1 00:34:16.015: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/0 from
6. 对 OSPF 进行认证配置。
首先对 OSPF 的认证进行一个总结。
OSPF 支持 2 种认证形式,分别是明文认证和 MD5 密文认证。
两种认证形式都可以采用基于接口或者基于区域的两种配置方法。
认证通过是指认证形式,以及认证密钥都一致。
首先我们对 R1 和 R2 进行明文认证。
R1(config)#int s1/0
R1(config-if)#ip ospf authentication-key cisco //指定明文认证密钥
R1(config-if)#ip ospf authentication //基于接口开启明文认证
R1(config-if)#exit
//R1(config)#router ospf 1
R1(config-router)#area 0 authentication //基于区域 0 开启明文认证,这条命令和上
一条的功能是一致的。可以根据实际情况选择基于接口开启还是基于区域开启。如
果是基于区域开启,那么所有属于该区域的接口都等同于开启了认证。
删去上述配置。然后在 R1 上进行 MD5 密文认证的配置。
R1(config)#int s1/0
R1(config-if)#ip ospf message-digest-key 1 md5 cisco //指定 MD5 认证密钥,KEY ID
为 1,密钥为 cisco
R1(config-if)#ip ospf authentication message-digest //基于接口开启 MD5 认证
R1(config-if)#exit
//R1(config)#router ospf 1
R1(config-router)#area 0 authentication message-digest
R1(config-router)# //基于区域 0 开启 OSPF 认证,这条命令和上一条的功能是一致
的。可以根据实际情况选择基于接口开启还是基于区域开启。如果是基于区域开启,
那么所有属于该区域的接口都等同于开启了认证。
如果需要认证成功,需要在 R2 同时配置上相同认证形式,以及相同密钥的认证。
R2(config)#int s1/1
R2(config-if)#ip ospf message-digest-key 1 md5 cisco //指定 MD5 认证密钥,KEY ID
为 1,密钥为 cisco
R2(config-if)#ip ospf authentication message-digest //基于接口开启 MD5 认证
R2(config-if)#exit
R2(config)#
*Mar 1 00:46:43.791: %OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.1 on Serial1/1 from
LOADING to FULL, Loading Done //认证形式一致,密钥一致,邻居关系重新建立
7. OSPF 在思科路由器上拥有多种网络类型,并且在不同的网络类型上拥有不同的行为特点。
为了便于理解和记忆,我们将这些不同的特点从三个方面开总结。第一, 在该网络类型上,OSPF 是否能够自动发现邻居。第二, 在该网络类型上,OSPF 是否需要选举 DR。第三, 在该网络类型上,OSPF 的 Hello 间隔为多少。首先我们查看目前 R1 和 R2 的网络类型。
从上面的输出,我们可以发现,在串行链路上,OSPF 的默认网络类型为点到点。
点到点的网络类型:可以自动发现邻居,不需要选举 DR 和 BDR,Hello 间隔默认为
10s。
然后我们开启 R1 和 R2 之间的以太网接口,并且在该接口上启用 OSPF,也放置于
区域 0 中。
R1(config)#int e0/0
R1(config-if)#ip ospf 1 area 0
R1(config-if)#
R2(config)#int e0/1
R2(config-if)#ip ospf 1 area 0
R2(config-if)#exit
R2(config)#
这样 R1 和 R2 在以太网接口上将会建立一对邻居关系。
查看 R1 和 R2 在以太网上的网络类型和邻居情况。
通过上述输出,我们可以发现,在以太网接口上,OSPF 默认的网络类型为广播。
广播网络类型:可以自动发现邻居,需要选举 DR 和 BDR,默认 hello 时间为 10s。
然后开启 R2 和 R3 的帧中继接口,并且将帧中继接口加入 OSPF 进程中。
R2(config)#int s1/0
R2(config-if)#encapsulation frame-relay //接口封装帧中继
R2(config-if)#no frame-relay inver
R2(config-if)#no arp frame-relay //关闭帧中继正向和反向地址解析
R2(config-if)#frame-relay map ip 10.10.23.3 102 broadcast //映射帧中继 MAP
R2(config-if)#ip add 10.10.23.2 255.255.255.0
R2(config-if)#no sh
R2(config-if)#ip ospf 1 area 0 //加入 OSPF 进程 1,并放置在区域 0
R2(config-if)#exit
R2(config)#
R3(config)#int s1/1
R3(config-if)#encapsulation frame-relay
R3(config-if)#no frame-relay inver
R3(config-if)#no arp frame-relay
R3(config-if)#frame-relay map ip 10.10.23.2 201 broadcast
R3(config-if)#ip add 10.10.23.3 255.255.255.0
R3(config-if)#no sh
R3(config-if)#ip ospf 1 area 0
但是经过等待,并没有发现 R2 和 R3 之间建立了 OSPF 邻居关系。
查看 R2 和 R3 之间的网络类型以及邻居状态。
从上面的输出,我们可以发现,OSPF 在帧中继接口上的默认网络类型为非广播
(NBMA)。
非广播网络类型:无法自动发现邻居(即使链路支持广播),需要选举 DR 和 BDR,
默认 Hello 时间为 30s。
既然 R2 和 R3 无法自动发现邻居,那么我们可以静态指定邻居。
R2(config)#router ospf 1
R2(config-router)#neighbor 10.10.23.3
R2(config-router)#
*Mar 1 01:17:12.911: %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on Serial1/0 from
LOADING to FULL, Loading Done
R3(config)#router ospf 1
R3(config-router)#neighbor 10.10.23.2
*Mar 1 01:17:12.567: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/1 from
LOADING to FULL, Loading Done
从上面的输出可以发现,实际上只需要单边指定邻居即可。另一边如果收到对方的
单播 hello 包,则同样选择单播形式和对方进行邻居建立。
接着,我们将 R2 和 R3 的帧中继接口网络类型更改为点到多点。并且删去之前静
态指定的邻居。
R2(config)#router ospf 1
R2(config-router)#no neighbor 10.10.23.3
R2(config-router)#
*Mar 1 01:20:18.823: %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on Serial1/0 from
FULL to DOWN, Neighbor Down: Neighbor deconfigured
R2(config-router)#exit
R2(config)#int s1/0
R2(config-if)#ip ospf network point-to-multipoint
R2(config-if)#
*Mar 1 01:20:43.147: %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on Serial1/0 from
LOADING to FULL, Loading Done
R3(config)#router ospf 1
R3(config-router)#no neighbor 10.10.23.2
R3(config-router)#exit
R3(config)#int s1/1
R3(config-if)#ip ospf network point-to-multipoint
*Mar 1 01:21:12.803: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/1 from
LOADING to FULL, Loading Done
再次查看 R2 和 R3 之间 OSPF 网络类型以及邻居状态。
从上面的输出,我们可以发现,点到多点类似于一种特殊的点到点,便于理解,我
们可以把它看作“多个点到点”。
点到多点网络类型:自动发现邻居,不需要选举 DR 和 BDR,默认 hello 间隔为 30s。
我们再将 R2 和 R3 之间的网络类型更改为点到多点非广播。
R2(config)#int s1/0
R2(config-if)#ip ospf network point-to-multipoint non-broadcast
R3(config)#int s1/1
R3(config-if)#ip ospf network point-to-multipoint non-broadcast
*Mar 1 01:28:15.759: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/1 from
FULL to DOWN, Neighbor Down: Interface down or detached
在完成更改后,我们发现,R2 和 R3 之间的 OSPF 邻居 down 掉了。
由于 R2 和 R3 之间网络类型为点到多点非广播,因此无法自动发现邻居,需要静
态指定邻居。
R2(config)#router ospf 1
R2(config-router)#neighbor 10.10.23.3
*Mar 1 01:30:23.731: %OSPF-5-ADJCHG: Process 1, Nbr 3.3.3.3 on Serial1/0 from
LOADING to FULL, Loading Done
R2(config-router)#
R3(config)#router ospf 1
R3(config-router)#neighbor 10.10.23.2
*Mar 1 01:30:23.355: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on Serial1/1 from
LOADING to FULL, Loading Done
R3(config-router)#
查看此时 R2 和 R3 之间的网络类型和邻居状态。
从上面的输出,我们可以发现,对于点到多点非广播,路由器并没有明确显示出该类型。只是显示为点到多点,因此可以认为点到多点非广播是一种特殊的点到多点
网络类型
点到多点非广播网络类型:不支持邻居自动发现,不需要选举 DR 和 BDR,默认 hello时间为 30s。通过上面的实验我们已经总结出了五种 OSPF 的网络类型,以及各自的特点。在配置时需要保证,两端的网络类型一定要一致。如果不一致的话,有时无法建立邻居关系,但是有时候会发生意想不到的结果。在 R2 和 R3 之间。我们将 R2 帧中继的网络类型更改为广播,而 R3 的帧中继接口网络类型更改为点到点。则此时 R2 的网络类型为广播,而 R3 的网络类型为点到点。