5.网络间的互联
IP路由基础
自治系统

一般地我们可以把一个企业网络认为是一个自治系统AS(Autonomous System)。根据RFC1030的定义,自治系统是由一个单一实体管辖的网络,这个实体可以是一个互联网服务提供商,或一个大型组织机构。自治系统内部遵循一个单一且明确的路由策略。最初,自治系统内部只考虑运行单个路由协议;然而,随着网络的发展,一个自治系统内现在也可以支持同时运行多种路由协议。
LAN和广播域

一个AS通常由多个不同的局域网组成。以企业网络为例,各个部门可以属于不同的局域网,或者各个分支机构和总部也可以属于不同的局域网。
局域网内的主机可以通过交换机来实现相互通信。不同局域网之间的主机要想相互通信,可以通过路由器来实现。路由器工作在网络层,隔离了广播域,并可以作为每个局域网的网关,发现到达目的网络的最优路径,最终实现报文在不同网络间的转发。
此例中,RTA和RTB把整个网络分成了三个不同的局域网,每个局域网为一个广播域。LAN1内部的主机直接可以通过交换机实现相互通信,LAN2内部的主机之间也是如此。但是,LAN1内部的主机不LAN2内部的主机之间则必须要通过路由器才能实现相互通信。
路由选择

路由器收到数据包后,会根据数据包中的目的IP地址选择一条最优的路径,并将数据包转发到下一个路由器,路径上最后的路由器负责将数据包送交目的主机。
数据包在网络上的传输就好像是体育运动中的接力赛一样,每一个路由器负责将数据包按照最优的路径向下一跳路由器进行转发,通过多个路由器一站一站的接力,最终将数据包通过最优路径转发到目的地。当然有时候由于实施了一些特别的路由策略,数据包通过的路径可能并不一定是最佳的。
路由器能够决定数据报文的转发路径。如果有多条路径可以到达目的地,则路由器会通过进行计算来决定最佳下一跳。计算的原则会随实际使用的路由协议不同而不同。
IP路由表

路由器转发数据包的关键是路由表。
每个路由器中都保存着一张路由表,表中每条路由项都指明了数据包要到达某网络或某主机应通过路由器 的哪个物理接口发送,以及可到达该路径的哪个下一个路由器,或者不再经过别的路由器而直接可以到达目的地。
路由表中包含了下列关键项:
- 目的地址(Destination):用来标识IP包的目的地址或目的网络。
- 网络掩码(Mask):IP地址和网络掩码进 行“逻辑不”便可得到相应的网段信息。网络掩码的另一个作用还表现在当路由表中有多条目的地址相同的路由信 息时,路由器将选择其掩码最长的一项作为匹配项。
- 输出接口(Interface):指明IP包将从该路由器的哪个接口转发出去。
- 下一跳IP地址(NextHop):指明IP包所经由的下一个路由器的接口地址。
- 路由表中优先级、度量值等其他的几个字段我们将在以后进行介绍。
建立路由表

根据来源的不同,路由表中的路由通常可分为以下三类:
- 链路层协议发现的路由(也称为接口路由或直连路由)。
- 由网络管理员手工配置的静态路由。
- 动态路由协议发现的路由。
最长匹配原则

路由器在转发数据时,需要选择路由表中的最优路由。当数据报文到达路由器时,路由器首先提取出报文的目的IP地址,然后查找路由表,将报文的目的IP地址不路由表中某表项的掩码字段做“不”操作,“不”操作后的结果跟路由表该表项的目的IP地址比较,相同则匹配上,否则就没有匹配上。 当不所有的路由表项都进行匹配后,路由器会选择一个掩码最长的匹配项。
如图所示,路由表中有两个表项到达目的网段10.1.1.0,下一跳地址都是20.1.1.2。如果要将报文转发至网段10.1.1.1,则10.1.1.0/30符合最长匹配原则。
路由优先级

路由器可以通过多种不同协议学习到去往同一目的网络的路由,当这些路由都符合最长匹配原则时,必须决定哪个路由优先。
每个路由协议都有一个协议优先级(取值越小、优先级越高)。当有多个路由信息时,选择最高优先级的路由作为最佳路由。
如图所示,路由器通过两种路由协议学习到了网段10.1.1.0的路由。虽然RIP协议提供了一条看起来更加直连的路线,但是由于OSPF具有更高的优先级,因而成为优选路由,并被加入路由表中。
路由度量

