Network-Route-Rip-1

RIP路由协议 (以华为主)

转载: Astion 路由交换技术笔记,可在 Gitee 上找到相关笔记项目

Routing Information Protocol 路由信息协议最典型的距离矢量路由协议常用于小型网络交互路由信息目前存在三个版本 面向IPv4的 RIPv1 和 RIPv2 及面向 IPv6 的 RIPng

基本概念

摘要:更新与接收机制 RIP 度量 RIPv1、RIPv2 报文格式 RIP 几种计时器及含义 Silent-Interface 概念及配置

路由更新及接收

每台 RIP 路由器都维护着一个 RIP 数据库,保存发现的所有路由;每条路由包括:目的网络/掩码、度量、下一跳、老化计时器、路由状态标识等。

每台运行 RIP 的路由器周期性地将自己的路由表通告出去,接收到更新的路由器发现是自己并未发现且有效的则将其加载到路由表,同时设置度量值和下一跳。

1.路由器初始启动

将上图所有路由器接口都激活 RIP,初始情况下所有路由器都自动发现自己的直连路由,并将其加载至路由表中;
RIP将直连路由视为 “0” 跳,即不需要经过任何一台路由器。
基本配置:使用 rip 1 手动指定 RIP 进程号,不指定则自动分配,只有本地意义,每个进程数据库相互隔离。
在RIP视图下执行 version 2 即使用 RIPv2 版本
network 宣告网络时只能使用主类 IP 地址,不可使用子网地址会报错。

主要配置:

华为的配置方式

R1:
rip 1
version 2
network 192.168.12.0 
network 10.0.0.0

R2:
rip 1
version 2
network 192.168.12.0
network 192.168.23.0

R3:
rip 1
version 2
network 192.168.23.0
network 3.0.0.0

Cisco的配置方式

R1:
# config
(config)# router rip
(config-router)# version 2
(config-router)# no auto-summary
(config-router)# network 192.168.12.0 
(config-router)# network 10.0.0.0

R2:
# config
(config)# router rip
(config-router)# version 2
(config-router)# no auto-summary
(config-router)# network 192.168.12.0
(config-router)# network 192.168.23.0

R3:
# config
(config)# router rip
(config-router)# version 2
(config-router)# no auto-summary
(config-router)# network 192.168.23.0

2.初次交换路由信息

激活 RIP 的接口周期性地将路由表中的路由通告出去(RIPv1 使用广播地址,RIPv2 使用组播 224.0.0.9);

RIP路由器将自己路由表中的路由通告出去时将跳数加1,接收到该路由的路由器将使用这个度量值。

即:这次 RIP 周期更新R1学习到 192.168.23.0/24,R2 学习到 1.0.0.0/8和 3.0.0.0/8 两条路由,R3 学习到 192.168.12.0/24 。

通过宣告自己路由表中的直连路由完成了初次路由信息的交换,并且它们学习到的路由 Cost 都为 1.

此时R1和R3是没有学习到 3.0.0.0 和 1.0.0.0 这两条路由的,因为这两条路由初始交换后被 R2 学习,R1和R3需要等下个更新周期才能学习。

3.路由完成收敛

下一次更新周期到来所有路由器再次将路由表通告出去,由于第一次的学习 R2 已经存在 3.0.0.0 和 1.0.0.0 这两条路由,通告给R1时其会学习到 3.0.0.0 的路由 R3 同理. 这样三台路由器都拥有了到达全网各个网段的路由 ;

虽然网络中路由器的路由表已经稳定,但它们依然会周期性地将自己的路由表通过RIP通告出去,以确保路由的有效性.

路由更新与路由表

从单台 RIP 路由器的角度看它只是简单的侦听直连的 RIP 路由器通告的 RIP 路由更新,从更新中发现路由,将学习到的路由加载至路由表;另一方面它将自己的路由表宣告出去,以便直连 RIP 路由器学习到.

