RIP:Routing information Protocol
是应用较早、使用较普遍的内部网关协议(Interior Gateway Protocol,简称IGP),适用于小型同类网络,是典型的距离向量(distance-vector)协议。文档见RFC1058、RFC1723。
RIP通过广播UDP报文来交换路由信息,每30秒发送一次路由信息更新。RIP提供跳跃计数(hop count)作为尺度来衡量路由距离,跳跃计数是一个包到达目标所必须经过的路由器的数目。如果到相同目标有二个不等速或不同带宽的路由器,但跳跃计数相同,则RIP认为两个路由是等距离的。RIP最多支持的跳数为15,即在源和目的网间所要经过的最多路由器的数目为15,跳数16表示不可达。
RIP使用特殊的报文来收集和共享至有关目的地的距离信息。下图显示了路由信息域中只带一个目的地的RIP报文。
RIP报文中至多可以出现2 5个AFI、互联网络地址和度量域。这样允许使用一个RIP报文来更新一个路由器中的多个路由表项。包含多个路由表项的R I P报文只是简单地重复从AFI到度量域的结构,其中包括所有的零域。这个重复的结构附加在下图结构的后面。具有两个表项的R I P报文如图所示。
![]() |
| 具有两个表项的RIP报文 |
地址域可以既包括发送者的地址也包括发送者路由表中的一系列IP地址。请求报文含有一个表项并包括请求者的地址。应答报文可以包括至多2 5个RIP路由表项。
整个的RIP报文大小限制是512B。因此,在更大的RIP网络中,对整个路由表的更新请求需要传送多个RIP报文。报文到达目的地时不提供顺序化;一个路由表项不会分开在两个RIP报文中。因此,任何RIP报文的内容都是完整的,即使它们可能仅仅是整个路由表的一个子集。当报文收到时接收节点可以任意处理更新,而不需对其进行顺序化。
比如,一个RIP路由器的路由表中可以包括100项。与其他RIP路由器共享这些信息需要4个RIP报文,每个报文包括25项。如果一个接收节点(结点)首先收到了4号报文(包括从76至100的表项),它会首先简单地更新路由表中的对应部分,这些报文之间没有顺序相关性。这样使得RIP报文的转发可以省去传输协议如TCP所特有的开销。
1. 命令域
命令域指出R I P报文是一个请求报文还是对请求的应答报文。两种情形均使用相同的帧结构:
A.请求报文请求路由器发送整个或部分路由表。
B.应答报文包括和网络中其他R I P节点共享的路由表项。应答报文可以是对请求的应答,也可以是主动的更新。
2. 版本号域
版本号域包括生成R I P报文时所使用的版本。R I P是一个开放标准的路由协议,它会随时间而进行更新,这些更新反映在版本号中。虽然有许多像R I P一样的路由协议出现,但R I P只有两个版本:版本1和版本2。
3. 0域
嵌入在R I P报文中的多个0域证明了在RFC 1058出现之前存在许多如R I P一样的协议。大多数0域为的是为了向后兼容旧的如R I P一样的协议,0域说明不支持它们所有的私有特性。
比如,两个旧的机制t r a c e o n和t r a c e o ff。这些机制被RFC 1058抛弃了,然而开放式标准R I P需要和支持这些机制的协议向后兼容。因此,RFC 1058在报文中为其保留了空间,但却要求这些空间恒置为0。当收到的报文中这些域不是0时就会被简单地丢弃。
不是所有的0域都是为了向后兼容。至少有一个0域是为将来的使用而保留的。
4. AFI域
地址家族标识(Address Family Identifier,A F I )域指出了互联网络地址域中所出现的地址家族。虽然RFC 1058是由I E T F创建的,因此适用于网际协议( I P ),但它的设计提供了和以前版本的兼容性。这意味着它必须提供大量互联网络地址构成或家族的路由信息的传输。因此,开放式标准R I P需要一种机制来决定其报文中所携带地址的类型。
5. 互联网络地址域
4字节的互联网络地址域包含一个互联网络地址。这个地址可以是主机、网络,甚至是一个缺省网关的地址码。这个域内容如何变化的两个例子如下:
A.在一个单表项请求报文中,这个域包括报文发送者的地址。
B.在一个多表项应答报文中,这些域将包括报文发送者路由表中存储的I P地址。
6. 度量标准域
R I P报文中的最后一个域是度量标准域,这个域包含报文的度量计数。这个值在经过路由器时被递增。数量标准有效的范围是在1~1 5之间。度量标准实际上可以递增至1 6,但是这个值和无效路由对应。因此, 1 6是度量标准域中的错误值,不在有效范围内。
使用距离-向量路由协议的路由器必须周期性地把路由表的内容发送给它的直接相邻路由器。路由表中含有路由器与所知目的地之间的距离信息。这些目的地可以是主机、打印机或其他的网络。
每个接收者给表加上一个距离向量,也就是,它自己的距离“值”,然后把改变了的表转发给它的直接相邻路由器。这个过程无方向地在相邻者之间进行。下图使用简单的R I P互联网络显示了直接相邻者概念。
下图中有4个路由器。网关路由器和其他每一台路由器互联。它必须和这些路由器交换路由信息。路由器A、B和C只有一条连接至网关。因此,它们只能和网关直接交换信息。它们可以通过共享网关的信息来学习到其他主机的信息。这些信息与网关路由器共享。
![]() |
| 每个RIP节点把它的路由表内容广播给它的直接相邻者 |
R I P为每个目的地只记录一条路由的事实要求R I P积极地维护路由表的完整性。通过要求所有活跃的R I P路由器在固定时间间隔广播其路由表内容至相邻的R I P路由器来做到这一点,所有收到的更新自动代替已经存储在路由表中的信息。
R I P依赖3个计时器来维护路由表:
· 更新计时器
· 路由超时计时器
· 路由刷新计时器
更新计时器用于在节点一级初始化路由表更新。每个R I P节点只使用一个更新计时器。相反的,路由超时计时器和路由刷新计时器为每一个路由维护一个。
如此看来,不同的超时和路由刷新计时器可以在每个路由表项中结合在一起。这些计时器一起能使R I P节点维护路由的完整性并且通过基于时间的触发行为使网络从故障中得到恢复。
1. 初始化表更新
R I P路由器每隔3 0秒触发一次表更新。更新计时器用于记录时间量。一旦时间到,R I P节点就会产生一系列包含自身全部路由表的报文。
这些报文广播到每一个相邻节点。因此,每一个R I P路由器大约每隔3 0秒钟应收到从每个相邻R I P节点发来的更新。
注意在更大的基于R I P的自治系统中,这些周期性的更新会产生不能接受的流量。因此,一个节点一个节点地交错进行更新更理想一些。R I P自动完成更新,每一次更新计时器会被复位,一个小的、任意的时间值加到时钟上。
如果更新并没有如所希望的一样出现,说明互联网络中的某个地方发生了故障或错误。故障可能是简单的如把包含更新内容的报文丢掉了。故障也可能是严重的如路由器故障,或者是介于这两个极端之间的情况。显然,采取合适的措施会因不同的故障而有很大区别。由于更新报文丢失而作废一系列路由是不明智的(记住,R I P更新报文使用不可靠的传输协议以最小化开销)。因此,当一个更新丢失时,不采取更正行为是合理的。为了帮助区别故障和错误的重要程度,R I P使用多个计时器来标识无效路由。
2. 标识无效路由
有两种方式使路由变为无效:
. 路由终止
. 路由器从其他路由器处学习到路由不可用
在任何一种情形下, R I P路由器需要改变路由表以反映给定路由已不可达。
一个路由如果在一个给定时间之内没有收到更新就中止。比如,路由超时计时器通常设为1 8 0秒。当路由变为活跃或被更新时,这个时钟被初始化。
1 8 0秒是大致估计的时间,这个时间足以令一台路由器从它的相邻路由器处收到6个路由表更新报文(假设它们每隔3 0秒发送一次路由更新),如果1 8 0秒消逝之后, R I P路由器没收到关于那条路由的更新, R I P路由器就认为那个目的I P地址不再是可达的。因此,路由器就会把那条路由表项标记为无效。通过设置它的路由度量值为1 6来实现,并且要设置路由变化标志。这个信息可以通过周期性的路由表更新来与其相邻路由器交流。
注意:对于R I P节点而言,1 6等于无穷。因此,简单的设置耗费度量值为1 6能作废一条路由。
接到路由新的无效状态通知的相邻节点使用此信息来更新它们自己的路由表。这是路由变为无效的第二种方式。
无效项在路由表中存在很短时间,路由器决定是否应该删除它。即使表项保持在路由表中,报文也不能发送到那个表项的目的地址:R I P不能把报文转发至无效的目的地。
3. 删除无效路由
一旦路由器认识到路由已无效,它会初始化一个秒计时器:路由刷新计时器。因此,在最后一次超时计时器初始化后1 8 0秒,路由刷新计时器被初始化。这个计时器通常设为9 0秒。
如果路由更新在2 7 0秒之后仍未收到( 1 8 0秒超时加上9 0秒路由刷新时间),就从路由表中移去此路由(也就是刷新)。而为了路由刷新递减计数的计时器称为路由刷新计时器。这个计时器对于R I P从网络故障中恢复的能力绝对必要。
主动和被动站点
注意到为了使R I P互联网络正常工作,网络中的每一个网关必须参与进去这一点很重要。参与可以是主动参与也可以是被动参与,但所有的网关必须参与。主动节点是那些主动地进行共享路由信息的节点。它们从相邻者处接收更新,并且转发它们的路由表项拷贝至那些相邻节点。
被动站点从相邻者处接收更新,并且使用那些更新来维护它们的路由表。然而被动节点不主动地发布它们自己路由表项的拷贝。
被动维护路由表的能力在硬件路由器出现之前的日子里是特别有用的特性,那时路由是一个运行在U N I X处理器下的后台程序,这样会使U N I X主机上的路由开销达到最小。
到此为止,R I P的基本机制和特性已经以一种相当静态的方式进行了讨论,然而通过考察这些机制如何相互作用来适应网络的拓扑变化,可以获得对R I P这些机制更深层的理解。
收敛
R I P互联网络中拓扑变化带来的最重要可能是它会改变相邻节点集,这种变化也会导致下一次计算距离向量时得到不同的结果。因此,新的相邻节点集必须得到汇聚,从不同的起始点汇聚到新拓扑结构的一致看法,得到一致性拓扑视图的过程称为收敛( c o n v e rg e n c e )。简单地讲,收敛就是路由器独立地获得对网络结构的共同看法。
下图显示了收敛过程;图中画出了两条可能的从路由器A和网络1 9 2 . 1 6 8 . 1 2 5到路由器D的路由。路由器D是一个网关路由器。到路由器D网络的基本路由要通过路由器C。如果这条路由器出现故障,就需要一些时间使所有的路由器收敛至新的拓扑结构,这个拓扑中不再包括路由器C和D之间的链路。
路由器C和D之间的链路出现故障,它就不再可用,但是整个网络却需要相当一段时间才能知道这一事实。收敛的第一步是D认识到至C的链路发生故障。这里假设路由器D的更新计时器先于C的计时器到期。因为这条链路本应传输从路由器D到路由器C的更新报文,所以C就不能收到D发送来的更新报文。C ( A和B )仍没有意识到C - D链路已经发生故障。互联网络中的所有路由器会继续通过那条链路对寻址到路由器D网络的报文进行转发。收敛的第一阶段显示在下图中。
![]() |
| 从路由器A到路由器D的两条可能路径 |
![]() |
| 只有路由器D意识到链路故障 |
一旦更新计时器超时,路由器D会试图把对网络拓扑变化的推测通知给它的相邻路由器。直接相邻者中只有路由器B能直接联系。收到更新报文,B会更新它的路由表,设置从B到D (通过C )的路由为无穷。这样允许其通过B - D的链路与D进行通信。一旦B更新了自己的路由器,它会把关于拓扑结构的新变化广播给它的其他相邻者,A和C。
注意记住,RIP节点通过设置路由的度量为16来作废一条路由—16对RIP而言相当于无穷。
A和C一收到更新报文并重新计算了网络耗费之后,它们就能用B - D的链路来替换路由表中使用C - D链路的表项。以前所有的节点,包括B本身都不使用B - D的路由,因为它比C - D的链路耗费大。它的耗费度量为1 0,而C - D的耗费为1。现在, C - D链路发生了故障, B - D链路的耗费变为最低。因此,这条新的路由会代替相邻节点路由表中超时的路由。
当所有的路由器认识到通过B是到D的最有效路由时,它们就收敛了,如下图所示。
![]() |
| 路由器把B-D作为新路由 |
确定收敛完成之前所需的时间不容易。它因网络不同而区别很大,这要依赖于许多因素,包括路由器和传输线路的健壮性、交通流量等等。
在上面所举的例子中,惟一的故障发生在连接C和D的链路上。路由器能够收敛到新的拓扑结构,通过另一条路径恢复对网关路由器D上网络的访问。如果D自身发生故障会造成更严重的结果。前面例子中的收敛过程开始于D能够通知B发生了链路故障。如果是D,而不是到C的链路出现故障;B和C就都不能收到更新,通知它们拓扑发生了变化。
这种情况下收敛到新拓扑能导致一种称为计值到无穷的现象。当网络变得完全不能访问时,基于如下错误的想法:存在另一个路由器能访问那个不可达的目的地,这种情形中的路由器会计值R I P度量到无穷。
为了从路由角度显示这种灾难性故障所带来的内在危险性,重新考虑收敛图中的拓扑结构。在下图中,路由器D发生故障。
![]() |
| 路由器D发生故障 |
由于路由器D发生故障,位于网络之中的所有主机从外部不能再被访问。路由器C,在没有收到路由器D的6个连续更新之后,会作废掉C - D路由,并且广播其为不可到达。这一点显示在下图中。路由器A和B对路由失效一无所知直到接到C的通知。
此时,A和C相信通过B能到达D。它们会重新计算自己的路由,包括这条更高耗费的迂回线路。下图显示了这一点。
这两个路由器向它们的直接相邻路由器B发送它们的下一个更新报文,路由器B,已经超时了自己至D的路由,相信通过A或C仍能访问D。显然,这样是不可能的,因为A和C依赖于B刚作废的链路。实质上,在A、B、C之间形成了一个环,这个环的形成是由下面的错误想法形成的,即A和C通过对方仍能到达路由器D。这是因为二者都有到B的连接,而B有一条到D的连接。
![]() |
| 路由器C作废了C-D路由 |
![]() |
| A和C相信它们能通过B访问D |
更新的每次叠代过程,耗费度量会因额外的下一跳而递增到已经计算过的环上。这种形式的循环是由于时间延迟而引起的,而这种时间延迟是通过相邻者发送更新报文的独立收敛过程的特点。
理论上讲,节点最终会认识到D是不可达的。然而,要想说出什么时候才能收敛几乎不可能。这个例子准确地反映了为什么R I P对无穷的解释设成如此小的值。一旦一个网络不可访问,通过更新来递增量度到实用值时必须中止此过程。这意味着这个上界要设为多大,当计值到此上界时才能宣布一个目的地不可达。任何上界和一个路由网络的直径限制相对应。在R I P例子中,它的最初设计者觉得1 5跳对一个自治系统来说早已足够大。比这更大的系统可以使用更复杂的路由协议。
R I P使用三种方法来避免计值到无穷循环问题:
· 分割水平线
· 带抑制逆转位的分割水平线
· 触发更新
1. 分割水平线
可以很明显地看出,上一节所描述的循环问题可以通过逻辑应用而得到防止,描述这个逻辑的术语为分割水平线。虽然R I P不支持分割水平线,但是理解了它有助于理解它所使用的稍复杂一些的变体—带抑制逆转位的分割水平线。
分割水平线的实质是,假设如果一条路由是从一个特定路由器处学习来的, R I P节点不广播关于这个特定路由的更新到这个相邻路由器。
![]() |
| 分割水平线 |
路由器支持分割水平线逻辑。因此,路由器C (支持到路由器D的惟一路径)不能收到从路由器A发来的关于网络D的更新。这是因为A (甚至B )的这条路由信息依赖于C。这种分割循环的简单方法是非常有效的,但却有严重的功能限制:忽略掉广播来的反向路由,每个节点必须等到至不可达目的地的路由超时。
在R I P中,只有在6个更新消息没有更新一个路由之后才发生超时。因此,一个被错误通知的节点把关于不可达目的地的信息错误地通知给其他节点的可能性有5种。就是这个延时可能造成无效路由信息形成环。由于这个不足, R I P支持一个稍加改动的版本称为带抑制逆转的分割水平线。
2. 带抑制逆转的分割水平线
简单的分割水平线策略试图通过中止把信息反传给其发送者来控制环。虽然这种方法有效,但是有更有效的方法来中止循环。带抑制逆转的分割水平线采用了一种更主动的方法来中止环。
这种技术实际上是通过设置路由的度量为无穷来抑制环的形成。
![]() |
| 带抑制逆转的分割水平线 |
路由器A能给路由器B提供关于如何到达路由器D的信息,但此路由的度量为1 6。因此,路由器B不能更新它的路由表,因为表中信息能更好地到达目的地。实际上,A广播它不能到达D,这是真实的信息。这种广播能立即有效地打破环。
一般来讲,在距离-向量网络中带抑制逆转的分割水平线比单纯的分割水平线更安全。然而,二者都不是完美的。带抑制逆转的分割水平线在只有两个网关的拓扑中能有效地防止路由环。然而,在更大的互联网络中, R I P仍然会发生计值到无穷的问题。为了确保这样的无限循环尽可能早地被发现,R I P支持触发更新。
3. 触发更新
在三个网关连到一个公共网络的情况下,仍然会形成路由环,这个环是由于网关之间彼此欺骗造成的。如下图所示。在这个图中有三个网关连到路由器D,它们是A、B和C。
在路由器D发生故障的情况下,路由器A可能相信路由器B仍可以访问路由器D,路由器B可能相信路由器C仍可以访问路由器D,而路由器C可能相信路由器A仍可以访问路由器D,结果形成了一个无限路由环。
分割水平线逻辑在这种情况下因路由作废前的延时而丧失作用。R I P使用一种不同的技术来加速收敛过程,这种技术称为触发更新。触发更新是协议中的一个规则,它要求网关在改变一条路由度量时立即广播一条更新消息,而不管3 0秒更新记时器还剩多少时间。
触发更新通过把延迟减到最小从而克服了路由协议的脆弱性。
4. 保持计时器
触发更新不是万能的!更新不会瞬时地传遍整个网络。因此,有可能(但不太可能)一个网关在从另一个网关处收到触发更新之前恰好发送了一个周期性的更新报文。在这种情况下,无效路由会在整个网络中被再次传播。虽然,发生这种情况的可能性非常低,但是在一个R I P网络之中还是有可能出现计值到无穷的循环(即使使用了触发更新)。
对这种潜在问题的解决方法是使用保持计时器。保持计时器和触发更新逻辑一同使用。实质上,一旦产生触发更新报文,一个时钟就会开始向下计数直到0。一旦计时器递减到0,路由器就不再接收从任何相邻路由器处发来的关于此路由或目的地的更新。
![]() |
| 三个通向D的网关 |
![]() |
| 三个网关计值到无穷 |
这种方式防止R I P路由器接收已经在一个配置时间内被作废了的路由更新。也能防止路由器错误地认为另一个路由器有到达无效目的地的可靠路由。
对跳数的讨论为考察R I P的下一个基本限制作了很好的铺垫,这个限制就是:固定耗费度量。虽然耗费度量能由管理员配置,但它们本质上是静态的。R I P不能实时地更新它们以适应网络中遇到的变化。由管理员定义的耗费度量保持不变,直到手动更新。
这意味着R I P尤其不适合于高度动态的网络,在这种环境中,路由必须实时计算以反映网络条件的变化。举个例子,假如网络支持对时间敏感的应用,那么使用能基于可测的传输线路延迟或者给定线路上存在的负载情况来计算路由的协议就是合理的想法。R I P使用固定度量,因此,它不能支持实时路由计算。
从人的角度来看,等待3 0秒进行一次更新不会感到不方便。然而,路由器和计算机以比人快得多的速度运行。不得不等上3 0秒进行一次更新会有很明显的不利结果。
比仅仅等上3 0秒进行一次更新更具破坏性的却是不得不等上1 8 0秒来作废一条路由。而这只是一台路由器开始进行收敛所需的时间量。依赖于互联的路由器个数及它们的拓扑结构,可能需要重复更新才能完全收敛于新拓扑。R I P路由器收敛速度慢会创造许多机会使得无效路由仍被错误地作为有效路由进行广播。显然,这样会降低网络性能。
这本应充分地显示R I P内在的收敛慢所带来的危险性。
路由器的关键作用是用于网络的互连,每个路由器与两个以上的实际网络相连,负责在这些网络之间转发数据报。在讨论 IP 进行选路和对报文进行转发时,我们总是假设路由器包含了正确的路由,而且路由器可以利用 ICMP 重定向机制来要求与之相连的主机更改路由(具体请看 IP 部分的相应章节)。但在实际情况下 , IP 进行选路之前必须先通过某种方法获取正确的路由表。在小型的、变化缓慢的互连网络中,管理者可以用手工方式来建立和更改路由表。而在大型的、迅速变化的环境下,人工更新的办法慢得不能接受。这就需要自动更新路由表的方法,即所谓的动态路由协议, RIP 是其中最简单的一种。
RIP(route information protocol)协议是基于V-D算法(又称为Bellman-Ford算法)的内部动态路由协议。V-D是Vector-Distance的缩写,因此V-D算法又称为距离向量算法。这种算法在ARPARNET早期就用于计算机网络的路由的计算。RIP协议在目前已成为路由器、主机路由信息传递的标准之一,就因为这个原因,RIP协议被大多数IP路由器商业卖主广泛使用。
先大致解释一下什么是内部路由协议。由于历史的原因,当前的INTERNET网被组成一系列的自治系统,各自治系统通过一个核心路由器连到主干网上。而一个自治系统往往对应一个组织实体(比如一个公司或大学)内部的网络与路由器集合。每个自治系统都有自己的路由技术,对不同的自治系统路由技术是不相同的。用于自治系统间接口上的单独的协议称为外部路由器协议,简称EGP(Exterior Gateway Protocol)。用于自治系统内部的路由协议称为内部路由器协议,简称IGP(Interior Gateway Protocol)。 内部路由器与外部路由器协议EGP不同,外部路由协议只有一个,而内部路由器协议则是一族。各内部路由器协议的区别在于距离制式(distance metric, 即距离度量标准)不同,和路由刷新算法不同。RIP协议是最广泛使用的IGP之一,著名的路径刷新程序Routed便是根据RIP 实现的。RIP协议被设计用于使用同种技术的中型网络,因此适应于大多数的校园网和使用速率变化不是很大的连续线的地区性网络。对于更复杂的环境,一般不使用RIP协议。
在实现时,RIP作为一个系统长驻进程(daemon)而存在于路由器中,它负责从网络系统的其它路由器接收路由信息,从而对本地IP层路由表作动态的维护,保证IP层发送报文时选择正确的路由,同时广播本路由器的路由信息,通知相邻路由器作相应的修改。RIP协议处于UDP协议的上层(如图1.1),RIP所接收的路由信息都封装在UDP的数据报中,RIP 在520号端口上接收来自远程路由器的路由修改信息,并对本地的路由表做相应的修改,同时通知其它路由器。通过这种方式,达到全局路由的有效。
距离向量算法的思想很简单:所有参加RIP协议的路由器周期性地向外广播路由刷新报文,主要内容是由很多路由项(entry)组成的路由刷新报文。对路由来说,最主要的内容是目的地址和下一跳地址(next hop)。对动态路由协议来说,为了找到本协议概念中的最佳路由,还必须注意路由的开销(metric)。所以路由项主要包括了目的地址、下一跳地址和路由开销。其他的如路由标记(tag)等内容在讲报文格式时,将具体讲到。
在设计时,每个路由器的另外RIP管理了一个路由数据库,该路由数据库为系统中所有可能的信宿包含一个路由项,并为每个信宿保留如下信息:
·目的地址:在算法的IP实现中,这指的是主机或网络的IP 地址。
·下一跳地址:到信宿的路由中的第一个路由器。
·接口:用于到下一跳物理网络。
·metric值:一个数,指明本路由器到信宿的开销。
·定时器:路由项最后一次被修改的时间。
·路由标记:区分路由为内部路由协议的路由还是外部路由协议的路由的标记。
数据库由与系统直接相连的实体的描述初始化,通过从相邻路由器受到的报文修改维护。
路由器间交换的最重要的信息是修改报文,参加路由维护计划的路由器发送当前存在于实体的描述路由数据库的路由修改报文。仅通过相邻路由器间交换路由信息是可以维护整个系统的最佳路由的,这在接下来的讨论中会逐步得到证明。
距离向量算法总是基于一个这样的事实:路由数据库中的路由已是目前通过报文交换而得到的最佳路由。同时,报文交换仅限于相邻的实体间,也就是说,实体共享同一个网络。当然,要定义路由是最佳的,就必须有衡量的办法,这就用到前面所说的“metric”。RIP简单的网络中,通常用可行路由所经的路由器数简单地计算metric值。在复杂的网络中,metric一般代表该路由传输数据报的延迟或其它发送开销。
令D(i,j)代表从实体i到实体j的最佳路由的metric值,d(i,j)代表从i直接到j的开销,因为开销是可加的,算法中最佳路由如此获取表示:
D(i,i)=0, 对所有的i
D(i,j)=MIN[d(i,j)+D(k,j), 当i不等于k时
实体i从相邻路由器k收到k到j的开销的估计D(i,j),i将D(i,j)加上i到k的开销估计d(i,j),i比较从所有相邻路由器得到的数值,取得最小数,就得到了它到j的最佳路由。
具体地说,距离向量算法如下所述:
首先,路由器刚启动时,对距离向量路由表(V-D路由表)进行初始化,该初始化路由表包含所有去往与本路由器直接相连的网络的路径。由于去往直接相连的网络不经过中间路由器,所以初始化的V-D路由表中的各路由的距离均为0。
初始V-D路由表的一个示例。
![]() |
| “信宿网”域含信宿网IP地址 |
然后,各路由器周期性地向外广播其V-D路由表内容。与某路由器直接相连的(位于同一物理网络)的路由器收到该路由表报文后,根据此报文对本地路由表进行刷新。刷新时,路由器逐项检查来自相邻路由器的V-D报文,遇到下述表目之一,须修改本地路由表(假设路由器Gi收到路由器Gj的V-D报文):
1) Gj列出的某表目Gi路由表中没有。则Gi路由表中须增加相应表目,其“信宿”是Gj表目中的信宿,其“路径”为“Gj”(即下一路由器为Gj)。
2) Gj去往某信宿的距离值比Gi去往该信宿的距离减1还小。
这种情况说明,Gi去往某信宿若经过Gj,距离会更短。则Gi修改本表目,其中“信宿”域不变,“距离”为Gj表目中距离加1,“路径”为“Gj”。
3) Gi去往某信宿的路由经过Gj,而Gj去往该信宿的路由发生变化。
这里分两种情况:
a. Gj的V-D表不再包含去往某信宿的路由,则GI中相应路由须删除。
b. Gj的V-D表中去往某信宿的路由距离发生变化,则Gi中相应表目“距离”须修改,以Gj中的“距离”加1取代原来的距离。
上图对以上描述给出直观的说明,其中Gi、Gj为相邻路由器。
(a)路由器Gi原路由表
这里要特别强调的是, V-D 算法的路由刷新发生在相邻路由器之间,所以 V-D 报文不一定以广播方式发送出去,一种比较优化的思想是路由器直接向相邻路由器发送 V-D 报文,不必采用广播方式。
根据V-D算法,一条路由只在出现一条更优路由时才被刷新,否则,将继续保留在路由数据库中。这就忽略了这样一种情况,即当某条路由突然崩溃,需要选择一条新的路由来代替现存路由。但这靠V-D中的刷新算法来是不能得到解决的。
针对这种情况,在实际应用中,RIP规定,所有机器对其路由数据库中的每一表目都设置一个时钟,每增加一个新表目,就相应设置一个新时钟。在收到V-D报文中假如有关于此路由的表目,则将时钟清零,重新记时。假如在规定时间内,一直未收到该路由的刷新信息,时钟期满,则将该路由从路由数据库中删除。
如果到指定的信宿有其它路由,则新的路由将从进一步收到的定时刷新报文中获得,否则去往原信宿的路由不存在。
RIP根据V-D算法的特点,将协议的参加者分为主动机和被动机两种。主动机主动向外广播路由刷新报文,被动机被动地接收路由刷新报文。一般情况下,主机作为被动机,路由器则既是主动机又是被动机,即在向外广播路由刷新报文的同时,接受来自其它主动机的V-D报文,并进行路由刷新。
RIP规定,路由器每30秒向外广播一个V-D报文,报文信息来自本地路由表。RIP的V-D报文中,其距离以驿站计:与信宿网络直接相连的路由器规定为一个驿站,相隔一个路由器则为两个驿站……以此类推。一条路由的距离为该路由(从信源机到信宿机)上的路由器数。为防止寻径环长期存在,RIP规定,长度为16的路由为无限长路由,即不存在的路由。所以一条有效的路由长度不得超过15。正是这一规定限制了RIP的使用范围,使RIP局限于中小型的网络网点中。
为了保证路由的及时有效性,RIP采用触发刷新技术和水平分割法。当本地路由表发生修改时,触发广播路由刷新报文,以迅速达到最新路由的广播和全局路由的有效。水平分割法是指当路由器从某个网络接口发送RIP 路由刷新报文时,其中不包含从该接口获取的路由信息。这是由于从某网络接口获取的路由信息对于该接口来说是无用信息,同时也解决了两路由器间的慢收敛问题。
对于局域网的路由,RIP规定了路由的超时处理。主要是考虑到这样一个情况,如果完全根据V-D算法,一条路由被刷新是因为出现一条路由开销更小的路由,否则路由会在路由表中一直保存下去,即使该路由崩溃。这势必造成一定的错误路由信息。为此,RIP规定,所有机器对其寻径表中的每一条路由都设置一个时钟,每增加一条新路由,相应设置一个新时钟。在收到的V-D报文中假如有关于此路由的表目,则将时钟清零,重新计时。假如在120秒内一直未收到该路由的刷新信息,则认为该路由崩溃,将其距离设为16,广播该路由信息。如果再过60后仍未收到该路由的刷新信息,则将它从路由表中删除。如果某路由在距离被设为16后,在被删除前路由被刷新,亦将时钟清零,重新计时,同时广播被刷新的路由信息。至于路由被删除后是否有新的路由来代替被删除路由,取决于去往原路由所指信宿有无其它路由。假如有,相应路由器会广播之。机器一旦收到其它路由的信息,自然会利用V-D算法建立一条新路由。否则,去往原信宿的路由不再存在。
RIP启动和运行的整个过程如下所描述:
某路由器刚启动RIP时,以广播的形式向相邻路由器发送请求报文,相邻路由器的RIP收到请求报文后,响应请求,回发包含本地路由表信息的响应报文。RIP收到响应报文后,修改本地路由表的信息,同时以触发修改的形式向相邻路由器广播本地路由修改信息。相邻路由器收到触发修改报文后,又向其各自的相邻路由器发送触发修改报文。在一连串的触发修改广播后,各路由器的路由都得到修改并保持最新信息。同时,RIP每30秒向相邻路由器广播本地路由表,各相邻路由器的RIP在收到路由报文后,对本地路由进行的维护,在众多路由中选择一条最佳路由,并向各自的相邻网广播路由修改信息,使路由达到全局的有效。同时RIP采取一种超时机制对过时的路由进行超时处理,以保证路由的实时性和有效性。RIP作为内部路由器协议,正是通过这种报文交换的方式,提供路由器了解本自治系统内部个网络路由信息的机制。
RIP-2支持版本1和版本2两种版本的报文格式。在版本2中,RIP还提供了对子网的支持和提供认证报文形式。版本2的报文提供子网掩码域,来提供对子网的支持;另外,当报文中的路由项地址域值为0xFFFF时,默认该路由项的剩余部分为认证。RIP2对拨号网的支持则是参考需求RIP和触发RIP的形式经修改而加入的新功能。这时,我们只是要求在拨号网拨通之后对路由进行30秒一次的广播,而在没拨通时并不作如是要求,这是根据具体情况变通的结果。
为了更好地处理拨号网上的路由刷新,参照RFC/1581/15822091/2092标准,对报文格式进行了的改进和扩充修改。对报文的修改主要是支持三种新的报文分组类型,在报文命令域数值标识:
9---------Update Request 修改请求
10------- Update Response 修改响应
11--------Update Acknowledge 修改确认
其中Version域指的是各报文的版本号,而不是RIP的版本号,主要是基于向后兼容性考虑,这里必须为 1。
增添Flush域是对路由的及时性的一种考虑。如果对外发送响应报文是在收到请求后发送的,说明信宿有一个从不可达到可达的变化。如果该信宿中还保留有到其它路由器的路由信息,则这些路由信息很可能是过时的,从而需要进行更新。为了更快地更新路由器中的路由信息。在报文中增添一个Flush域,当路由器收到设置了Flush值的修改报文后,要将路由数据库中的原有路由设为“临时性路由”,进行超时处理。Flash域在设置时为 1 ,在不设置时为 0 ,取其他值则认为报文非法。
Sequence number是对报文的标记,用于识别各报文的确认报文,但只对发送方有用。对发送方来说,Sequence number不能有相同值,修改报文的Sequence number一般采取以65535为一个轮回的递增方式。而确认报文的Sequence number值取对应修改报文中的响应值。当路由器收到确认报文后,可根据Sequence number 值来确认对应的修改报文已被收到。
根据前面所说到的RIP协议不难看出,RIP进行报文刷新的基础是网络在刷新过程中一直保持连通,否则将有的路由器的报文一直不被收到,最终到达该路由器的路由将被其它路由器因超时而删除,而本路由器到其它路由器的路由亦将由于长期不被刷新而被删除。就这点来说,对于局域网和专线网来说,无疑是可行的;但对于拨号网络(例如X.25网和ISDN网)来说,网络在可以被拨通的情况下并非一直保持连接,自然亦不可能在不需要传送数据时因为要发送RIP报文而每30秒拨通一次网络。同时,路由信息亦可能因提供给拨号网上路由器的带宽不够而传输失败。种种情况表明,前面所描述的RIP协议已远远不够这种需求。
针对这种情况,我对RIP协议的实现作了进一步的改进和扩展,经过扩展和改进后,本文档中描述的RIP协议已不是传统意义上的RIP协议所能概括的了。
RIP协议是来允许路由器(或相关产品)通过基于IP网络交换有关计算路由信息的一种距离向量协议。RIP传送路由信息给信宿,信宿可以是路由器和主机,当信宿是主机时,主机必须有多个接口。
·RIP作为一个系统常驻进程(daemon)存在,它负责从网络信筒中其它路由器接收路由更改信息,从而对本地IP层的路由进行动态地维护,保证IP层发送报文时选择正确的路由。RIP协议处于UDP协议的上层,RIP所接收的路由修改信息都封装在UDP的数据报中,RIP在520号端口上接收来自远程路由器的路由修改信息,并对本地的路由表做相应的修改,同时通知其它的路由器,通过这种方式,达到全局路由的的有效。
RIP协议的报文格式
本协议在实现过程中支持RIP Version1和RIP Version2两种格式的报文。RIP数据报一共有五类,由Command 域确定数据报的类型,如图4.1所示。