如果路由器无法用优先级来判断最优路由,则使用度量值(metric)来决定需要加入路由表的路由。
一些常用的度量值有:跳数,带宽,时延,代价,负载,可靠性等。
- 跳数是指到达目的地所通过的路由器数目。
- 带宽是指链路的容量,高速链路开销(度量值)较小。
- metric值越小,路由越优先;因此,图示中metric=1+1=2的路由是到达
- 目的地的最优路由,其表项可以在路由表中找到。
路由 器转发数据包

路由器收到一个数据包后,会检查其目的IP地址,然后查找路由表。查找到匹配的路由表项之后,路由器会根据该表项所指示的出接口信息和下一跳信息将数据包转发出去。
静态路由基础

静态路由是指由管理员手动配置和维护的路由。静态路由配置简单,并且无需像动态路由那样占用路由器的CPU资源来计算和分析路由更新。
静态路由的缺点在于,当网络拓扑发生变化时,静态路由不会自动适应拓扑改变,而是需要管理员手动进行调整。 静态路由一般适用于结构简单的网络。
在复杂网络环境中,一般会使用动态路由协议来生成动态路由。不过,即使是在复杂网络环境中,合理地配置一些静态路由也可以改进网络的性能。
静态路由配置

ip route-static ip-address { mask | mask-length } interface-type interface-number [ nexthop-address ]
ip route-static 192.168.1.0 255.255.255.0 10.0.12.1
该命令用来配置静态路由。
- ip address指定了一个网络或者主机的目的地址。
- mask指定了一个子网掩码或者前缀长度。
- 如果使用了广播接口如以太网接口作为出接口,则必须要指定下一跳地址。
- 如果使用了串口作为出接口,则可以通过参数interface-type和interface-number(如Serial 1/0/0)来配置出接口,此时不必指定下一跳地址。
静态路由

静态路由可以应用在串行网络或以太网中,但静态路由在这两种网络中的配置有所不同。
在串行网络中配置静态路由时,可以只指定下一跳地址或只指定出接口。
以太网是广播类型网络,和串行网络情况不同。在以太网中配置静态路由,必须指定下一跳地址。

在广播型的接口上配置静态路由时,必须明确指定下一跳地址。
以太网中同一网络可能连接了多台路由器,如果在配置静态路由时只指定了出接口,则路由器无法将报文转发到正确的下一跳。在本示例中,RTA需要将数据转发到192.168.2.0/24网络,在配置静态路由时,需要明确指定下一跳地址10.0.123.2,否则,RTA将无法将报文转发到RTB所连接的192.168.2.0/24网络,因为RTA不知道应该通过RTB还是RTC才能到达目的地。
负载分担

当源网络和目的网络之间存在多条链路时,可以通过等价路由来实现流量负载分担。这些等价路由具有相同的目的网络和掩码、优先级和度量值。
#RTB上执行
ip route-static 192.168.1.0 255.255.255.0 10.0.12.1
ip route-static 192.168.1.0 255.255.255.0.20.0.12.1
本示例中RTA和RTB之间有两 条链路相连,通过使用等价的静态路由来实现流量负载分担。
- 在RTB上配置了两条静态路由,它们具有相同的目的IP地址和子网掩码、优先级(都为60)、路由开销(都为0),但下一跳不同。在RTB需要转发数据给RTA时,就会使用这两条等价静态路由将数据进行负载分担。
- 在RTA上也应该配置对应的两条等价的静态路由。
配置验证

display ip routing-table
在配置完静态路由之后,可以使用display ip routing-table命令来验证配置结果。
在本示例中,红色高亮部分代表路由表中的静态路由。这两条路由具有相同的目的地址和掩码,并且有相同的优先级和度量值,但是它们的下一跳地址和出接口不同。此时,RTB就可以通过这两条等价路由实现负载分担。
路由备份

在配置多条静态路由时,可以修改静态路由的优先级,使一条静态路由的优先级高于其他静态路由,从而实现静态路由的备份,也叫浮动静态路由。
在本示例中,RTB上配置了两条静态路由。正常情况下,这两条静态路由是等价的。通过配置preference 100,使第二条静态路由的优先级要低于第一条(值越大优先级越低)。路由器只把优先级最高的静态路由加入到路由表中。当加入到路由表中静态路由出现故障时,优先级低的静态路由才会加入到路由表并承担数据转发业务。
配置验证