上图除高带宽链路接口不使能RIP之外其它接口均激活 RIP,一开始四台路由器都能通过 RIP 相互学习到路由.

查看R4的路由表发现它可以通过 R3-R2-R1 的路径去访问 192.168.1.0/24 这条路由

[Huawei]dis ip routing-table protocol rip
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Public routing table : RIP
         Destinations : 3        Routes : 3        

RIP routing table status : <Active>
         Destinations : 3        Routes : 3

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

    192.168.1.0/24  RIP     100  3           D   192.168.34.3    Ethernet0/0/0
   192.168.12.0/24  RIP     100  2           D   192.168.34.3    Ethernet0/0/0
   192.168.23.0/24  RIP     100  1           D   192.168.34.3    Ethernet0/0/0

RIP routing table status : <Inactive>
         Destinations : 0        Routes : 0

当我们在 R1 与 R3 之间增加一条高带宽的链路,RIP 并不能感知到这条链路因为它并没有激活 RIP, 此时我们在 R3 配置一条静态路由来使 192.168.1.0/24 的下一条指向 192.168.13.1,由于静态路由的优先级为 60,RIP 优先级为 100,所以 192.168.1.0/24 这条路由将在路由表中被静态路由替换掉.

由于之前 192.168.1.0 是一条 RIP 路由,现在被静态路由代替,在路由表中消失,即 R3 将会把1 92.168.1.0 这条RIP路由撤销,R4 也就无法获取到这条 RIP 路由无法对它进行访问.

R3 只剩一条 RIP 路由:

[Huawei]dis ip routing-table pro rip 
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Public routing table : RIP
         Destinations : 1        Routes : 1        

RIP routing table status : <Active>
         Destinations : 1        Routes : 1

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

   192.168.12.0/24  RIP     100  1           D   192.168.23.2    Ethernet0/0/0

RIP routing table status : <Inactive>
         Destinations : 0        Routes : 0

R4 路由表中只剩 R3 的 RIP 直连路由和 R2 通告给 R3 的直连路由:

Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Public routing table : RIP
         Destinations : 2        Routes : 2        

RIP routing table status : <Active>
         Destinations : 2        Routes : 2

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

   192.168.12.0/24  RIP     100  2           D   192.168.34.3    Ethernet0/0/0
   192.168.23.0/24  RIP     100  1           D   192.168.34.3    Ethernet0/0/0

RIP routing table status : <Inactive>
         Destinations : 0        Routes : 0

度量值

RIP 以跳数(Hop Count)作为路由的度量值,即到达目的网络所经过的路由器个数,跳数越少则越优先。本地直连路由跳数为0跳。

所有路由器均启用 RIP,正常情况下 R1 去往 192.168.5.0/24 这条路由是经过 R1-R2-R5 这样的路径,因为 R1-R3-R4-R5 这条路径是 3 跳,所以优先走上面。

但我们现在想要让 R1 去往 192.168.5.0/24 这条路由从下面的高带宽链路经过,就需要配置接口附加度量值。
可以在 R1 的 E0/0/0 接口配置附加度量值,让其接收到 192.168.5.0/24 的路由在原度量值再加上附加度量值后加载至路由表中从而降低这条路由的优先程度。
关键配置如下:

R1:
acl 2000
rule 5 permit source 192.168.5.0 0.0.0.0	#使用acl匹配这条路由
quit 
int e0/0/0
rip metricin 2000 2		#调用acl 2000 将匹配的路由度量加2

配置后的效果(注意这个配置是接收的路由,接收的路由rip会沿用上跳路由器已经加过的跳数,接收路由器本身并不会增加路由开销。)

这样配置之后我们改变的只是R1向外转发的路径,当 192.168.1.0/24 和 192.168.5.0/24 进行通信时就会产生数据往返路径不一致的问题,192.168.1.1 访问 192.168.5.5 时,R5 会将去往 192.168.1.0/24 的数据经过 R5-R2-R1。

