0%

TCP/IP 路由技术 11:路由重新分配

当路由器使用路由选择协议通告从其他方式学习到的路由时,路由器将执行重新分配。这里所谓的其他方式可能是另外一个路由选择协议、静态路由或者直连目标网络。例如,路由器可能同时运行 OSPF 进程和 RIP 进程,如果设置 OSPF 进程通告来自 RIP 进程的路由,这就叫做重新分配 RIP。

在整个 IP 网络中,如果从配置管理和故障管理的角度来看,通常更愿意运行一种路由选择协议,而不是多种路由选择协议。但是现代网络常常又迫使我们接受多协议 IP 路由选择这一事实。

在大部分案例中,将要被合并的网络在实现和发展上都不相同,它们满足不同的需求,是不同设计理念的产物。这种差异性使得向单一路由选择协议的迁移成为一项复杂的任务。多厂商环境是需要路由重新分配的另一个因素。例如一个运行 Cisco EIGRP 的网络可能会使另一个厂商路由器的网络合并,而这种路由器仅支持 RIP 和 OSPF。如果不进行重新分配,那么 Cisco 路由器需要使用一种公开的协议重新配置,或者用 Cisco 路由器替代非 Cisco 路由器。

当多种路由选择协议被拼凑在一起时,使用重新分配是很有必要的,而且重新分配也是一个严谨网络设计的一部分。重新分配可以使得 OSPF 的动态特性和静态路由的精确控制特性融合在一起。

如果不是非要使用动态路由选择协议的话,在拨号环境中向动态路由选择协议重新分配静态路由也是非常有用的。动态协议周期性的管理流量会导致拨号线路始终保持接通状态,通过阻止路由更新和 Hello 信息通过线路,并在两边配置静态路由,管理员可以确保线路只有在有用户流量通过时才接通。向动态路由选择协议重新分配静态路由,可以使拨号线路两边的所有路由器都知道链路对方的网络。

除了少数例外(在 IP 中,自治系统号相同的的 IGRP 和 EIGRP 进程可以自动重新分配),在相同路由器上存在不止一种路由协议并不意味着重新分配自动发生,重新分配必须明确地配置。在没有使用重新分配的单一路由器上配置多种路由选择协议的方法叫做 SIN(Ships In the Night,SIN)路由选择。路由器将会在每个进程域内向它的对等路由器传递路由,但是进程域之间却一无所知。虽然 SIN 路由选择法通常指在相同路由器上多种路由选择协议为多种可路由协议进行路由选择,但是它也可以指在单一路由器上两个 IP 协议为单独的 IP 域进行路由选择。

重新分配的原则

IP 路由选择协议的能力相差非常大,对重新分配影响最大的协议特性是度量和管理距离的差异性,以及每种协议的有类别和无类别能力。在重新分配时如果忽略了对这些差异性的考虑将导致严重后果,最好的情况会出现某些或全部路由交换失败,最坏情况将造成路由环路和黑洞。

度量

当路由器向 OSPF 重新分配静态路由时,虽然静态路由没有相关联的度量,但每条 OSPF 路由必须有一个代价值。有关度量冲突的另一个例子是向 EIGRP 重新分配 RIP 路由,RIP 的度量是跳数,而 EIGRP 使用带宽和时延。在这两种情况中,接收被重新分配路由的协议必须能够将自己的度量与这些路由关联起来。

因此,执行重新分配的路由器必须为被重新分配的路由指派度量。

管理距离

度量的差异性产生了另一个问题:如果路由器正在运行多个路由选择协议,并从每个协议都学习到一条到达相同目标网络的路由。那么应该选择哪一条路由呢?每一个路由选择协议均使用自己的度量方案定义最优路径,度量方案不一致,也就无法比较对应的路由。

这个问题的答案是管理距离。正像为路由分配度量以便可以确定首选路由一样,可以向路由源分配管理距离值以便确定首选路由源。管理距离被看作是一个可信度测度,管理距离越小,协议的可行度越高。

如下列出了缺省的 Cisco 管理距离:

路由源 管理距离
直连接口 0
静态路由 1
EGGRP 汇总路由 5
外部 BGP 20
EIGRP 90
IGRP 100
OSPF 110
IS-IS 115
RIP 120
EGP 140
外部 EIGRP 170
内部 BGP 200
未知 255

虽然管理距离帮助解决了不同度量带来的混乱,但是它又为重新分配带来了问题。管理距离会导致非最佳路径、不可预知的行为以及慢收敛等问题。在重新分配时有几种工具和策略可以避免路由选择环路,比如使用操作管理距离、路由过滤和路由映射。

