[CCNA图文笔记]-15-RIPv2协议详解

引言

这篇文章讲解RIPv2的增强特性,演示RIPv2对CIDR和VLSM的支持、RIPv2手动汇总、RIPv2验证以及与RIPv1的共存。

文章目录

0×1.RIPv2增强特性

RIPv2与RIPv1的相同点:

也用跳数作为度量值,最大值为15;
也是距离矢量路由协议;
也容易产生路由环路,使用最大跳计数,水平分隔,触发更新,路由中毒和抑制定时器来防止路由环路;
也是周期更新,默认每30秒发送一次路由更新;

RIPv2的增强特性:

在路由更新中携带有子网掩码的路由选择信息,因此支持VLSM和CIDR;
提供身份验证功能,支持明文和MD5验证;
在路由更新信息中包含下一跳路由器的IP地址;
使用外部标记;
使用组播地址224.0.0.9代替RIPv1的广播更新;
可以关闭自动汇总,并支持手动汇总;

0×2.RIPv2基本配置

					Router(config)#router rip
					/*使用RIPv2,如果不使用这条命令默认是使用RIPv1*/
					Router(config-router)#version 2
					/*和RIPv1相同,都是宣告主类网络号*/
					Router(config-router)#network 主类网络号
					

a.RIPv2支持VLSM实例

在上一篇关于RIPv1的缺陷中有涉及到下面这张拓扑的配置,现在使用RIPv2去配置,看看结果会有何不同:

Cisco-CCNA-RIPv2-1

R1配置:

					R1(config)#int s 0/0
					R1(config-if)#ip add 192.168.1.65 255.255.255.252
					R1(config-if)#no shut
					R1(config-if)#int lo0
					R1(config-if)#ip add 192.168.1.1 255.255.255.192
					R1(config-if)#no shut
					R1(config-if)#router rip
					R1(config-router)#version 2
					R1(config-router)#net 192.168.1.0
					R1(config-router)#end
					

R2配置:

					R2(config)#int s 0/1
					R2(config-if)#ip add 192.168.1.66 255.255.255.252
					R2(config-if)#no shut
					R2(config-if)#int lo 0
					R2(config-if)#ip add 192.168.1.129 255.255.255.192
					R2(config-if)#no shut
					R2(config-if)#router rip
					R2(config-router)#ver 2
					R2(config-router)#net 192.168.1.0
					R2(config-router)#end
					

在R1上查看路由表并测试连通性:

					/*可以看到R1支持VLSM*/
					R1#show ip route

					     192.168.1.0/24 is variably subnetted, 3 subnets, 2 masks
					C       192.168.1.64/30 is directly connected, Serial0/0
					C       192.168.1.0/26 is directly connected, Loopback0
					R       192.168.1.128/26 [120/1] via 192.168.1.66, 00:00:01, Serial0/0

					/*ping R2的回环接口,成功*/
					R1#ping 192.168.1.129
					!!!!!
					

通过Debug调试RIPv2查看输出:

					R1#debug ip rip
					RIP protocol debugging is on
					R1#
					*Mar  1 00:22:31.687: RIP: sending v2 update to 224.0.0.9 via Serial0/0 (192.168.1.65)
					*Mar  1 00:22:31.687: RIP: build update entries
					*Mar  1 00:22:31.687:   192.168.1.0/26 via 0.0.0.0, metric 1, tag 0
					R1#
					*Mar  1 00:22:52.391: RIP: received v2 update from 192.168.1.66 on Serial0/0
					*Mar  1 00:22:52.391:      192.168.1.128/26 via 0.0.0.0 in 1 hops
					R1#u all
					All possible debugging has been turned off
					R1#

					/*
					 * 从输出可以看到,发送和接收的版本均为RIPv2(sending v2、received v2)
					 * 发送更新分组使用的是组播地址"update to 224.0.0.9"
					 * 发送和接收的更新分组中携带了子网掩码长度"/26"
					 * 发送的更新分组中使用了路由标记"tag 0"
					 */
					

b.RIPv2支持CIDR实例