为解决往返不一致的问题需要再从 R2 的 E0/0/1 口配置附加度量。

关键配置如下:

R2:
acl 2000
rule 5 permit source 192.168.1.0 0.0.0.0
quit
int e0/0/1
rip metricout 2000 3    #注意关键字为metricout  不是metricin

这样配置后,R2 将在度量为 1 的 192.168.1.0/24 这条路由上加 3,再发送给 R5,R5 的 192.168.1.0/24 路由度量从 2 变为 4 。

报文类型与格式

RIP 协议报文采用 UDP 封装,报文的源、目的端口均是 UDP 520 端口。RIP 定义两种报文:请求(Request)、响应(Response)Request 请求部分或全部 RIP 路由信息。Response 携带路由及该路由的度量等信息。

一旦路由器某个接口激活了 RIP,它将发送第一个 Request 和 Response 报文,并开始侦听 RIP 协议报文。

之后开始周期性发送 Response 报文。

RIPv2 使用组播地址 224.0.0.9

报文结构:

命令字段:用于标识报文类型
    该值为1时,报文为Request,用于向直连路由器请求路由信息。
    该值为2时,报文为Response,用于发送路由更新,一个Response报文最多可携带25条路由。
版本字段(version): 标识版本号
地址族标识符(Address Family Identifier , AFI): 该字段为2时表示IP协议。
路由标记(Route Tag):用于为路由设置标记,缺省为0,当外部路由引入RIP时为其打上标记。
IP地址(IP Address):目的网络地址
掩码(netmask):目的网络掩码
下一跳(NextHop):
度量值(Metric):路由度量值

计时器

更新计时器(Update Timer):RIP路由器周期性泛洪路由表的时间间隔,缺省为30s从已激活RIP的接口向外发送Response报文,为避免同一RIP网络的路由器同时发送Response,RIP引入了(0~5s)的随机偏移量。
老化计时器(Age Timer):当一条路由被学习并加载至路由表,路由器为其启用老化计时器(缺省180s),每次更新周期路由再次收到该路由条目更新,老化计时器重置并重新开始计时。
    在老化计时器超时的同时启用垃圾回收计时器,该路由被从路由表中删除但此然存储在RIP数据库中,这条路由依然包含在发送的Response报文中,不过该路由的度量值被设置为16条,即不可达。
垃圾回收计时器(Garbage-Collect Timer):垃圾回收计时器缺省为120s。若该计时器也超时则路由被彻底删除。

在 RIP 配置视图下,使用 times rip 可以修改三个计时器的值,该命令可指定三个参数,即更新时间间隔、老化时间、垃圾回收时间。

rip 1
times rip 35 190 200

Silent-Interface

在连接终端的接口上启用,只接收 Response 不发送。
为避免解析 RIP 报文所产生的资源损耗。
同 OSPF Silent-Interface ,此处不再赘述。
在终端连接处不希望接收到RIP协议报文

在PC的接口处抓包查看,一直收到网关发来的 Response 报文。

将网关的接口配置为静默接口可以避免发送无意义的协议报文。

R1:
rip 1
silent-interface E0/0/0

查看 R1 的 RIP 摘要信息,可以看到 E0/0/0 被加入到 Silent-Interface 中。

在终端处抓包验证,没有发现任何协议报文

RIP 防环机制

环路的产生

距离矢量路由协议只是简单地将自己的路由表周期性的通告出去,同时也将收到的有效路由加载到路由表中,通过累加的度量体现到达目的网络的距离,所以运行距离矢量路由协议的路由器不了解整个网络拓扑,非常容易产生环路。

我们在拓扑中的路由器运行 RIP 使其正常通信,为了复刻环路的产生我们将默认使能的水平分割关闭;

使用如下命令关闭水平分割:

undo rip split-horizon 