从无类别协议向有类别协议重新分配

从无类别路由选择进程域向有类别域重新分配路由会产生哪些影响,值得仔细考虑。首先需要理解有类别路由选择协议怎样应对可变长子网划分。有类别路由选择协议不能通告携带子网掩码的路由,对于有类别路由器所接收到的每一条路由,无外乎是下面两种情况之一:

  • 路由器有一个或多个接口连接到主网上
  • 路由器没有接口连接到主网上

第一种情况下,为了正确地确定数据包目标地址的子网,路由器必须使用它自己的主网掩码。在第二种情况下,公告信息中仅包含主网地址,因为路由器不知道使用哪一个子网掩码。当从无类别路由选择协议向有类别路由选择协议重新分配路由时,仅在掩码相同的接口之间通告路由这一特性将会被应用。

配置重新分配

配置重新分配分为两步:

  • 在路由选择协议中配置接收重新分配的路由,其中使用命令 redistribute 指定路由源点
  • 为重新分配的路由指定度量值

在如下网络中:

通过如下命令,可以将 OSPF 的路由重新分配到 EIGRP 进程:该配置将 OSPF 进程 1 发现的路由向 EIGRP 进程 1 重新分配,命令 metric 部分为路由分配了 EIGRP 度量值,分别代表:带宽、时延、可靠性、负载、MTU。

1
2
3
router eigrp 1
redistribute ospf 1 metric 10000 100 255 1 15003 passive-interface Ethernet1
network 172.20.0.0

如下配置将 EIGRP 进程 1 发现的路由重新分配到 OSPF 进程 1,命令 metric 部分为每一条被重新分配的路由分配了 OSPF 代价。重新分配使得 Lajoie 成为 OSPF 域的 ASBR,并且被重新分配的路由是作为外部路由进行通告的。命令 metric-type 部分指明了外部路由的类型为 E1。关键字 subnets 仅当向 OSPF 重新分配路由时使用,它指明子网的细节将被重新分配,没有它,仅重新分配主网地址。

1
2
3
router ospf 1
redistribute eigrp 1 metric 30 metric-type 1
subnets network 172.20.11.2 0.0.0.0 area 0

另一种分配度量的方法是使用 default-metric 命令。当重新分配来自多个源点的路由时,命令 default-metric 命令十分有用。

这两种分配度量的方法可以相互使用,使用命令 redistribute 中关键字 metric 分配的度量值优于 default-metric 命令分配的度量值。如果关键字 metric 和 default-metric 都没有指定度量,那么被重新分配到 OSPF 的路由的度量的缺省值为 20,而其他协议路由的度量的缺省值为 0。对于 IS-IS 协议,0 度量是合法的,但是对于 RIP 协议,跳数度量必须在 1-16 之间,而对于 EIGRP 协议,0 度量也与其多度量格式不兼容。因此 对于 RIP 和 EIGRP 协议,都必须为重新分配的路由分配合适的度量,否则重新分配将不能进行。

案例研究:重新分配 IGRP 和 RIP

如下网络中,Ford 运行 IGRP,Berra 运行 RIP,Mantel 同时运行 IGRP 和 RIP,并在两个协议之间重新分配路由,并在两个协议之间重新分配路由。

Manel 的配置如下

1
2
3
4
5
6
7
8
router rip
redistribute igrp 1 metric 5
passive-interface Ethernet1 network 10.0.0.0
!
router igrp 1
redistribute rip
default-metric 1000 100 255 1 1500
passive-interface Ethernet0 network 10.0.0.0

这里,Mantel 还被连接到一个末梢网络,如果要求向 IGRP 域通告末梢网络,而不向 RIP 域通告,一种实现方法是仅在 IGRP 中添加适当的网络语句,但是这样做会在末梢网络中造成不必要的 IGRP 广播 ,另一个实现方法是使用重新分配,命令 redistribute connected 将会重新分配所有直连网络。

案例研究:重新分配 EIGRP 和 OSPF

如下所示的网络中,有一个 OSPF 域和两个 EIGRP 域,路由器运行 OSPF 进程 1,Podres 运行 EIGRP 进程 1,Snider 和 Campanella 运行 EIGRP 进程 2:

Robinson 的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
router eigrp 1
redistribute ospf 1 metric 1000 100 1 255 1500
redistribute eigrp 2 passive-interface FastEthernet0/0
network 192.168.3.0
!
router eigrp 2
redistribute ospf 1 metric 1000 100 1 255 1500
redistribute eigrp 1 network 192.168.4.0
network 172.16.0.0
!
router ospf 1
redistribute eigrp 1
redistribute eigrp 2 metric 100 default-metric 50
network 192.168.3.33 0.0.0.0 area 0

注意,尽管在 EIGRP 进程之间必须配置重新分配,但是不需要配置度量,因为这些进程使用相同的度量,所以能够穿过重新分配边界准确地跟踪度量。

需要注意,被重新分配到 OSPF 域的路由类型可以是类型 1(E1)或类型 2(E2)外部路由。缺省情况下,外部路由作为类型 2 路由被重新分配到 OSPF 中,E2 路由仅包括路由的外部代价。当存在不止一条外部路由可以到达单一目标网络时,就需要注意这个问题。如果路由作为 E2 通告,那么在 OSPF 域内的链路代价将不会被计入。如果路由被作为 E1 重新分配,那么在 OSPF 域内的链路代价将被计入重新分配代价。为了将路由作为 E1 重新分配到 OSPF 中,可以在重新分配命令中添加关键字 metric-type 1。

如果没有关键字 subnets,那么被重新分配到的地址仅包括那些在非 OSPF 域内的主网地址。

案例研究:重新分配和路由汇总

Cisco 对 EIGRP、OSPFv2、OSPFv3 和 IS-IS 的实现都可以汇总被重新分配的路由。第一个要注意的事情是汇总想要起作用,先决条件是 IP 子网地址已经为汇总进行过规划。

命令 summary-address 为 OSPF 进程指定了一个汇总地址和掩码。任何在指定汇总地址范围内更精确的地址都会被禁止。该命令仅用作 ASBR 汇总外部路由,在 ABR 内部 OSPF 路由的汇总可以通过命令 area arange 实现。汇总地址范围以内的子网地址在重新分配点被禁止。

对 EIGRP 的汇总是指定接口的,也就是不在路由进程下指明汇总地址和掩码,而是在独立的接口下指明的,这个系统提供了更大的灵活性,可以在同一进程的不同接口通告不同的汇总地址。命令 ip summary-address eigrp process-id 指定了汇总地址、掩码和汇总地址所要通告的 EIGRP 进程。EIGRP 的汇总禁止通告汇总范围以内的子网,但是与 OSPF 不一样的是,向 EIGRP 通告的汇总路由没有被标记为外部路由。

空接口是一个不知道去往哪里的软件接口,路由到它的数据包将会丢弃,除了某些特例外(例如 OSPF 内部区域汇总并自动生成空接口的汇总路由,它必须被静态配置),每当路由器产生一条汇总路由,路由器同时还会生成一条指向空接口的路由。指向空接口的汇总路由对防止环路非常有用,但是重新分配不正确的路由选择信息是根本允许发生的。在互相进行重新分配时,即当两个路由选协议互相向对方重新分配它们各自的路由时,需要仔细地控制路由通告。在这种情况下,使用路由过滤或路由映射是绝对必要的。

路由汇总也是有代价的,虽然路由表的大小减少,节约了内存和处理器的循环周期,但是路由的精度却降低了,随着网络更加复杂,细节的损失将会增加路由错误的可能性。

案例研究:重新分配 OSPFv3 和 RIPng

如下是一个运行 IPv6 的网络,路由器 Griffey 是 3 个分离网络的连接点。两个网络运行 OSPFv3,另一个运行 RIPng:

Griffey 在路由选择进程之间重新分配路由,其配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface Ethernet 0/0
ipv6 address 2001:db8:0:21::1/64
ipv6 rip Mariners enable
!
interface Serial 0/0.1 point-to-point
ipv6 address 2001:db8:0:31::1/64
ipv6 ospf 1 area 1
!
interface Serial 0/0.4 point-to-point
ipv6 address 2001:db8:0:30::1/64
ipv6 ospf 2 area 20
!
ipv6 router ospf 1
redistribute rip Mariners metric-type 1 tag 4
!
ipv6 router ospf 2
redistribute rip Mariners
!
ipv6 router rip Mariners
redistribute ospf 1 metric 5
redistribute ospf 2 metric 10
  • Griffey 把来自 RIPng 进程 Mariners 的路由重新分配到进程 ID 为 1 的 OSPFv3 进程,路由的度量类型为外部类型 1,而且这些路由被添加了标记,值为 4,在后面这些标记将被 RIPng 进程用来标识被通告的路由
  • Griffey 向 OSPFv3 进程(进程 ID 为 2)通告 RIPng 路由,路由度量类型为缺省类型(外部类型 2),且没有标记值
  • Griffey 向 RIPng 重新分配从两个 OSPFv3 进程获知的路由,在被通告的路由中,来自 OSPF1 的路由度量值为 5,来自 OSPF2 的路由度量值为 10