如下图所示,假设R2上面有多个192.168.*.0/24网络,可以在RIPv2中以CIDR的方式把路由宣告出去;

Cisco-CCNA-RIPv2-2

R1配置:

					R1(config)#int s 0/0
					R1(config-if)#ip add 12.1.1.1 255.255.255.0
					R1(config-if)#no shut
					R1(config-if)#router rip
					R1(config-router)#ver 2
					R1(config-router)#net 12.0.0.0
					R1(config-router)#end
					

R2配置:

					/*R2上配置了4个回环接口*/
					R2(config)#int s 0/1
					R2(config-if)#ip add 12.1.1.2 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int lo 0
					R2(config-if)#ip add 192.168.1.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int lo 1
					R2(config-if)#ip add 192.168.2.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int lo 2
					R2(config-if)#ip add 192.168.3.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int lo 3
					R2(config-if)#ip add 192.168.4.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#exit
					/*生成一条静态路由192.168.0.0/16*/
					R2(config)#ip route 192.168.0.0 255.255.0.0 null 0
					R2(config)#router rip
					R2(config-router)#ver 2
					R2(config-router)#net 12.0.0.0
					/*将静态路由重发布出去*/
					R2(config-router)#redistribute static
					R2(config)#end
					

这个时候在R1上查看路由表,就能看到R2重发布过来的超网路由:

					/*如果使用的是RIPv1,就不会看到192.168.0.0/16这条超网信息,因为RIPv2不支持CIDR*/
					R1#show ip route

					     12.0.0.0/24 is subnetted, 1 subnets
					C       12.1.1.0 is directly connected, Serial0/0
					R    192.168.0.0/16 [120/1] via 12.1.1.2, 00:00:14, Serial0/0
					

c.RIPv2手工汇总实例

RIPv1和RIPv2都会在主类网络的边界汇总,区别在于RIPv2的自动汇总可以关闭,并支持手工汇总。

利用RIPv2完成下面配置,在关闭自动汇总前和RIPv1路由表结果一样,关闭自动汇总后RIPv2就能很好的支持不连续的子网了:

Cisco-CCNA-RIPv2-3

R1配置:

					R1(config)#int s 0/0
					R1(config-if)#ip add 12.1.1.1 255.255.255.0
					R1(config-if)#no shut
					R1(config-if)#int lo 0
					R1(config-if)#ip add 192.168.1.1 255.255.255.128
					R1(config-if)#no shut
					R1(config-if)#router rip
					R1(config-router)#ver 2 /*使用RIPv2*/
					R1(config-router)#no auto-summary  /*关闭自动汇总*/
					R1(config-router)#net 192.168.1.0
					R1(config-router)#net 12.0.0.0
					R1(config-router)#end
					

R2配置:

					R2(config)#int s 0/1
					R2(config-if)#ip add 12.1.1.2 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int s 0/0
					R2(config-if)#ip add 23.1.1.2 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#router rip
					R2(config-router)#ver 2
					R2(config-router)#no auto-summary
					R2(config-router)#net 12.0.0.0
					R2(config-router)#net 23.0.0.0
					R2(config-router)#end
					

R3配置:

					R3(config)#int s 0/1
					R3(config-if)#ip add 23.1.1.3 255.255.255.0
					R3(config-if)#no shut
					R3(config-if)#int lo 0
					R3(config-if)#ip add 192.168.1.129 255.255.255.128
					R3(config-if)#no shut
					R3(config-if)#router rip
					R3(config-router)#ver 2
					R3(config-router)#no auto
					R3(config-router)#net 23.0.0.0
					R3(config-router)#net 192.168.1.0
					R3(config-router)#end
					