当我们关闭水平分割后,R2 会将学习到的 10.0.0.0/24 的路由从 E0/0/0 接口通告给 R1 。
此时 R1 的 E0/0/0 接口故障,它将会在下个更新周期将 10.0.0.0/24 这条路由的开销置为 16 即不可达。

在 R1 的下个周期到来之前,R2 将 10.0.0.0/24 的路由开销加1并通告给了 R1,R1 会将其加载至路由表中且开销为 2,下一跳指向 R2,从而产生环路。

此时R2的路由表:

此时R1的路由表:

此时去往 10.0.0.0/24 的数据将会在 R1 和 R2 之间来回传递直至 TTL 值耗尽。

并且若R1没有触发更新10.0.0.0/24路由失效的Response报文,R1下个更新周期就会将这条路由开销值加1通告给R2,循环往复,直到开销叠加至无限大。

定义最大跳数

为了避免RIP路由在网络中被无休止地泛洪,RIP定义了路由的最大跳数:15跳,路由产生环路,RIP路由最大跳数为15跳,当数值达到16跳,则表示该路由不可达。

水平分割

水平分割的原理是:RIP路由器从某个接口收到的路由不会再从该接口通告出去。

使能水平分割的命令是:

#在接口模式下
rip split-horizon

使能水平分割后 R1 就不会再接收的 R2 通告的 10.0.0.0/24 的路由。

R1 的 RIP 报文:

R2 的 RIP 报文:

毒性逆转

毒性逆转的原理是 RIP 从某个接口学到路由后,当它从该接口发送 Response 报文时会携带这些路由,但是这些路由度量值被设置为 16 跳。

如果同时使能水平分割和毒性逆转那么只有毒性逆转生效。

使能命令:

#在接口模式下
rip poison-reverse

当我们使能毒性逆转后观察 R2 的 Response 报文:

触发更新

当路由器感知到拓扑发生变更或RIP路由度量值变更时,它无需等待下一个更新周期到来即可立即发送Response报文。

毒性路由

路由度量为 16 跳的路由条目为不可达路由。

当一个网络变为不可达时会触发一个 16 跳的路由更新,这中路由更新称为毒性路由,告知其它路由器这条路由不可达。

当我们将 R1 的 E0/0/0 接口 down 掉时会触发 10.0.0.0/24 开销值为 16 的毒性路由告知 R2 这条路由不可达。

RIPv2

RIPv1 与 RIPv2

RIPv1不支持VLSM;
RIPv1的Response报文中携带的路由信息只有IP地址;
RIPv1的缺陷可能会导致在子网路由通告中产生问题:

当 R1 和 R3 启用RIP后,它们将从各自 E0/0/0 接口通告自己的直连路由,并且它们都处于主类网络的边界,在通告路由时会自动将子网路由汇总成主类路由进行通告。即 172.16.3.0/24 或 172.16.1.0/24 都将汇总成 172.16.0.0/16 向 R2 通告,此时 R2 接收到的 Response 报文中没有掩码字段,它只能填充主类掩码,由于R1与R3的网络地址相同,所以 R2 的路由表 172.16.0.0/16 会成为一条负载分担路由,且有可能转发 172.16.3.0 的数据时会从 192.168.12.0 方向发出导致通信故障。

更改成 RIPv2 再次查看路由表

RIPv2 RFC2453 使用组播方式发送 RIP 报文,支持无类路由选择;
在 Response 报文携带的路由信息中增加网络掩码;
支持报文认证;
增加下一跳特性;
增加路由标记功能;
支持手工汇总路由;

报文发送方式

RIPv1 使用广播发送协议报文,目的地址为255.255.255.255,使用广播地址发送协议报文,同处在同一广播域的网络设备、系统,都需要先解析该报文查看UDP端口后丢弃,造成资源损耗。

RIPv2 采用组播地址224.0.0.9作为协议报文的目的IP,所有RIPv2都侦听该组播地址,采用组播发送协议报文可以减少对广播域中其它设备的影响。

报文认证