display ip routing-table
从display ip routing-table命令的回显信息中可以看出,通过修改静态路由优先级实现了浮动静态路由。
正常情况下,路由表中应该显示两条有相同目的地、但不同下一跳和出接口的等价路由。由于修改了优先级,回显中只有一条默认优先级为60的静态路由。另一条静态路由的优先级是100,该路由优先级低,所以不会显示在路由表中。

当主用静态路由出现物理链路故障或者接口故障时,该静态路由不能再提供到达目的地的路径,所以在路由表中会被删除。此时,浮动静态路由会被加入到路由表,以保证报文能够从备份链路成功转发到目的地。
在主用静态路由的物理链路恢复正常后,主用静态路由会重新被加入到路由表,并且数据转发业务会从浮动静态路由切换到主用静态路由,而浮动静态路由会在路由表中再次被隐藏。
缺省路由

ip route-static 0.0.0.0 0.0.0.0 10.0.12.2
ip route-static 0.0.0.0 10.0.12.2 GigabitEthernet 0/0/0
当路由表中没有与报文的目的地址匹配的表项时,设备可以选择缺省路由作为报文的转发路径。在路由表中,缺省路由的目的网络地址为0.0.0.0,掩码也为0.0.0.0。
在配置缺省路由时,目的网络为0.0.0.0,代表的是任 意网络。
在本示例中,RTA使用缺省路由转发到达未知目的地址的报文。缺省静态路由的默认优先级也是60。在路由选择过程中,缺省路由会被最后匹配。
配置验证

配置缺省路由后,可以使用display ip routing-table命令来查看该路由的详细信息。
在本示例中,目的地址在路由表中没能匹配的所有报文都将通过GigabitEthernet 0/0/0接口转发到下一跳地址10.0.12.2。
距离矢量路由-RIP
路由信息协议-RIP

RIP(Routing Information Protocol)是一种比较简单的内部网关协议。RIP使用了基于距离矢量的贝尔曼-福特算法(Bellman-Ford)来计算到达目的网络的最佳路径。
最初的RIP协议开发时间较早,所以在带宽、配置和管理方面要求也较低,因此,RIP主要适合于规模较小的网络中。 RIP协议中定义的相关参数也比较少。例如,它不支持VLSM和CIDR,也不支持认证功能。
RIP工作原理

- 路由器启动时,路由表中只会包含直连路由。
- 运行RIP之后,路由器会发送Request报文,用来请求邻居路由器的RIP路由。
- 运行RIP的邻居路由器收到该Request报文后,会根据自己的路由表,生成Response报文进行回复。
- 路由器在收到Response报文后,会将相应的路由添加到自己的路由表中。
- RIP网络稳定以后,每个路由器会周期性地向邻居路由器通告自己的整张路由表中的路由信息,默认周期为30秒。
- 邻居路由器根据收到的路由信息刷新自己的路由表。
RIP-度量

RIP使用跳数作为度量值来衡量到达目的网络的距离。
在RIP中,路由器到与它直接相连网络的跳数为0,每经过一个路由器后跳数加1。为限制收敛时间,RIP规定跳数的取值范围为0~15之间的整数,大于15的跳数被定义为无穷大,即目的网络或主机不可达。
路由器从某一邻居路由器收到路由更新报文时,将根据以下原则更新本路由器的RIP 路由表:
- 对于本路由表中已有的路由项,当该路由项的下一跳是该邻居路由器时,不论度量值将增大或是减少,都更新该路由项(度量值相同时只将其老化定时器清零。路由表中的每一路由项都对应了一个老化定时器,当路由项在 180 秒内没有任何更新时,定时器超时,该路由项的度量值变为不可达)。
- 当该路由项的下一跳不是该邻居路由器时,如果度量值将减少,则更新该路由项。
- 对于本路由表中不存在的路由项,如果度量值小于16,则在路由表中增加该路由项。
某路由项的度量值变为不可达后,该路由会在 Response 报文中发布四次(120 秒),然后从路由表中清除。
在本示例中,路由器RTA通过两个接口学习路由信息,每条路由信息都有相应的度量值,到达目的网络的最佳路由就是通过这些度量值计算出来的。
RIP的路由跳数是在路由器发出路由通告之前增加的。
RIPv1和RIPv2