配置完成后在R1/R2/R3上分别查看路由表:

					R1#show ip route

					     23.0.0.0/24 is subnetted, 1 subnets
					R       23.1.1.0 [120/1] via 12.1.1.2, 00:00:11, Serial0/0
					     12.0.0.0/24 is subnetted, 1 subnets
					C       12.1.1.0 is directly connected, Serial0/0
					     192.168.1.0/25 is subnetted, 2 subnets
					C       192.168.1.0 is directly connected, Loopback0
					R       192.168.1.128 [120/2] via 12.1.1.2, 00:00:11, Serial0/0

					R2#show ip route

					     23.0.0.0/24 is subnetted, 1 subnets
					C       23.1.1.0 is directly connected, Serial0/0
					     12.0.0.0/24 is subnetted, 1 subnets
					C       12.1.1.0 is directly connected, Serial0/1
					     192.168.1.0/25 is subnetted, 2 subnets
					R       192.168.1.0 [120/1] via 12.1.1.1, 00:00:15, Serial0/1
					R       192.168.1.128 [120/1] via 23.1.1.3, 00:00:10, Serial0/0

					R3#show ip route

					     23.0.0.0/24 is subnetted, 1 subnets
					C       23.1.1.0 is directly connected, Serial0/1
					     12.0.0.0/24 is subnetted, 1 subnets
					R       12.1.1.0 [120/1] via 23.1.1.2, 00:00:26, Serial0/1
					     192.168.1.0/25 is subnetted, 2 subnets
					R       192.168.1.0 [120/2] via 23.1.1.2, 00:00:26, Serial0/1
					C       192.168.1.128 is directly connected, Loopback0
					

从三个路由的路由表输出,进一步证实了RIPv2关闭总汇后能够支持不连续的子网。但同时也带来一个问题,路由表变大了,如果R1上面有多个接口属于不同子网,那么R1将向其他路由通告这些接口所处的子网,下面这个实例将演示如何进行手动汇总来减小路由表的大小,拓扑如下图所示:

Cisco-CCNA-RIPv2-4

首先不使用手动汇总,配置各路由:

R1配置:

					R1(config)#int s 0/0
					R1(config-if)#ip add 12.1.1.1 255.255.255.0
					R1(config-if)#no shut
					R1(config-if)#int lo0
					R1(config-if)#ip add 192.168.1.1 255.255.255.240
					R1(config-if)#no shut
					R1(config-if)#int lo1
					R1(config-if)#ip add 192.168.1.17 255.255.255.240
					R1(config-if)#no shut
					R1(config-if)#int lo 2
					R1(config-if)#ip add 192.168.1.33 255.255.255.240
					R1(config-if)#no shut
					R1(config-if)#int lo 3
					R1(config-if)#ip add 192.168.1.49 255.255.255.240
					R1(config-if)#no shut
					R1(config-if)#router rip
					R1(config-router)#no auto
					R1(config-router)#ver 2
					R1(config-router)#net 12.0.0.0
					R1(config-router)#net 192.168.1.0
					R1(config-router)#end
					

R2配置:

					R2(config)#int s 0/1
					R2(config-if)#ip add 12.1.1.2 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int s 0/0
					R2(config-if)#ip add 23.1.1.2 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#router rip
					R2(config-router)#ver 2
					R2(config-router)#no auto
					R2(config-router)#net 12.0.0.0
					R2(config-router)#net 23.0.0.0
					R2(config-router)#end
					

R3配置:

					R3(config)#int s 0/1
					R3(config-if)#ip add 23.1.1.3 255.255.255.0
					R3(config-if)#no shut
					R3(config-if)#int lo 0
					R3(config-if)#ip add 192.168.1.129 255.255.255.128
					R3(config-if)#no shut
					R3(config-if)#router rip
					R3(config-router)#ver 2
					R3(config-router)#no auto
					R3(config-router)#net 192.168.1.0
					R3(config-router)#net 23.0.0.0
					R3(config-router)#end
					

配置完成后,查看一下R3的路由表:

					R3#show ip route

					     23.0.0.0/24 is subnetted, 1 subnets
					C       23.1.1.0 is directly connected, Serial0/1
					     12.0.0.0/24 is subnetted, 1 subnets
					R       12.1.1.0 [120/1] via 23.1.1.2, 00:00:24, Serial0/1
					     192.168.1.0/24 is variably subnetted, 5 subnets, 2 masks
					R       192.168.1.32/28 [120/2] via 23.1.1.2, 00:00:24, Serial0/1
					R       192.168.1.48/28 [120/2] via 23.1.1.2, 00:00:24, Serial0/1
					R       192.168.1.0/28 [120/2] via 23.1.1.2, 00:00:24, Serial0/1
					R       192.168.1.16/28 [120/2] via 23.1.1.2, 00:00:26, Serial0/1
					C       192.168.1.128/25 is directly connected, Loopback0
					/*R3上学到了R1上的4条路由*/
					