缺省情况下RIP路由信息的交互是缺乏安全性的,容易遭受攻击或垃圾路由填充。
通过在已知的设备接口上激活RIP认证并在两端配置相同的认证口令,只有当接口上收到的RIP报文中相关认证字段匹配本地配置的认证口令,该报文才被认为是有效的,否则被认为是非法报文并丢弃。

RIP认证是基于报文的;

认证信息会占用报文的第一个路由项,可携带最大路由从25条变为24条。

当同一多路访问网络中存在攻击者时,若攻击者也下发 192.168.2.0/24 的路由,R1 上这条路由可能会形成负载分担,那么R1上的业务就会受到影响;
如果R3下发的路由比 R2 的开销值小,那么R1上的业务将会彻底中断。
尝试在R1上部署简单口令认证:

R1:
#在相应的接口模式下
int e0/0/0
rip authentication-mode simple plain 123456
#simple表示简单口令
#plain在配置文件中明文显示口令

在配置中可以直接看到口令

这样是不安全的通常使用 cipher 关键字代替 plain

rip authentication-mode simple cipher 123456

这样会在配置中显示密文的口令,但发送的报文中仍显示明文的口令,攻击者可以通过捕获报文直接查看口令,这里可以使用 md5 加密的方式对报文中的口令进行加密,md5加密可选usual通用报文格式(私有标准)、也可以选择nonstandard非标报文格式(IETF格式)

rip authentication-mode md5 usual cipher 123456    #私有标准
或
rip authentication-mode md5 nonstandard cipher 123456  #IETF格式

下一跳字段

下一跳字段在多路访问网络上可以避免次优路径,原理与 OSPF 的 FA 字段类似。

R1、R3 运行 RIP 交互路由信息,为了让 R1 能访问 2.0.0.0/8,在 R1 上部署静态路由下一跳指向 192.168.123.2 他的直连路由。

为了让 R3 通过 RIP 学习到 2.0.0.0/8 的路由,需要在R1上将静态路由引入到 RIP 中。

R3收到路由后将其加载至路由表,由于距离矢量协议路由通告者即为路由下一跳,所以R3中2.0.0.8/24的路由下一跳为192.168.123.1

从而产生次优路径,显然R3直接转发给R2更优,上图为运行RIPv1时产生的效果。
将RIP版本改成V2再次查看路由表。

查看R1通告的RIP协议报文。

通过报文发现R1不仅通告了下一跳为192.168.123.2的路由,还追加了一条下一跳为0.0.0.0的毒性路由,以此消除下一跳为宣告者的路由。

路由标记

RIPv2增加了“路由标记”字段,使从外部被引入RIP的路由能够携带特定的标记信息。通过network向RIP发布的路由它的路由标记字段被置为0

当外部路由被重分发到RIP时,可以为该条路由设备路由标记,被引入的外部路由会携带网络管理员设置的路由标记。

可以基于该标记执行路由策略。

将外部静态路由引入到 RIP 并打上相应标记,A业务打标记10,B业务打标记20。
部署静态路由,在静态路由中追加 tag 关键字可为静态路由添加标记:
R2 #用黑洞路由来模拟外部路由

ip route-static 10.1.1.0 255.255.255.0 NULL0 tag 10
ip route-static 10.2.2.0 255.255.255.0 NULL0 tag 10
ip route-static 11.1.1.0 255.255.255.0 NULL0 tag 20
ip route-static 11.2.2.0 255.255.255.0 NULL0 tag 20

将静态路由引入RIP观察RIP数据库。

路由汇总

RIP支持路由自动汇总

路由自动汇总指的是如果RIP路由处于主类路由的边界,自动将该子网路由汇总成主类路由,只将主类路由通告给直连的RIP路由器。

RIPv1中,路由自动汇总缺省被激活,且不能被关闭
RIPv2中,路由自动汇总缺省被激活,可以通过命令关闭

RIP自动汇总只能将明细路由汇总成主类路由。