RIP包括RIPv1和RIPv2两个版本。
RIPv1为有类别路由协议,不支持VLSM和CIDR。 RIPv2为无类别路由协议,支持VLSM,支持路由聚合不CIDR。
RIPv1使用广播发送报文;RIPv2有两种发送方式:广播方式和组播方式,缺省是组播方式。
RIPv2的组播地址为224.0.0.9。组播发送报文的好处是在同一网络中那些没有运行RIP的网段可以避免接收RIP的广播报文;另外,组播发送报文还可以使运行RIPv1的网段避免错误地接收和处理RIPv2中带有子网掩码的路由。
RIPv1不支持认证功能,RIPv2支持明文认证和MD5密文认证。
RIPv1报文格式

RIP协议通过UDP交换路由信息,端口号为520。RIPv1以广播形式发送路由信息,目的IP地址为广播地址255.255.255.255。报文格式中每个字段的值和作用:
- Command:表示该报文是一个请求报文还是响应报文,只能取1与者2。1表示该报文是请求报文,2表示该报文是响应报文。
- Version:表示RIP的版本信息。对于RIPv1,该字段的值为1。
- Address Family Identifier(AFI):表示地址标识信息,对于IP协议,其值为2。
- IP address:表示该路由条目的目的IP地址。这一项可以是网络地址、主机地址。
- Metric:标识该路由条目的度量值,取值范围1-16。
一个RIP路由更新消息中最多可包含25条路由表项,每个路由表项都携带了目的网络的地址和度量值。整个RIP报文大小限制为不超过504字节。如果整个路由表的更新消息超过该大小,需要发送多个RIPv1报文。
RIPv2报文格式

RIPv2在RIPv1基础上进行了扩展,但RIPv2的报文格式仍然同RIPv1类似。
其中不同的字段如下所 示:
- AFI:地址族标识除了表示支持的协议类型外,还可以用来描述认证信息。
- Route tag:用于标记外部路由。
- Subnet Mask:指定IP地址的子网掩码,定义IP地址的网络或子网部分。
- Next Hop:指定通往目的地址的下一跳IP地址。
RFC1723对RIPv1和RIPv2的兼容性问题进行了分析和讨论,这里不再进行描述。
RIPv2-认证

RIPv2的认证功能是一种过滤恶意路由信息的方法,该方法根据key值来检查从有效对端设备接收到的报文。这个key值是每个接口上都可以配置的一个显示密码串,相应的认证类型(Authentication Type)的值为2。
早期的RIPv2只支持简单明文认证,安全性低,因为明文认证密码串可以很轻易地截获。随着对RIP安全性的需求越来越高,RIPv2引入了加密认证功能,开始是通过支持MD5认证(RFC 2082)来实现,后来通过支持HMAC-SHA-1认证(RFC 2082)进一步增强了安全性。
RIP-环路

本示例介绍了RIP网络上路由环路的形成。
如图所示,RIP网络正常运行时,RTA会通过RTB学习到10.0.0.0/8网络的路由,度量值为1。一旦路由器RTB的直连网络10.0.0.0/8产生故障,RTB会立即检测到该故障,并认为该路由不可达。
此时,RTA还没有收到该路由不可达的信息,于是会继续向RTB发送度量值为2的通往10.0.0.0/8的路由信息。RTB会学习此路由信息,认为可以通过RTA到达10.0.0.0/8网络。
此后,RTB发送的更新路由表,又会导致RTA路由表的更新,RTA会新增一条度量值为3的10.0.0.0/8网络路由表项,从而形成路由环路。这个过程会持续下去,直到度量值为16。
环路避免-水平分割

RIP路由协议引入了很多机制来解决环路问题,除了之前介绍的最大跳数,还有水平分割机制。
水平分割的原理是,路由器从某个接口学习到的路由,不会再从该接口发出去。也就是说,RTA从RTB学习到的10.0.0.0/8网络的路由不会再从RTA的接收接口重新通告给RTB,由此避免了路由环路的产生。
环路避免-毒性反转