下面在R1的s0/0接口上使用手动汇总:

注意!汇总是在路由的外出接口上面做的,如果有多条外出接口,就要在每个接口上执行手动汇总。

					/*在R1 s0/0接口上配置汇总*/
					R1(config)#int s 0/0
					R1(config-if)#ip summary-address rip 192.168.1.0 255.255.255.192

					/*等待R3收敛后(差不多要3~4分钟左右),查看R3的路由表,就只能看到R1汇总后的一条路由条目了*/
					R3#show ip route

					     23.0.0.0/24 is subnetted, 1 subnets
					C       23.1.1.0 is directly connected, Serial0/1
					     12.0.0.0/24 is subnetted, 1 subnets
					R       12.1.1.0 [120/1] via 23.1.1.2, 00:00:15, Serial0/1
					     192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
					R       192.168.1.0/26 [120/2] via 23.1.1.2, 00:00:15, Serial0/1
					C       192.168.1.128/25 is directly connected, Loopback0
					

d.路由翻动

当路由的接口在"UP"和"DOWN"之间快速变换时,就会产生路由翻动,而路由汇总除了可以减小路由表大小,还能有效的将上游路由从路由翻动问题中隔离出来;比如在上面这个实例中,没使用手动汇总前,不停的开启关闭R1上的loopback 0就会造成R2和R3不停的接收新的路由更新,它们的处理器将不停的工作,影响网络性能;当使用汇总后,虽然R1的直连路由不停的发生变化,但是汇总路由没有发生任何变化,所以R2和R3也不会时不时的收到lo0的网络不可达或可达的更新了。

0×3.RIPv2高级配置

a.RIPv2路由验证

使用下面这个拓扑来完成RIPv2路由验证实验:

Cisco-CCNA-RIPv2-5

R1配置:

					R2(config)#int lo 0
					R2(config-if)#ip add 192.168.1.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int s 0/0
					R2(config-if)#ip add 12.1.1.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#router rip
					R2(config-router)#net 12.0.0.0
					R2(config-router)#net 192.168.1.0
					R2(config-router)#version 2
					R2(config-router)#exit
					R2(config)#key chain test1   /*创建密钥链test1*/
					R2(config-keychain)#key 1   /*配置密钥链中的key 1*/
					R2(config-keychain-key)#key-string ccna1  /*配置密码串*/
					R2(config-keychain-key)#end
					R2#conf t
					R2(config)#int s 0/0    /*在与R2相连的串口中配置使用密钥链test1进行验证*/
					R2(config-if)#ip rip authentication key-chain test1
					R2(config-if)#ip rip authentication mode md5  /*使用MD5验证*/
					R2(config-if)#end

					/*
					 * 验证模式分为两种,一种是text明文验证,一种是md5验证,本实验使用了md5验证
					 * 另外,两端使用的密钥链中的密码串必须相同,并且验证模式也要相同,才能验证成功。
					 */
					

R2配置:

					R2(config)#int s 0/1
					R2(config-if)#ip add 12.1.1.2 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int lo 0
					R2(config-if)#ip add 192.168.2.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#router rip
					R2(config-router)#version 2
					R2(config-router)#net 12.0.0.0
					R2(config-router)#net 192.168.2.0
					R2(config-router)#exit
					/*暂时不执行下面的配置,大家可以查看下此时R1和R2是否可以通过RIP学习到对方路由*/
					R2(config)#key chain test2  /*test2是密钥名,只起到标识作用*/
					R2(config-keychain)#key 1
					R2(config-keychain-key)#key-string ccna1 /*密钥字符串"ccna1"必须和R1相同*/
					R2(config-keychain-key)#end
					R2#conf t
					R2(config)#int s 0/1
					R2(config-if)#ip rip authentication key-chain test2
					R2(config-if)#ip rip authentication mode md5   /*验证模式也必须相同*/
					R2(config-if)#end
					