观察R2路由表发现明细路由并没有被自动汇总。

查看自动汇总是否激活,如果未激活可以在rip视图下使用summary激活。

查看RIP接口信息,如果开启了毒性逆转或水平分割,缺省的自动汇总是不生效的

看到水平分割是使能的状态,现在关闭水平分割后再查看R2的路由表。

关闭了水平分割后,之前的明细路由被自动汇总成了一条,但是关闭水平分割后增加了环路的风险,更可靠的办法是开启防环功能,在rip视图中使用summary always 即无论是否开启水平分割或毒性逆转,都使用自动路由汇总。

R1:
int e0/0/0
rip split-horizon   #开启水平分割
quit
rip 1
summary always

再次查看R2路由表

这种方式固然方便,但它只能汇总成主类路由,在使用VLSM时会产生严重问题。

当一个主类分割了两个子网,同时这两个子网属于同一主类时,就会产生运行RIPv1时的路由冲突问题,R1和R3都会产生子网汇总主类宣告给R2,R2收到两条主类路由后会形成负载分担,从而产生路径转发错误的情况。

这是路由汇总不够精确导致的,IP地址规划的十分规则,这种情况下将路由汇总成172.16.0.0/22才符合我们的预期。
在接口模式下使用:

int e0/0/0	#路由宣告出接口处
rip summary-address 172.16.0.0 255.255.252.0

通过这种方式实现更精准的路由汇总来避免错误的形成负载分担。

再次查看 R2 路由表

下发默认路由

当RIP网络需要访问外网时,出口路由器需要部署一条静态路由指向外网,但内网中的RIP网络却无法访问。

需要将静态默认路由下发到RIP网络中

#在RIP视图中配置
rip 1
default-route originate cost 1    #设置这条默认路由开销为1   发出时+1

查看 R1 路由表,默认路由已经生效

这种配置存在一个缺陷,当 OR 路由器与 Internet 链路故障或断开时,静态默认路由消失,但 RIP 仍旧会通告这条默认路由,导致下联路由器仍旧使用默路由将数据转发至 OR,返回不可达消息,这显然不符合预期。

此时断开 OR 上联链路:

查看R1路由表,默认路由仍旧存在

为避免这种瑕疵路由,在配置下发命令时追加match default关键字。

在未使关键字前,无论OR中是否存在默认路由始终下发默认路由。使用关键字后,只有当OR中其它路由协议或RIP其他进程中存在默认路由时才会下发默认路由,当链路故障时静态路由消失,OR也会下发一条毒性路由将默认路由撤销。

# 追加match default关键字
default-route originate cost 1 match default 

此时当我们断开链路,再次查看R1路由表时,之前的默认路由被撤销。

Contents
  1. 1. RIP路由协议 (以华为主)
    1. 1.1. 基本概念
    2. 1.2. 路由更新及接收
    3. 1.3. 1.路由器初始启动
      1. 1.3.1. 主要配置:
    4. 1.4. 2.初次交换路由信息
    5. 1.5. 3.路由完成收敛
      1. 1.5.1. 路由更新与路由表
    6. 1.6. 度量值
    7. 1.7. 报文类型与格式
      1. 1.7.1. 报文结构:
    8. 1.8. 计时器
    9. 1.9. Silent-Interface
    10. 1.10. RIP 防环机制
      1. 1.10.1. 环路的产生
      2. 1.10.2. 定义最大跳数
      3. 1.10.3. 水平分割
      4. 1.10.4. 毒性逆转
      5. 1.10.5. 触发更新
      6. 1.10.6. 毒性路由
    11. 1.11. RIPv2
      1. 1.11.1. RIPv1 与 RIPv2
      2. 1.11.2. 报文发送方式
      3. 1.11.3. 报文认证
    12. 1.12. 下一跳字段
    13. 1.13. 路由标记
    14. 1.14. 路由汇总
      1. 1.14.1. 下发默认路由
|