对 IPv6 来说,关键字 subnets 不能和 OSPFv3 一起使用,所有 IPv6 的路由选择协议都包括 IPv6 前缀,这些前缀通常包括地址和前缀长度。除非执行过滤机制限制前缀被通告,否则协议之间的路由重新分配会包括所有前缀。

当 RIPng 重新分配来自其他协议的路由时,RIPng 没有办法对这些通告来的路由进行汇总,但是可以在接口上配置汇总从该接口通告出去的 RIPng 前缀。当 RIPng 前缀进入路由进程时,OSPFv3 可以对它们进行汇总。

需要注意,Griffey 会把汇总路由 2001:db8:0:20::61 通告给 Suzuki,这是为通告到 OSPFv3 的前缀建立的汇总路由,OSPF 又把这个汇总路由通告给 RIPng。RIPng 域内的路由器仍然能够正确地路由更加精确的前缀。但是让汇总重新被通告回 RIPng 域的不利之处表现为:如果数据包的目标地址在汇总范围内,但是这个目标实际在网络中并不存在,那么数据包在被丢弃之前会被转发给 Griffey。可以在路由重新分配期间对路由进行过滤,一般通告到 RIPng 的前缀仅仅是那些已经存在于 OSPFv3 域内的前缀。

案例研究:重新分配 IS-IS 和 RIP/RIPng

如下网路中,Aaron 运行 IS-IS,Williams 为 IPv4 运行 RIPv1,为 IPv6 运行 RIPng,Mays 正在重新分配路由。

路由可能作为内部或外部路由(缺省是内部路由)、第 1 层或第 2 层(缺省时第 1 层)路由向 IS-IS 重新分配,度量类型决定被重新分配路由的度量值基数。内部度量类型的度量值小于 64,外部类型的度量值在 64 - 128 之间。如果度量类型是内部类型,那么被重新分配路由的初始度量值将是度量值指定的数字,如果没有指定度量值,那么则为 0。因为 RIP 对于 IS-IS 路由域来说是外部路由,把它们作为外部路由重新分配到路由域可以最好地反映这一点。

可以使用命令 summary-address 用于把 IPv4 路由汇总到 IS-IS,OSPF 也使用这个命令,而且还可以指定把汇总路由发送到哪一层。如果没有指定,那么地址将汇总到第 2 层。同 OSPFv3 一样,对于 IPv6 地址族,将使用 summary-prefix 汇总 IPv6 路由到 IS-IS。

当 IS-IS 被重新分配到其他协议时,需要指定哪些层次的 IS-IS 路由要被重新分配。

案例研究:重新分配静态路由

在上述网络中,Williams 的路由表中缺少了子网 10.1.2.160/28 和 10.1.2.224/28,这些子网的掩码与配置在 Mays 接口上 E1 的 24 位掩码不一致,所以从该接口发送的 RIP 更新消息中没有包含这些路由。这也再次说明了从无类别协议向有类别协议重新分配变长子网路由所存在的问题。

解决这个问题的一种方案是使用 24 位地址 10.1.2.0/24 汇总两个 28 位子网,因为 RIP 没有这个汇总命令,所以实现汇总的方法是配置一条指向汇总地址的静态路由,接着向 RIP 重新分配该路由。

之前讲过,静态路由的一种变化形式是使用出站端口替代路由条目中的下一跳地址,这种静态也可以被重新分配,是因为当静态路由指向出站接口时,目标网络被认为是直接连接到路由器的,而 10.0.0.0 的语句出现在 RIP 配置中,因此 RIP 将通告 10.0.0.0 的的直连子网。

当使用汇总命令时,它们会在路由表中创建一个指向空接口的路由条目,对于静态汇总路由,也应该做同样的工作,即空接口应该和静态汇总路由联合使用。现在,在路由器 Mays 上任何不能发现最精确匹配的目的地址都会被路由到空接口后丢弃,同时目标不可达的 ICMP 信息将会被发送给源点。

总结

这里讨论了在重新分配路由时会出现的几个问题。为了避免或纠正故障,除了最简单的重新分配方案之外,几乎在所有的方案中都需要包括对路由过滤和路由映射的使用。