可以将R2的密钥字符串配置成和R1不同的字符,或者将R2改成text明文验证,然后开启"debug ip rip"查看输出,将会看(invalid authentication)验证失败的消息。

b.IPv1和RIPv2的共存

利用上面的RIPv2路由验证实验的拓扑图来完成下面的RIPv1和RIPv2共存的实验,实验之前先将这两台路由器重新关闭再启动,清空它们的配置:

R1配置:

					R1(config)#int s 0/0
					R1(config-if)#ip add 12.1.1.1 255.255.255.0
					R1(config-if)#no shut
					R1(config-if)#int lo0
					R1(config-if)#ip add 192.168.1.1 255.255.255.0
					R1(config-if)#no shut
					R1(config-if)#router rip   /*并没有启动RIPv2,默认使用RIPv1*/
					R1(config-router)#net 12.0.0.0
					R1(config-router)#net 192.168.1.0
					R1(config-router)#end
					

R2配置:

					R2(config)#int s 0/1
					R2(config-if)#ip add 12.1.1.2 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#int lo0
					R2(config-if)#ip add 192.168.2.1 255.255.255.0
					R2(config-if)#no shut
					R2(config-if)#router rip
					R2(config-router)#version 2  /*开启了RIPv2*/
					R2(config-router)#net 12.0.0.0
					R2(config-router)#net 192.168.2.0
					R2(config-router)#end
					

分别查看R1、R2的路由表:

					/*发现R1上面能学习到R2上面的回环接口*/
					R1#show ip route

					     12.0.0.0/24 is subnetted, 1 subnets
					C       12.1.1.0 is directly connected, Serial0/0
					C    192.168.1.0/24 is directly connected, Loopback0
					R    192.168.2.0/24 [120/1] via 12.1.1.2, 00:00:20, Serial0/0

					/*R2上面什么都学不到,这是为什么呢?*/
					R2#show ip route

					     12.0.0.0/24 is subnetted, 1 subnets
					C       12.1.1.0 is directly connected, Serial0/1
					C    192.168.2.0/24 is directly connected, Loopback0
					

为什么R2学不到任何R1的路由信息?分别查看R1和R2的协议情况:

					/*
					 * 可以看到R1"send version 1, receive any version"
					 * 也就是说,R1发送版本1的更新,接收任何版本(V1,V2)的更新,
					 * R1配置的是RIPv1,而R2配置的是RIPv2,当R2发送过来v2版本的更新时,
					 * R1照样接收它,这就是R1为什么能学到R2的回环接口的原因。
					 */
					R1#show ip protocols
					  Default version control: send version 1, receive any version
					    Interface             Send  Recv  Triggered RIP  Key-chain
					    Serial0/0             1     1 2
					    Loopback0             1     1 2

					/*
					 * 而R2上面的RIPv2协议默认只能"send version 2, receive version 2"
					 * 也就是发送版本2和接收版本2,R1发过来的版本1的更新直接被忽略了。
					 */
					R2#show ip protocols

					  Default version control: send version 2, receive version 2
					    Interface             Send  Recv  Triggered RIP  Key-chain
					    Serial0/1             2     2
					    Loopback0             2     2
					

如果一端配置的是RIPv1,另一端配置的是RIPv2,可以通过下面的方法让它们通信;

在R1上的每个外出接口(如果有多个)上配置发送版本1和版本2的更新,或者在R2的外出接口上配置接收版本1和版本2的更新;

					/*在运行RIPv1的一端,让它同时发送版本1和版本2的更新*/
					R1(config)#int s 0/0
					R1(config-if)#ip rip send version 1 2

					/*或者在运行RIPv2的一端,让它同时接收版本1和版本2的更新*/
					R2(config)#int s 0/1
					R2(config-if)#ip rip receive version 1 2
					

这样,两端就都能学到对方的路由条目了。