其中第1、2类报文是最重要的一对,后者是从发送该报文的路由器的寻径表中取出的V-D报文。各种RIP报文的格式相同,包括一个固定的报头和一个可选的V-D表。其格式如图4.2和图4.3所示,图2是RIP Version 1的报文格式,图3是RIP Version 2的报文格式。
RIP Version1 的报文格式:

其中:
·Metric:到下一路由器的权值。
·Address Family Identifier:指示路由项中的地址种类,这里应为2。
·Ip Address:地址域,包括网络类和IP 地址在内,RIP报文中对每一网络共有14个字节的地址空间。
·RIP Version 2 报文的特有的一些属性:
·Route Tag:外部路由标记,是表示路由是保留还是重播的属性。它提供一种从外部路由中分离内部路由的方法,用于传播从外部路由器协议(EGP)获得的路由信息。
· Subnet mask:子网掩码,应用于IP地址产生非主机部分地址,为0时表示不包括子网掩码部分,使得RIP能够适应更多的环境。
· Next Hop:下一驿站,可以对使用多路由协议的网络环境下的路由进行优化。
· 认证,确认合法的信息包,目前支持纯文本的口令形式。
认证是每一报文的功能,因为在报文头中只提供两字节的空间,而任一合理的认证表均要求多余两字节的空间,故RIP Version 2认证表使用一个完整的RIP路由项。如果在报文中最初路由项Address Family Identifier域的值是0xFFFF,路由项的剩余部分就是认证。包含认证RIP报文路由项采用如下格式:

·组播,为了降低那些没有监听RIP Version 2 报文的主机的不必要的开销,IP多目传送地址被用于定时广播。IP 多目地址是224.0.0.9。为了支持向后兼容,多目地址的使用是可配置的。如果能够多目传送,则它将被支持它所有接口使用。
·管理信息库,允许在路由软件内部对RIP操作进行监听和控制。
如果RIP-2路由器接收RIP-1的请求,它将以RIP-1的响应方式响应。如果路由器被配置成只发送RIP-2报文,它将不响应RIP-1的请求。
此文章讨论了有关对网络底层协议的攻击和防止攻击的方法,特别是关于路由和路由协议的漏洞,如Routing Information Protocol (RIP,路由信息协议), Border Gateway Protocol (边缘网关协议), Open Shortest Path First (OSPF,开放最短路径优先协议)等。
路由器在每个网络中起到关键的作用,如果一路由器被破坏或者一路由被成功的欺骗,网络的完整性将受到严重的破坏,如果使用路由的主机没有使用加密通信那就更为严重,因为这样的主机被控制的话,将存在着中间人(man-in-the-middle)攻击,拒绝服务攻击,数据丢失,网络整体性破坏,和信息被嗅探等攻击。
路由是一个巨大又复杂的话题,所以本人只是在此提到一部分知识,而且水平的关系,请大家多多指教。
===============================================================================
关于一些很普遍的路由器安全问题
多种路由器存在各种众所周知的安全问题,一些网络底层设备提供商如Cisco, Livingston, Bay等的普通安全问题大家可以参考下面地址,其中收集了不少安全漏洞:
http://www.antionline.com/cgi-bin/anticode/anticode.pl?dir=router-exploits
上面地址所收集的漏洞大部分无关于路由协议级的攻击,而是一些由于错误配置,IP信息包错误处理,SNMP存在默认的communit name string,薄弱密码或者加密算法不够强壮而造成。上面的一些攻击一般一个标准的NIDS都能够探测出来。这些类型的攻击对网络底层有一定的削弱性并可以组合一些高极别的协议进行攻击。
正确的配置管理可以处理不少普通的漏洞,如你必须处理一些标准的规程:不使用SNMP(或者选择强壮的密码),保持补丁程序是最新的,正确处理访问控制列表,出入过滤,防火墙,加密管理通道和密码,路由过滤和使用MD5认证。当然在采用这些规程之前你必须知道这些安全规则的相关的含义和所影响到的服务。
================================================================================
近来有关的一些低部构造防卫检测系统的开发
近来的在网络防护开发项目中比较不错的是一个IDS叫JiNao,你可以在下面的地址找到相关的内容:http://www.anr.mcnc.org/projects/JiNao/JiNao.html. JiNao是由DARPA发起的,并现在成为一个合作研究项目由MCNC和北卡罗莱纳州大学共同开发。JiNao在FreeBSD和Linux上运行的是在线模式(使用divert sockets),在Solaris运行在离线模式,并在3个网络上测试-MCNC,NCSU和由PC(操作系统做路由)和商业路由器组合的AF/Rome 实验室。测试结果显示了可以成功的防止多种类型的网络底层攻击并能很好的高精度的探测这些攻击。
当前,JiNao看起来在研究关于Open Shortest Path First (OSPF,开放最短路径优先)协议,并且最终JiNao会延伸到各种协议。JiNao指出,防卫攻击和入侵探测将会集成在网络管理内容中,所以JINao现在正趋向于网络防火墙,入侵探测系统和网络管理系统组合一体。
还有一个工具可以很好的分析高级的协议,如Agilent Advisor
(http://onenetworks.comms.agilent.com/)的网络分析工具,它能很好的支持多种路由协议并能定制过滤器来探测各种不正常的行为。
================================================================================
一些工作于路由协议的工具
-------------------------------
Linux divert sockets描述到:\"Divert socket能够在末端主机也能在路由器上进行IP信息包捕获和注入,信息包的捕获和插入发生在IP层上,捕获的信息包在用户空间转向到套接口中,因此这些信息包将不会达到它们的最终目的地,除非用户空间套接口重插入它们。这样在信息包捕获和重新插入之间可以在系统系统内核之外允许各种不同的操作(如路由和防火墙).\"(http://www.anr.mcnc.org/~divert/).简单的说divert socket就是由user space(用户空间)的程序来处理kernel(内核)中的IP packet(IP信息包),这个divert socket最早应用与FreeBSD系统中,如NAT就是应用了divert socket。这样使开发程序很容易,因为在用户层,而处理IP packet(IP信息包)的效率也比较高,因为是直接处理kernel(内核)中的IP packet(IP信息包)。
大家可以在下面的地址中找到相关的Divert socket:http://www.anr.mcnc.org/~divert/. Divert socket就象上面说最早实现于FreeBSD中,现在已经移植到Linux中并作为JiNao IDS项目的一部分采用。
------------------------------
另一个叫Nemesis Packet Injection suite,是一个比较强大的网络和安全工具,由Obecian开发,你可以在下面的地址获得:http://www.packetninja.net.最新的nemesis-1.1发行在2000年6月24号。Nemesis是一个\"命令行式的UNIX网络信息包插入套件\",并是一个很好的测试防火墙,入侵探测系统,路由器和其他网络环境的工具。它可以被攻击者使用和授权渗透探测者在主机和网络级的网络安全环境检测。其中这个站点还有一个演化的Nemesis叫Intravenous,发行于11/30/00. Intravenous看起来承载了Nemesis所有基本功能,其中不同的是增加了人工智能引擎的内容。更多有关Intravenous的信息你可以在packetninja.net站点里找到.
----------------------------
IRPAS,Internetwork Routing Protocol Attack Suite,由FX所写,可以在下面的站点找到http://www.phenoelit.de/irpas/.IRPAS包含了各种可工作于Cisco路由设备的协议层的命令行工具,包括如下这些命令: cdp--可发送Cisco router Discovery Protocol (CDP CISCO路由发现协议)消息;
igrp是能插入Interior Gateway Routing Protocol (IGRP 内部网关路由协议)消息;irdp用来发送ICMP Router Discovery Protocol (ICMP路由发现协议)消息;
irdresponder--可使用精心制作的信息包来响应IRDP请求;
ass--Autonomous System Scanner(自主系统扫描器,现在可下载的版本只支持IGRP),这里解释下Autonomous system,即一般所说的AS,简单的说是一组内部路由器,使用共同协议交流内部网络的信息,更直接的说法就是这些路由器自己自主,交流信息。与之相反的是我们经常知道的外部路由器如一般的电信节点处的路由器。典型的AS使用单一的路由协议在它的边界产生和传播路由信息。ass就类似于TCP端口扫描器一样,只不过其是针对自主系统的。使用ass扫描的话,如果自主系统应答,将返回路由进程中的所有路由信息。IRPAS 的网站也包含一条关于Generic Routing Encapsulation(GRE 一般路由封装) 漏洞的文档,其中这个Generic Routing Encapsulation (GRE 一般路由封装)漏洞允许外部攻击者绕过NAT和破坏一通过VPN的内部RFC1918网络。这份文档大家可以在下面的地址获得:http://www.phenoelit.de/irpas/gre.html,其中在其他章节还包含了更多的信息和通过irpas的可能攻击策略.
irpas的开发者FX,发送了由ass新版本2.14(还没有发布)扫描的AS样本和igrp怎样利用ass的信息(AS #10和其他数据)来插入一欺骗的路由给222.222.222.0/24。虽然IGRP协议目前不是很多使用,但这个例子却是相当的不错。下面是FX测试的结果:
test# ./ass -mA -i eth0 -D 192.168.1.10 -b15 -v(这里的-i是接口,-D是目的地址,-b15指的是自主系统0-15之间
ASS [Autonomous System Scanner] $Revision: 2.14 $
(c) 2k FX
Phenoelit (http://www.phenoelit.de)
No protocols selected; scanning all
Running scan with:
interface eth0
Autonomous systems 0 to 15
delay is 1
in ACTIVE mode
Building target list ...
192.168.1.10 is alive
Scanning ...
Scanning IGRP on 192.168.1.10
Scanning IRDP on 192.168.1.10
Scanning RIPv1 on 192.168.1.10
shutdown ...
OK,得到以下的结果
>>>>>>>>>>>> Results >>>>>>>>>>>
192.168.1.10
IGRP
#AS 00010 10.0.0.0 (50000,1111111,1476,255,1,0)
IRDP
192.168.1.10 (1800,0)
192.168.9.99 (1800,0)
RIPv1
10.0.0.0 (1)
test# ./igrp -i eth0 -f routes.txt -a 10 -S 192.168.1.254 -D 192.168.1.10
当然这里的routes.txt需要你自己指定:
routes.txt:
# Format
# destination:delay:bandwith:mtu:reliability:load:hopcount
222.222.222.0:500:1:1500:255:1:0
Cisco#sh ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, * - candidate default
U - per-user static route
Gateway of last resort is not set
10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 10.1.2.0/30 is directly connected, Tunnel0
S 10.0.0.0/8 is directly connected, Tunnel0
C 192.168.9.0/24 is directly connected, Ethernet0
C 192.168.1.0/24 is directly connected, Ethernet0
I 222.222.222.0/24 [100/1600] via 192.168.1.254, 00:00:05, Ethernet0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
看到没有,到达222.222.222.0/24经由192.168.1.254
-----------------------------
Rprobe & srip--这个工具附带在一篇关于RIP欺骗非常不错的指南文档中(由humble写),你可以在下面的地址找到这篇文章http://www.technotronic.com/horizon/ripar.txt.Rprobe工具会从一路由daemon(守护程序)中请求一RIP路由表的拷贝,使用Tcpdump或者其他任何嗅探工具可以用来捕获这些结果。接下来,srip可以用来从任意源IP发送一伪造的RIPv1或者RIPv2消息,Srip可以插入新的路由和使当前的路由无效,当然攻击者/渗透测试者需要知道命令行中使用什么参数。关于这些工具的介绍可参看Hacking Exposed 第二版Network Device节找到示例。
------------------------
当然还有其他工作与相关路由协议的工具可被攻击者或者渗透测试者使用,如:Routed,gated, zebra, mrt, 和 gasp ,大家可以参看其他的文档。
=================================================================================
下面是有关各种协议的浅释和相关漏洞及可以采用的防卫措施
Routing Information Protocol (RIP,路由信息协议)
Routing Information Protocol (RIP,路由信息协议)是基于距离矢量的路由协议,其所有路由基于(hop)跳数来衡量。由Autonomous System (AS,自主系统) 来全面的管理整个由主机,路由器和其他网络设备组成的系统。RIP是作为一种内部网关协议(interior gateway protocol),即在自治系统内部执行路由功能。相反的大家都知道外部网关路由协议(exterior gateway protocol),如边缘网关协议(BGP),在不同的自治系统间进行路由。RIP协议对大型网络来说不是一个好的选择,因为它只支持15跳,RIPv1而且只能通信自身相关的路由信息,反之RIPv2能对其他路由器进行通信。RIP协议能和其他路由协议共同工作,依照Cisco,RIP协议经常用来与OSPF协议相关联,虽然很多文荡指出OSPF需代替RIP. 应该知道经由RIP更新提交的路由可以通过其他路由协议重新分配,这样如果一攻击者能通过RIP来欺骗路由到网络,然后再通过其他协议如OSPF或者不用验证的BGP协议来重新分配路由,这样攻击的范围将可能扩大。
RIP协议相关的漏洞和防范措施
一个测试者或者攻击者可以通过探测520 UDP端口来判断是否使用RIP,你可以使用熟悉的工具如nmap来进行测试,如下所示,这个端口打开了并没有使用任何访问控制联合任意类型的过滤:
[root@test]# nmap -sU -p 520 -v router.ip.address.2
interesting ports on (router.ip.address..2):
Port State Service
520/udp open route
扫描UDP520端口在网站http://www.dshield.org/的\"Top 10 Target Ports\"上被排列在第7位,你表明有许多人在扫描RIP,这当然和一些路由工具工具的不断增加有一定的关联。
RIPv1 天生就有不安全因素,因为它没有使用认证机制并使用不可靠的UDP协议进行传输。RIPv2的分组格式中包含了一个选项可以设置16个字符的明文密码字符串(表示可很容的被嗅探到)或者MD5签字。虽然RIP信息包可以很容易的伪造,但在RIPv2中你使用了MD5签字将会使欺骗的操作难度大大提高。一个类似可以操作的工具就是nemesis项目中的RIP命令--nemesis-rip,但由于这个工具有很多的命令行选项和需要必备的知识,所以nemesis-rip 比较难被script kiddies使用。想使用nemesis-rip成功进行一次有效的RIP欺骗或者类似的工具需要很多和一定程度的相关知识。不过\"Hacking Exposed\"第二版第10章:Network Devices提到的有些工具组合可以比较容易的进行RIP欺骗攻击攻击,这些工具是使用rprobe来获得远程网络RIP路由表,使用标准的tcpdump或者其他嗅探工具来查看路由表,srip来伪造RIP信息包(v1或者v2),再用fragrouter重定向路由来通过我们控制的主机,并使用类似dsniff的工具来最后收集一些通信中的明文密码。
尽管大家知道欺骗比较容易,但仍然存在一些大的网络提供商仍旧依靠RIP来实现一些路由功能,虽然不知道他们是否采用来安全的措施。RIP显然目前还是在使用,呵呵但希望很少人使用RIPv1,并且使用了采用MD5安全机制的RIPv2,或者已经移植到了使用MD5认证的OSPF来提高安全性。
Border Gateway Protocol (BGP,边界网关协议)
BGP是Exterior Gateway Protocol (EGP,外部网关协议),此协议执行的时候自主系统之间的路由,现在BGP4是最近的流行标准,BGP使用几种消息类型,其中这文章相关的最重要的消息是UPDATE消息类型,这个消息包含了路由表的更新信息,全球INTERNET大部分依靠BGP,因此一些安全问题必须很严肃的对待,L0pht几年就宣称过:他们能在很短的时间内利用路由协议的安全如BGP来搞垮整个Internet.
BGP协议相关的漏洞和防范措施
BGP使用TCP 179端口来进行通信,因此nmap必须探测TCP 179端口来判断BGP的存在。
[root@test]# nmap -sS -p 179 -v router.ip.address.2
Interesting ports on (router.ip.address..2):
Port State Service
179/tcp open bgp
-一个开放的BGP端口,更容易被攻击
[root@test]# nmap -sS -n -p 179 router.ip.address.6
Interesting ports on (router.ip.address.6):
Port State Service
179/tcp filtered bgp
BGP端口被过滤了,对攻击有一定的抵抗力。
由于BGP使用了TCP的传输方式,它就会使BGP引起不少关于TCP方面的问题,如很普遍的SYN Flood攻击,序列号预测,一般拒绝服务攻击等。BGP没有使用它们自身的序列而依靠TCP的序列号来代替,因此,如果设备采用了可预测序列号方案的话,就存在这种类型的攻击,幸好的是,运行在Internet上大部分重要的路由器使用了Cisco设备,而其是没有使用可预测序列号方案。
部分BGP的实现默认情况下没有使用任何的认证机制,而有些可能存在和RIP同样的问题就是使用了明文密码。这样假如认证方案不够强壮的话,攻击者发送UPDATE信息来修改路由表的远程攻击的机会就会增加许多,导致进一步的破坏扩大。
BGP也可以传播伪造的路由信息,如果攻击者能够从一协议如RIP中修改或者插入路由信息并由BGP重新分配。这个缺陷是存在与信任模块中而不是其协议本身。另外BGP的community 配置也会有某些类型的攻击,原因是community name在某些情况下是作为信任token(标志)可以被获得。至于通过通过BGP的下层协议(TCP)对其攻击看来是比较困难的,因为会话在点对点之间是通过一条单独的物理线路进行通信的,但在一定环境如在两AS系统通过交换机来连接则可能存在TCP插入的攻击,在这样的网络中,攻击者在同一VLAN或者他有能力嗅探switch的通信(如使用dsniff工具通过ARP欺骗来获得),监视TCP序列号,插入修改的信息包或者使用工具如hunt的进行hijack连接而获得成功,但这种类型的攻击一般只能在实验室环境中演示比较容易,而在实际的网络中因为太过复杂而很难成功。
要使BGP更安全,你最好对端口179采用访问列表控制,使用MD5认证,使用安全传输媒体进行安全BGP通信和执行路由过滤(你可以查看下面的文档(see http://www.cisco.com/univercd/cc/td/doc/product/software/ios120/12cgcr/np1_c/1cprt1/1cbgp.htm#40309)以及一些标准的路由安全设置过滤配置。
------------------------
Open Shortest Path First (OSPF,开放最短路径优先协议)
OSPF是动态连接状态路由协议,其保持整个网络的一个动态的路由表并使用这个表来判断网络间的最短路径,OSPF是内部使用连接状态路由协议,协议通过向同层结点发送连接状态信息(LSA)工作,当路由器接收到这些信息时,它就可以根据SPF算法计算出到每个结点的最短路了。其他相临路由器通过使用OSPF的Hello协议每10秒发送一个问候包给224.0.0.5,然后接收这些路由器发回的信息。一个OSPF的hello信息包头可以通过iptraf来嗅探到,如下所示:
OSPF hlo (a=3479025376 r=192.168.19.35) (64 bytes) from 192.168.253.67 to 224.0.0.5 on eth0
192.168.253.67边界路由器发送一个helo信息包给多播(224.0.0.5)来告诉其他路由器和主机怎样
从192.168.19.35联系区域a(a=3479025376).
一旦路由器接受到Hello信息包,它就开始同步自己的数据库和其他路由一样。
一个LAS头包括以下几个部分: LS age, option, LS type, Link state ID, Advertising Router ID,
LS sequence number, LS checksum, 和 length.
OSPF协议相关的漏洞和防范措施
OSPF使用协议类型89,因此你可以使用nmap协议扫描来判断OSPF,除非网络通过配置访问列表来不响应这些类型的查询。如下所示:
root@test]# nmap -sO -router.ip.address.252
Interesting protocols on (router.ip.address.252):
Protocol State Name
89 open ospfigp
OSPF由于内建几个安全机制所以比起RIP协议安全的多,但是,其中LSA的几个组成部分也可以通过捕获和重新注入OSPF信息包被修改,JiNao小组开发了一个FREEBSD divert socket的LINUX实现并在它们的测试中使用到。
OSPF可以被配置成没有认证机制,或者使用明文密码认证,或者MD5,这样如果攻击者能获得一定程度的访问,如他们可以使用如dsniff等工具来监视OSPF信息包和或者明文密码,这个攻击者可以运行divert socket或者其他可能的各种类型ARP欺骗工具来重定向通信。
JiNao小组发现了有关OSPF的4种拒绝服务的攻击方法,下面是简单的说明:
--Max Age attack攻击 LSA的最大age为一小时(3600)
攻击者发送带有最大MaxAge设置的LSA信息包,这样,最开始的路由器通过产生刷新信息来发送这个LSA,而后就引起在age项中的突然改变值的竞争。如果攻击者持续的突然插入最大值到信息包给整个路由器群将会导致网络混乱和导致拒绝服务攻击。
--Sequence++ 攻击 即攻击者持续插入比较大的LSA sequence(序列)号信息包,根据OSPF的RFC介绍因为LS sequence number(序列号)栏是被用来判断旧的或者是否同样的LSA,比较大的序列号表示 这个LSA越是新近的。所以到攻击者持续插入比较大的LSA sequence(序列)号信息包时候,最开始的路由器就会产生发送自己更新的LSA序列号来超过攻击者序列号的竞争,这样就导致了网络不稳定并导致拒绝服务攻击。
--最大序列号攻击
就是攻击者把最大的序列号0x7FFFFFFF插入。根据OSPF的RFC介绍,当想超过最大序列号的时候,LSA就必须从路由domain(域)中刷新,有InitialSequenceNumber初始化序列号。这样如果攻击者的路由器序列号被插入最大序列号,并即将被初始化,理论上就会马上导致最开始的路由器的竞争。但在实践中,JiNao发现在某些情况下,拥有最大MaxSeq(序列号)的LSA并没有被清除而是在连接状态数据库中保持一小时的时间。
--伪造LSA攻击
这个攻击主要是gated守护程序的错误引起的,需要所有gated进程停止并重新启动来清除伪造的不正确的LSA,导致拒绝服务的产生。这个攻击相似对硬件的路由器不影响并且对于新版本的gated也没有效果。
上面的一些信息你可以参考http://www.ietf.org/rfc/rfc2328.txt和JiNao对OSPF的漏洞分析:On the Vulnerabilities and Protection of OSPF Routing Protocol (http://www.anr.mcnc.org/projects/JiNao/ic3n98.ps).
nemesis-ospf能对OSPF协议产生上述攻击,但是,由于nemesis-ospf太多的选项和需要对OSPF有详细深刻的了解,所以一般的攻击者和管理人员难于实现这些攻击。并且也听说nemesis-ospf也不是一直正常正确的工作,就更限制了这个工具的使用价值。
OSPF认证需要KEY的交换,每次路由器必须来回传递这个KEY来认证自己和尝试传递OSPF消息,路由器的HELLO信息包在默认配置下是每10秒在路由器之间传递,这样就给攻击者比较的大机会来窃听这个KEY,如果攻击者能窃听网络并获得这个KEY的话,OSPF信息包就可能被伪造,更严重的会盲目重定向这些被伪造的OSPF信息包。当然这些攻击少之又少,不光光是其难度,重要的是因为还有其他更容易的安全漏洞可以利用,谁不先捏软柿子.
这里建议如果一个主机不要使用动态路由,大多数的主机使用静态路由就能很好的完成起功能。因为使用动态路由协议很会受到攻击,例如,几年以前gated软件就被发现有一个认证的问题。
-------------------------
关于使用IRPAS对CDP和IRDP攻击
IRPAS的cdp程序主要对发送CDP (Cisco router Discovery Protocol)消息给CISCO路由器并对内部网络段产生拒绝服务攻击,发送一些垃圾字符就会导致路由器重新启动或者崩溃。它也能作为欺骗来使用,为其他更危险的程序打开方便的大门,一种可能的攻击场景:如使用cdp来使路由器停止服务,然后使用irdp或者irdresponder工具发送高优先值来通知一新的路由器,这样如果我们的目标路由器不能与被拒绝服务攻击而停止服务的通信,新的路由器的高优先值就会被采用,如果攻击者设置的这个值被成功采用的话,攻击者就能在他们的系统中轻松插入通信路径。
这种类型的攻击也可以应用在某些配置了使用IRDP协议的主机,如WINDOWS98默认情况下配置使用IRDP,WINNT需要手工配置支持IRDP环境,并在启动的时候广播3个ICMP Router Solicitation messages(ICMP路由请求消息)。L0pht有文章详细的描述关于WINDOWS和SUN机器上的采用IRDP而存在漏洞,你可以在下面的地址找到这篇文章:
http://www.atstake.com/
路由器的工作不外乎两个,一是路径选择,二是数据转发。进行数据转发相对容易一些,难的是如何判断到达目的网络的最佳路径。所以,路径选择就成了路由器最重要的工作。
许多路由协议可以完成路径选择的工作,常见的有RIP,OSPF,IGRP和 EIGRP协议等等。这些算法中,我们不能简单的说谁好谁坏,因为算法的优劣要依据使用的环境来判断。比如RIP协议,它有时不能准确地选择最优路径,收敛的时间也略显长了一些,但对于小规模的,没有专业人员维护的网络来说,它是首选的路由协议,我们看中的是它的简单性。
如果你手头正有一个小的网络项目,那么,就让我们来安排一个计划,30分钟读完本文(一读),20分钟再细看一遍本文提及的命令和操作方法(二读),用30分钟配置网络上的所有路由器(小网络,没有几台路由器可以配的),最后20分钟,检查一下网络工作是否正常。好了,一百分钟,你的RIP网络运转起来了。就这么简单,不信,请继续往下看。
一、RIP是什么
RIP(Routing Information Protocols,路由信息协议)是使用最广泛的距离向量协议,它是由施乐(Xerox)在70年代开发的。当时,RIP是XNS(Xerox Network Service,施乐网络服务)协议簇的一部分。TCP/IP版本的RIP是施乐协议的改进版。RIP最大的特点是,无论实现原理还是配置方法,都非常简单。
度量方法
RIP的度量是基于跳数(hops count)的,每经过一台路由器,路径的跳数加一。如此一来,跳数越多,路径就越长,RIP算法会优先选择跳数少的路径。RIP支持的最大跳数是15,跳数为16的网络被认为不可达。
路由更新
RIP中路由的更新是通过定时广播实现的。缺省情况下,路由器每隔30秒向与它相连的网络广播自己的路由表,接到广播的路由器将收到的信息添加至自身的路由表中。每个路由器都如此广播,最终网络上所有的路由器都会得知全部的路由信息。正常情况下,每30秒路由器就可以收到一次路由信息确认,如果经过180秒,即6个更新周期,一个路由项都没有得到确认,路由器就认为它已失效了。如果经过240秒,即8个更新周期,路由项仍没有得到确认,它就被从路由表中删除。上面的30秒,180秒和240秒的延时都是由计时器控制的,它们分别是更新计时器(Update Timer)、无效计时器(Invalid Timer)和刷新计时器(Flush Timer)。
路由循环
距离向量类的算法容易产生路由循环,RIP是距离向量算法的一种,所以它也不例外。如果网络上有路由循环,信息就会循环传递,永远不能到达目的地。为了避免这个问题,RIP等距离向量算法实现了下面4个机制。
水平分割(split horizon)。水平分割保证路由器记住每一条路由信息的来源,并且不在收到这条信息的端口上再次发送它。这是保证不产生路由循环的最基本措施。
毒性逆转(poison reverse)。当一条路径信息变为无效之后,路由器并不立即将它从路由表中删除,而是用16,即不可达的度量值将它广播出去。这样虽然增加了路由表的大小,但对消除路由循环很有帮助,它可以立即清除相邻路由器之间的任何环路。
触发更新(trigger update)。当路由表发生变化时,更新报文立即广播给相邻的所有路由器,而不是等待30秒的更新周期。同样,当一个路由器刚启动RIP时,它广播请求报文。收到此广播的相邻路由器立即应答一个更新报文,而不必等到下一个更新周期。这样,网络拓扑的变化会最快地在网络上传播开,减少了路由循环产生的可能性。
抑制计时(holddown timer)。一条路由信息无效之后,一段时间内这条路由都处于抑制状态,即在一定时间内不再接收关于同一目的地址的路由更新。如果,路由器从一个网段上得知一条路径失效,然后,立即在另一个网段上得知这个路由有效。这个有效的信息往往是不正确的,抑制计时避免了这个问题,而且,当一条链路频繁起停时,抑制计时减少了路由的浮动,增加了网络的稳定性。
即便采用了上面的4种方法,路由循环的问题也不能完全解决,只是得到了最大程度的减少。一旦路由循环真的出现,路由项的度量值就会出现计数到无穷大(Count to Infinity)的情况。这是因为路由信息被循环传递,每传过一个路由器,度量值就加1,一直加到16,路径就成为不可达的了。RIP选择16作为不可达的度量值是很巧妙的,它既足够的大,保证了多数网络能够正常运行,又足够小,使得计数到无穷大所花费的时间最短。
邻居
有些网络是NBMA(Non-Broadcast MultiAccess,非广播多路访问)的,即网络上不允许广播传送数据。对于这种网络,RIP就不能依赖广播传递路由表了。解决方法有很多,最简单的是指定邻居(neighbor),即指定将路由表发送给某一台特定的路由器。
RIP的缺陷
RIP虽然简单易行,并且久经考验,但是也存在着一些很重要的缺陷,主要有以下几点:
过于简单,以跳数为依据计算度量值,经常得出非最优路由;
度量值以16为限,不适合大的网络;
安全性差,接受来自任何设备的路由更新;
不支持无类IP地址和VLSM(Variable Length Subnet Mask,变长子网掩码);
收敛缓慢,时间经常大于5分钟;
消耗带宽很大。
二、路由器怎么配
路由器本身就是一台有多个网络接口的计算机,同普通计算机一样,它也有中央处理器(CPU)、系统主存(RAM)和只读存储器(ROM)等部件。
除此之外,一个很重要的部分是它的网络接口(Interface),为了连结不同类型的网络,路由器的网络接口种类繁多,比如应用在局域网中的以太、快速以太、令牌环接口,应用于广域网的V.35、RS232、ISDN BRI PRI接口等等。
路由器的外存储器主要有两种:NVRAM(Non-Volatile RAM,非易失性RAM)和Flash(闪存)。NVRAM存储路由器的配置文件,Flash用于存放操作系统IOS(Internet Operating System)。
配置模式
CISCO路由器最基本的配置模式有两种:用户(user)和特权(privileged)。在用户模式下,只能显示路由器的状态,特权模式还可以更改路由器的配置。
特权模式下可以进入安装(setup)模式、全局配置(global config)模式,局部配置(sub config)模式。
安装模式提供菜单提示,引导用户进行路由器的基本配置。新路由器第一次启动后,自动进入安装模式。
全局配置模式中可以改变路由器的全局参数,如主机名、密码等等。
局部配置改变路由器的局部参数,例如某一个网络接口的配置、某一种路由协议的配置等等。
配置方法
路由器的配置可以使用多种方法,下面这五种是最常见的:
使用超级终端类的工具通过串行口登录控制台(console port)。
将调制解调器连结至路由器的辅助口(auxiliary port),远程拨号登录控制台。
远程登录(telnet)至路由器的某一IP 地址,通过VTY(virtue terminal line,虚拟终端)方式访问路由器。
编辑配置文件,并通过TFTP上传至路由器。
通过网络管理软件(network management system)远程设置路由器参数。
安装路由器
假设我们的项目网络中只有三台路由器。它们放在北京、上海和天津,名字分别叫testBJ、testSH和testTJ。我们采用B类保留IP地址172.16.0.0,共划分了四个子网172.16.1.0、172.16.2.0、172.16.3.0和172.16.4.0,子网掩码均为255.255.255.0。
基本配置
将包装中附带的串行电缆一端连接到Beijing路由器的console口上,另外一端连接到计算机的com口上。启动超级终端程序(Win95/NT中),作适当配置,连接路由器。给路由器加电,连续键入数个回车,出现如下提示符,显示路由器处于用户模式。
testBJ>
由用户模式转入特权模式,使用enable命令。
testBJ> enable
testBJ#
和UNIX主机一样,“#”代表特权(root)用户的系统提示符,它表示你进入了特权模式。与enable作用相反,即从特权模式返回用户模式的命令是disable。
特权模式下,可以使用config terminal命令进入全局配置模式。全局配置模式下,可以使用一些配置子项的名称进入局部配置模式。返回的方法都是exit命令。其中,从局部配置模式直接返回特权模式的命令是end。如下所示。
testBJ#config terminal
Enter configuration commands, one per line. End with CNTL/Z.
testBJ(config)#router rip
testBJ(config-router)#exit
testBJ(config)#exit
testBJ#
CISCO IOS的一个非常引人的特色是它的命令行帮助,一个?解决了所有的问题。?可以显示当前模式下的命令列表,可以显示命令全称,还可以显示命令的参数和帮助信息。在任何对命令不确定的地方键入?,系统会给出提示信息。
CISCO路由器还支持命令简写功能,只要不引起歧义,可以用命令的前几个字符替代整个命令,这样,配置时的打字工作量就小多了。
路由器的全部配置信息都保存在配置文件中,当前正在使用的配置文件是running-config,它存放在系统内存里,我们在特权模式下对配置的修改会立即反映到running-config中。startup-config是存储在NVRAM中的配置文件,只有它是掉电不丢失的,所以如果想使所做的修改到下一次启动时仍然有效,就必须保存当前配置。存盘命令如下:
testBJ#copy running-config startup-config
Building configuration...
[OK]
testBJ#
更改路由器名、密码
路由器的名字可以用hostname命令修改。
Router(config)#hostname testBJ
testBJ(config)#
enable password和enable secret命令可以修改特权模式的密码。
testBJ(config)#enable password cisco
testBJ(config)#enable secret cisco
进入line console局部配置模式下,修改console登录密码;进入line vty局部配置模式,修改telnet登录的密码。login命令指出需要登录,修改密码的命令都是password。
testBJ(config)#line console 0
testBJ(config-line)#login
testBJ(config-line)#password cisco
testBJ(config-line)#exit
testBJ(config)#line vty 0 4
testBJ(config-line)#login
testBJ(config-line)#password cisco
测试连通性
打开其余两台路由器,按上述方法进行配置,然后就可以检查它们之间是否连通了。
测试线路连通性的方法有三种,ping、traceroute和telnet。ping可以检测目的地是否可达;trace不仅检测连通性,还给出到达目的地所经过的路径;telnet测试应用层软件的连通性,如下所示。
testBJ#ping 172.16.4.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.16.4.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 24/25/28 ms
testBJ#traceroute 172.16.4.2
Type escape sequence to abort.
中括号里的内容是路由项的管理距离和度量值,RIP的缺省管理距离是120,到达3、4子网的度量值是1,即经过1个路由器可达。
同样的命令在另外两台路由器上运行,结果如下。
testSH#sh ip route
Gateway of last resort is not set
172.16.0.0/24 is subnetted, 4 subnets
R 172.16.4.0 [120/1] via 172.16.3.2, 00:00:13, Ethernet0/0
C 172.16.1.0 is directly connected, Ethernet0/1
R 172.16.2.0 [120/1] via 172.16.1.2, 00:00:11, Ethernet0/1
[120/1] via 172.16.3.2, 00:00:13, Ethernet0/0
C 172.16.3.0 is directly connected, Ethernet0/0
testTJ#sh ip route
Gateway of last resort is not set
172.16.0.0/24 is subnetted, 4 subnets
C 172.16.4.0 is directly connected, Ethernet0/0
R 172.16.1.0 [120/1] via 172.16.3.3, 00:00:07, Ethernet0/1
[120/1] via 172.16.2.3, 00:00:19, Serial1/0
C 172.16.2.0 is directly connected, Serial1/0
C 172.16.3.0 is directly connected, Ethernet0/1
分析上述命令输出时,一定要随时参照拓扑图,离开网络拓扑,上面的信息就没有任何意义。动态路由的灵活性体现在一条链路出现故障,路由算法会自动切换到迂回链路上。例如我们将testBJ和testTJ之间的串行线缆断开,一段时间后,再检查路由表,如下所示。
testBJ#sh ip route
Gateway of last resort is not set
172.16.0.0/24 is subnetted, 3 subnets
R 172.16.4.0 [120/2] via 172.16.1.3, 00:00:22, Ethernet0/1
C 172.16.1.0 is directly connected, Ethernet0/1
R 172.16.3.0 [120/1] via 172.16.1.3, 00:00:22, Ethernet0/1
我们发现串行链路所在的子网2断开了,到网络172.16.4.0网络的数据包都将绕经testSH路由器。
sh ip protocols命令可以显示当前路由协议的状况,如下所示。
testBJ#sh ip protocols
Routing Protocol is "rip"
Sending updates every 30 seconds, next due in 19 seconds
Invalid after 180 seconds, hold down 180, flushed after 240
Outgoing update filter list for all interfaces is not set
Incoming update filter list for all interfaces is not set
Redistributing: connected, rip
Default version control: send version 1, receive any version
Interface Send Recv Key-chain
Ethernet0/1 1 1 2
Serial1/0 1 1 2
Routing for Networks:
172.16.0.0
Routing Information Sources:
Gateway Distance Last Update
172.16.2.2 120 00:00:05
172.16.1.3 120 00:00:27
Distance: (default is 120)
从命令输出中,可以看出RIP协议的基本配置,还可以得知与当前路由器交换信息的路由器有testTJ(172.16.2.2)和testSH(172.16.1.3)两台路由器,上次接收路由信息分别在5秒和27秒之前。
要了解路由器之间交换路由信息的详情,可以使用debug ip rip命令。如下所示,输入命令后,隔一段时间,控制台上出现接收或者发送RIP广播的信息。
testBJ#debug ip rip
RIP protocol debugging is on
testBJ#
RIP: received v1 update from 172.16.2.2 on Serial1/0
172.16.4.0 in 1 hops
172.16.3.0 in 1 hops
RIP: received v1 update from 172.16.1.3 on Ethernet0/1
172.16.4.0 in 2 hops
172.16.3.0 in 1 hops
RIP: sending v1 update to 255.255.255.255 via Ethernet0/1 (172.16.1.2)
Internet的迅猛发展,使得网络规模急剧膨胀,信息量直线上升,新应用层出不穷,原有的己发展20多年的网络互连协议版本4——IPv4协议由于其先天的缺陷(地址空间不足、路由选择效率不高、安全性差、服务质量不高以及缺乏对移动的有效支持等),己经不能从根本上适应网络发展的需要。在这样的背景下,下一代网络标准——IPv6协议应运而生。本文探讨了Ripng用于IPv6网络的RIP。在IPv6技术作为下一代互联网IP层技术已成定局的情况下,深入研究未来网络中路由技术的简单,易用协议Ripng是一项走在信息技术学科前沿的课题之一,具有重要的经济和社会意义。
一、 RIP基本工作原理
路由信息协议RIP(RoutingInformationProtocol)是互联网工程任务组(IETF)的内部网关协议工作组为IP网络专门设计的路由协议,是一种基于距离矢量算法的内部网关动态路由协议。
每个运行RIP的路由器都维护着一张RIP路由表,该路由表的内容如图所示。
![]() |
| 路由表示意图 |
其中,下一跳(nexthop)表示下一站数据包要到达的地址,度量(metric)代表把数据包从本路由器送达目的站所需的花费(cost)。RIP协议支持的最大有效度量为15,当一条路由的度量达到16后,那条路由就被认为无效,并且认为对应的目的地不可达。
标志位标志此路由最近是否发生变化,以备触发更新时用到,年龄实际是个定时器,用于维护每条路由。在RIP中若哪条路由经过180秒后仍未被刷新,则该路由被认为不再有效,而把其度量置成16。
RIP路由器周期性地以多播形式向邻居发送自己的路由表拷贝,即组,每个接收到该消息的路由器修改消息中路由的度量,在每条路由的度量上加上接收该路由消息接口的花费。然后,依据度量的大小来判断路由的好坏,把度量最小的一条路由放入路由表,其判断过程如下:
(1)查看路由表中是否已有到该目的的路由;(2)如果没找到,则添加该路由;(3)如果找到,只有在新度量更小时才更新路由,否则,忽略该路由。
图2是RIP的工作流程。由此图大家就可以很清楚的感受到RIP拥有如此简单的工作流程。
![]() |
| RIP的工作流程 |
如图2所示,当在RouterA路由器的某接口上启动RIP,接口以多播形式向邻居发送路由表信息请求,请求邻居给自己发送路由表信息;邻居RouterB接收到路由表信息请求,发送整个路由表信息对请求进行响应;RouterA和RouterB在启动后就开始周期发送并周期更新路由器;RouterA检测到路由变化时,以多播形式向邻居发送触发更新,通知邻居路由变化。
二、IPv6时代RIP的演变
众所周知,如今的RIP已经从RIP-1发展到RIP-2,直到今天有变革意义的基于IPv6的Ripng!研究RIP的演变过程,剖析其各个发展阶段的异同点对于优化、发展该协议具有重要的意义。
RIP-1只在有子网划分的网络中支持子网,在该网络外部由于子网掩码很难得知,从而也就无法区分子网项和主机项,这样就需要强制使用严格层次路由:外部路由器把分组传递到该网中距离最近的路由器,而不考虑目的站点属于哪个子网。紧跟在严格层次路由之后是对连通性的要求,即这个网络中的每一个路由器都应该知道如何去往任何一个子网!
基于上述缺点,RIP-2定义了一套有效的RIP改进方案,把RIP-1的格式中含有的一些“必须为零”的域,进行了重新定义。
基于安全考虑添加了新的AFI项(0xFFFF)用来传送“验证数据”;添加了“路由选择域”、“下一跳域”,允许在单个路由器上运行多个RIP实例,指明发往目的IP地址的报文该发向哪里,“下一跳域”属性使得仅仅只有一个运行别种协议的路由器通告所有的路由,并且使得运行RIP的路由器能够找到正确运行别种协议的路由器作为下一跳以达到所有已知的别种协议的目的地址;添加了“子网掩码”,达到可以支持VLSM(可变长子网掩码)和CIDR(无类别域间路由)的目的,增强子网选择路由的性能;添加了“路由标签”,对外部路由进行标志。
RIP-2保留了RFC-1058中定义的“命令字”、“地址族标志符”、“IP地址”、“度量值”等域。
没有最好只有更好!在基于IPv4的RIP-1,RIP-2不断完善的状态下,IPv4虽然将一个成熟的互联网架构支撑了20年之久,但人们早已形成共识,那就是IPv6最终取代IPv4是大势所趋:128位地址格式所支持的IP地址数量可以彻底解决地址枯竭的问题;IPv4地址空间匮乏,路由选择效率差,安全性差,移动性差,服务质量保证差。所有这些IPv4问题将毫不犹豫地要求IPv6协议解决,于是Ripng(v6版本)将要,也必然会成为宠儿。
Ripng虽然隶属RIP家族,但毕竟它经历了一场变革。与RIP-1,RIP-2在各个方面都有差别:使用端口不同;分组格式不同;最大报文长度不同;下一跳不同;编址考虑不同;特殊请求不同;安全考虑不同。
Ripng与RIP-2均有下一跳的说法,但是RIP-2的下一跳是固化在包格式之中的,也就是说下一跳无论添不添都给它留4个字节的空间。而Ripng把下一跳(nexthop)与路由表项分开,使用“度量域”中的值来判断究竟是下一跳还是路由表项,若值是0xff则说明是下一跳!采用这种方法在无须添写下一跳信息时,则可以省略不添,从而节省了宝贵空间。
在Ripng与RIP改头换面的变化中,还有一个重大的变化!那就是在RIP-2包格式中有“子网掩码域”,而在Ripng中用一个字节的前缀长度代替了“子网掩码域”的功能,虽然这与IPv6协议的特点有着不可分割的关系,但是就其布局的合理性、优美性、简化性也足可以使我们优先考虑使用它。
三、Ripng的实现
Ripng的实现分为六个功能模块,即Ripng的启动、Ripng的关闭、输入处理、输出处理、定时器处理及路由操作,如图3所示。
![]() |
| Ripng模块组成 |
Ripng启动模块:完成Ripng协议的初始化工作,建立通信套接口;Ripng关闭模块:通知内核删除由RIPng进程导入的路由、释放Ripng进程占用的内存空间;输入处理模块:把Ripng当作一个黑盒子来处理,邻居所发送的数据包都是向该黑盒投放的信息,该模块主要是对这些信息进行相应处理;输出处理模块:输出处理主要包括周期更新和触发更新的处理;定时器处理模块:负责维护RIP中为支持寻路操作使用的三个定时器,同时还要负责处理触发更新中为防止广播风暴引入的定时机制;路由操作模块:负责路由条目的处理和路由表的查找和添删。
Ripng作为解决未来IPv6网络路由的首选,其简单内部网关协议有强大的优势和无限的潜力。一个优秀的路由技术,不仅仅是为数据传输找到一条高速的通道就行,还需要考虑所选路径的传输容量和服务质量,即具有QoS能力的路由算法,并且还要分析全网负荷,以平衡网络中各条通道的数据流量。在这些诸多因素考虑的基础上研究基于IPv6的Ripng路由协议正是我们今后研究的热点和重点。
使用R I P报文中列出的项, R I P主机可以彼此之间交流路由信息。这些信息存储在路由表中,路由表为每一个知道的、可达的目的地保留一项。每个目的地表项是到达那个目的地的最低开销路由。
注意每个目的地的表项数可以随路由生产商的不同而变化。生产商可能选择遵守规范,也可以对标准进行他们认为合适的“强化”。所以,用户很可能会发现某个特殊商标的路由器为每一个网络中的目的地存储至多4条相同费用的路由。
每个路由表项包括以下各域:
目的I P地址域
距离-向量度量域
下一跳I P地址域
路由变化标志域
路由计时器域
注意虽然RFC 1058是一个开放式标准,能支持大量互连网络地址结构,然而它是由I E T F设计用于I n t e r n e t中自治系统内的协议。如此,使用这种形式R I P的自然是网络互联协议。
1. 目的I P地址域
任何路由表中所包含的最重要信息是到所知目的地的I P地址。一旦一台R I P路由器收到一个数据报文,就会查找路由表中的目的I P地址以决定从哪里转发那个报文。
2. 度量标准域
路由表中的度量域指出报文从起始点到特定目的地的总耗费。路由表中的度量是从路由器到特定目的地之间网络链路的耗费总和。
3. 下一跳I P地址域
下一跳I P地址域包括至目的地的网络路径上下一个路由器接口的I P地址。如果目的I P地址所在的网络与路由器不直接相连时,路由器表中才出现此项。
4. 路由变化标志域
路由变化标志域用于指出至目的I P地址的路由是否在最近发生了变化。这个域是重要的,因为R I P为每一个目的I P地址只记录一条路由。
5. 路由计时器域
有两个计时器与每条路由相联系,一个是超时计时器,一个是路由刷新计时器。这些计时器一同工作来维护路由表中存储的每条路由的有效性。路由表维护过程在1 2 . 2 . 2节中详细描述。