RIP的防环机制中还包括毒性反转,毒性反转机制的实现可以使错误路由立即超时。
配置了毒性反转之后,RIP从某个接口学习到路由之后,发回给邻居路由器时会将该路由的跳数设置为16。利用这种方式,可以清除对方路由表中的无用路由。
本示例中,RTB向RTA通告了度量值为1的10.0.0.0/8路由,RTA在通告给RTB时将该路由度量值设为16。如果10.0.0.0/8网络发生故障,RTB便不会认为可以通过RTA到达10.0.0.0/8网络,因此就可以避免路由环路的产生。
环路避免-触发更新

缺省情况下,一台RIP路由器每30秒会发送一次路由表更新给邻居路由器。当本地路由信息发生变化时,触发更新功能允许路由器立即发送触发更新报文给邻居路由器,来通知路由信息更新,而不需要等待更新定时器超时,从而加速了网络收敛。
RIP基本配置

rip process-id
version id
network network-address
rip
version 2
network 10.0.0.0
rip [process-id]命令用来使能RIP进程。
- process-id指定了RIP进程ID。如果未指定process-id,命令将使用1作为缺省进程ID。
- version 2可用于使能RIPv2以支持扩展能力,比如支持VLSM、认证等。
- network 命令可用于在RIP中通告网络,network
<network adress>必须是一个自然网段的地址。只有处于此网络中的接口,才能进行RIP报文的接收和发送。
RIP配置-Metricin

interace GigabitEthernet 0/0/0
rip metricin 2
在RIP网络中,命令rip metricin 用于修改接口上应用的度量值(注意:该命令所指定的度量值会与当前路由的度量值相加)。
当路由器的一个接口收到路由时,路由器会首先将接口的附加度量值增加到该路由上,然后将路由加入路由表中。
本示例中,RTA发送的10.0.0.0/8路由条目的度量值为1,由于在RTC的GigabitEthernet0/0/0接口上配置了rip metricin 2,所以当路由到达RTC的接口时,RTC会将该路由条目的度量值加2,最后该路由的度量值为3。
RIP配置-Metricout

rip metricout 2
命令rip metricout用于路由器在通告RIP路由时修改路由的度量值。一般情况下,在将路由表项转发到下一跳之前,RIP会将度量值加1。如果配置了rip metricout命令,则只应用命令中配置的度量值。即,当路由器发布一条路由时,此命令配置的度量值会在发布该路由之前附加在这条路由上,但本地路由表中的 度量值不会发生改变。
在本示例中,缺省情况下,RTA发送的10.0.0.0/8路由条目的度量值为1。但是,由于在RTA的GigabitEthernet0/0/0接口上配置了rip metricout 2,所以RTA会将该路由条目的度量值设置为2,然后发送给RTC。
水平分割和毒性逆转

rip split-horizon
rip poison-reverse
水平分割和毒性反转都是基于每个接口来配置的。缺省情况下,每个接口都启用了rip split-horizon命令(NBMA网络除外)以防止路由环路。
配置验证

命令display rip interface verbose用来确认路由器接口的RIP配置。命令回显中会显示相关RIP参数,包括RIP版本 以及接口上是否应用了水平分割和毒性反转。
此例中显示RTC的GigabitEthernet0/0/0接口配置了RIPv2,metricin为2,还启用了水平分割和毒性反转的功能。
RIP配置-Output

rip output
命令rip output用于配置允许一个接口发送RIP更新消息。
如果想要禁止指定接口发送RIP更新消息,可以在接口上运行命令undo rip output。
企业网络中,可以通过运行命令undo rip output来防止连接外网的接口发布内部路由。
RIP配置-Input

- rip input:配置允许指定接口接收RIP报文。
- undo rip input:禁止指定接口接收RIP报文。运行命令undo rip input之后,该接口所收到的RIP报文会被立即丢弃。
- 缺省情况下,接口可以接收RIP报文。
抑制接口

silent-interface命令用来抑制接口,使其只接收RIP报文,更新自己的路由表,但不发送RIP报文。
命令silent-interface比命令rip input和rip output的优先级更高。
命令silent-interface all表示抑制所有接口,此命令优先级最高,在配置该命令之后,所有接口都被抑制。
命令silent-interface通常会配置在NBMA网络上。在NBMA网络上,一些路由器需要接收RIP更新消息但是不需要广播或者组播路由器自身的路由更新,而是通过命令peer 与对端路由器建立关系。
配置验证

命令display rip可以比较全面地显示路由器上的RIP信息,包括全局参数以及部分接口参数。例如,该命令可以显示哪些接口上执行了silentinterface命令。