简介
本文档介绍在不同进程之间重分配开放最短路径优先(OSPF)的指导原则。
背景信息
不同进程间的重分发非常困难,因此需要采取特殊措施才能使网络正常运行。本文档还重点介绍Cisco IOS®软件中引入的一些更改。
为什么要在两个OSPF进程之间重分布
在多个进程之间进行重分发的原因可能有几个。以下是一些示例:
-
从域的一部分过滤OSPF路由
-
分隔不同的OSPF域
-
在单独的域之间迁移
尽管在某些情况下,不同进程之间可能必须重新分发,但替代设计解决方案(如果可能)是更合适的选择,将在本部分的各个小节中讨论。
过滤OSPF路由
区域内路由
在OSPF中,路由器之间不直接交换区域中的IP前缀。它们是链路状态通告(LSA)的一部分,也通告网络的拓扑;因此,无法过滤区域内的路由。
注意:路由器上的本地过滤(为了防止某些路由安装在给定路由器中)不属于实际路由过滤。这通常通过路由器OSPF下的distribute-list 命令完成。
一种解决方案是使用不同的进程并在重分发路由器上过滤所需的路由;但是,这实际上将区域分为两个域。更好的设计是将区域分为不同的区域并使用Cisco IOS type 3过滤功能,这将在后面介绍。
区域间路由
在OSPF中,一个区域内的所有路由器都有完全相同的拓扑。一个区域不知道另一个区域的拓扑;因此,它依赖于所连接的区域边界路由器(ABR)所通告的信息。
ABR(作为第3类LSA)在区域内部通告的信息实际上是从远程区域获取的IP前缀,或为其他连接的区域计算得到的。
ABR发起以下路由:
-
到主干的非主干区域内路由
-
进入非主干区域的区域内部和区域间主干路由
因此,区域之间有一个距离矢量行为,可以用来过滤区域之间的路由。
Cisco IOS®软件实施了区域间过滤功能。有关此功能的详细信息,请参阅OSPF ABR类型3 LSA过滤。
外部路由过滤
由于外部路由被通告为第5类LSA并在域内泛洪,除末节区域和次末节区域(NSSA)外,目前没有办法过滤第5类LSA。一种解决方案是采用不同的流程,并在重新分配时在不同流程之间进行过滤。
保持不同OSPF域独立
通常的做法是使用不同的OSPF进程来分隔不同的IP路由域,或者出于管理目的或为了对路由域进行分段并在重分发点中控制路由信息。
然而,可以注意到,一个域的不稳定性可能会影响另一个域。例如,如果两个域之间驻留有自治系统边界路由器(ASBR)的OSPF网络(第1类和第2类)发生变化,则所有第5类LSA都会重新发起并在整个远程域中泛洪。因此,如果一个网络中存在持续的不稳定性,则可能导致另一个域中的第5类LSA持续注入和退出。
更好的设计选择是在不同的域之间使用边界网关协议(BGP)。在这种情况下,不同域之间的OSPF交换通过BGP进行;并且,由于BGP具有阻尼功能,一个域中的不稳定在另一个域中可能不太明显。
在不同的OSPF进程之间进行重分发
如前所述,可以有替代多个进程之间重分配的解决方案。本节介绍如何根据重分发点的数量仔细规划不同进程之间的重分发。
OSPF路由首选项规则
OSPF路由选择规则是区域内路由优先于区域间路由,后者优先于外部路由。但是,此规则可以应用于通过同一进程获知的路由。换句话说,来自一个进程的外部路由与其它进程的内部路由相比没有优先级。
给定OSPF进程与任何其他进程(无论是OSPF还是其他路由协议)之间的首选规则可以使用管理距离规则。但是,由于默认情况下不同OSPF进程具有相同的管理距离,因此可以明确为不同OSPF进程配置OSPF距离,从而实现预期行为。
注意:在Cisco Bug ID CSCdi7001(在Cisco IOS软件版本11.1及更高版本中修复)出现之前,进程之间的管理距离未正常工作,并且一个进程的内部路由优先于另一个进程的外部路由。
单个重分发点
当存在单个重分发点时,域之间的所有交换都在单个点上发生,且无法形成重分发循环。以下为配置示例:
图 1
路由器 A 配置 |
router ospf 1
redistribute ospf 2 subnet
router ospf 2
redistribute ospf 1 subnet |
两个重分发点
当存在两个重分配点时,情况会更加复杂。如果在网络的两个点上执行重分发而不进行任何特殊处理,则可能会出现意外结果。
考虑下一个拓扑,路由器A和路由器B在两个域之间相互重分配。此配置不起作用,将在本节的后面部分进行说明。
图 2
路由器A和路由器B的配置 |
router ospf 1
redistribute ospf 2 subnet
router ospf 2
redistribute ospf 1 subnet |
在域1中给定网络N,路由器A和路由器B将网络N学习为域1中的内部路由。因为它们将进程1重新分配到进程2,所以在域2中学习了作为外部路由的同一个网络N。
现在,在每台路由器中,通过一个进程获知的内部网络与另一个进程的外部网络相互竞争。如前所述,不同进程之间没有首选规则;因此,结果将是不确定的,因为两个进程具有相同的管理距离。
注意:这可能导致从一种流程到另一种流程的连续注入和撤消类型5。
在思科漏洞ID CSCdw10987(仅限于注册客户且集成到Cisco IOS®软件版本12.2(07.04)S、12.2(07.04)T及更高版本中)出现之前,采用最后一种最短路径优先算法(SPF)的过程将会获胜,而两个过程将会覆盖路由表中的其他路由。现在,如果路由通过一个进程安装,则它不会被同一管理域(AD)的另一个OSPF进程覆盖,除非最初在路由表中安装路由的进程首先从路由表中删除路由。
管理距离
当您在多个进程之间使用重分配时,可以使用管理距离来使一个进程优先于另一个进程,因为OSPF路由首选项仅应用于同一进程。但是,如本部分后面部分所述,这还不足以让网络正常运行。
图 3
路由器A和路由器B的配置 |
router ospf 1
redistribute ospf 2 subnet
distance ospf external 200
router ospf 2
redistribute ospf 1 subnet
distance ospf external 200
|
网络运行无网络故障
以域1中的网络N为例,其中N在域1中称为内部路由,并由路由器A和路由器B重新分配。由于增加了外部路由的管理距离,路由器A和路由器B选择OSPF进程1来到达网络N。
更一般地说,路由器A和路由器B都通过域1到达域1内部的所有网络,通过域2到达域2内部的所有网络。每个域中的其他路由器选择最近的ASBR(如果使用度量类型2)或经过某个ASBR的最短路径(如果使用度量类型1)。
如果两个域(来自其他重分发点)的外部存在前缀,则仍会发生相同的问题,因为这些外部路由在两个进程中的管理距离相同。如果您使外部进程的管理距离不同,则无法解决问题。示例如下:
图 4
路由器C (ASBR)将外部N通告到域1。此前缀由路由器A和路由器B重分发到域2中并到达每台路由器;因此,N是两个域中的外部。为了运行正常,两个进程的外部路由的管理距离需要不同,因此一个域优先于另一个域。假设域1的管理距离设置为低于域2。
现在,如果路由器D (ASBR)将外部M通告到域2,则路由器A和路由器B会将此前缀重分发到域1,并到达每台路由器。因此,M可以在两个域中都是外部的,并且,由于域1的管理距离较低,因此可以通过域1访问M。可能会发生以下一系列事件:
-
路由器A(路由器B)将M重分布到域1,外部M可以到达路由器B(路由器A)。
-
由于域1的管理距离低于域2,因此路由器A(路由器B)会通过域1安装M并设置为在域1中最大保留其先前发起的LSA(事件1)。
-
由于M在域2中设置为maxage,因此路由器A(路由器B)通过域2安装M,因此,将M重新分配到域2。
-
与事件1相同。
此循环持续进行,修复此循环的方法是通过域2可访问域2前缀。但是,如果将域2的管理距离设置得较低,则域1和前缀N将出现相同问题。
解决方案是根据前缀设置管理距离。有关详细信息,请参阅基于前缀的过滤和基于前缀的过滤和基于前缀的管理距离部分。
发生网络故障时的网络运行
您希望一个域备份另一个域,以防一个域无法访问。
例如,考虑路由器A失去通过域1到网络N的连接的情况。一旦路由器A失去通过域1的连接,它就会清除其先前生成的LSA,通告域2中的网络N,并安装通过域2经由从B接收的外部网络到网络N的路径。由于进程2在进程1中重新分配,因此路由器A还将外部网络N注入域1。
注意:当路由器A连接到网络N时,由于管理距离更远,它使用进程1,而保留进程2作为备份信息。一旦通过进程1的路径变得不可达,就会使用进程2进行连接。
图 5
现在,域2中的所有路由器都使用路由器B到达网络N;路由器A(或域1中通过域1与网络N失去连接的部分)使用域2连接到网络N。如果路由器B失去与网络N(而不是路由器A)的连接,此场景仍然有效。
如果路由器A和路由器B都失去与网络N的连接(例如,如果路由器C关闭),则会发生以下一系列事件:
-
在网络N不可达之前,路由器A和路由器B通过进程1获知网络N,并将其作为外部进程重新分发到进程2。
-
路由器A和路由器B几乎同时检测到网络N无法通过域1;因此,它们会刷新域2中以前的外部N。
-
在路由器A(路由器B)收到来自路由器B(路由器A)的已刷新LSA之前,它通过域2(更大的管理距离)安装外部N作为备用路由。
-
由于路由器A(路由器B)通过进程2安装了N,因此它会生成一个外部N到域1。
-
路由器A(路由器B)接收来自路由器B(路由器A)的已刷新LSA(事件1)。它通过进程2删除网络N,因此将外部N刷新到域1。网络N通过域2获知并重新分配到域1。
-
在路由器A(路由器B)收到来自路由器B(路由器A)的已刷新LSA之前,它会通过域1安装外部网络N,因为N已通过域2进行刷新。
-
由于路由器A(路由器B)通过进程1安装了网络N,因此它会生成一个外部N到域2。
您可以看到,有一个竞争条件可能从一个域到另一个域出现。在事件1、4和7中,路由器A将外部网络N生成到域2中;在事件2和5中,路由器A将撤销前缀。发生此问题的原因在于,通过一个域获知的路由被重分布回同一个域。
建议方案
本部分介绍如何防止属于某个域的路由重分布回同一个域,从而避免路由环路。
使用Distance 255命令
上一节显示如果从一个域获取的前缀被重分布回同一域时,如何创建路由环路。由于从路由表进行重分发,您可以阻止将属于域1并且通过域2从远程路由器获知的路由安装到路由表中。因此,路由器不会将这些路由重分布回域1。
为此,请输入distance 255 router_ID inverse_mask access-list命令。此命令告知路由器拒绝远程路由器收到的具有指定路由器ID且与路由表中的访问控制列表(ACL)匹配的所有前缀。
注意: distance 255命令给这些路由的距离为255,因此会阻止将它们安装到路由表中。
在映像6中,路由器A使用access-list 1命令匹配域1中的所有路由,并在进程1下使用distance 255命令以拒绝从路由器B收到的匹配属于域1的前缀的路由。
当您使用distance 255命令时,它将拒绝从路由器B收到的属于域1的任何路由。由于路由器B将域1中的所有路由重分布到域2,因此路由器A不会安装这些路由,因此也不会再次重分布到域1。
注意:ACL中排除域1中路由器B的已连接接口。
图 6
路由器 A 配置 |
路由器 B 配置 |
router ospf 1
redistribute ospf 2 subnet
distance 255 <Router B> 0.0.0.0 2
!
access-list 1
!--- Matches the router in Domain 2.
router ospf 2
redistribute ospf 1 subnet
distance 255 <Router B> 0.0.0.0 1
!
access-list 2
!--- Matches the route in Domain 1.
|
router ospf 1
redistribute ospf 2 subnet
distance 255 <Router A> 0.0.0.0 2
!
access-list 1
!--- Matches the router in Domain 2.
router ospf 2
redistribute ospf 1 subnet
distance 255 <Router A> 0.0.0.0 1
!
access-list 2
!--- Matches the route in Domain 1.
|
因为未安装通过其中一个进程从远程路由器获取的路由,所以不再需要之前的distance ospf external 200命令。
如果两台路由器均失去了网络连接(如无网络故障的网络操作和有网络故障的网络操作中所述),此配置将正常工作。但是,由于从路由表中拒绝前缀,因此域无法相互备份。
注意:您必须在ACL中明确列出每个域的所有前缀。维护此类ACL可能非常困难。
根据标记过滤路由
Cisco IOS软件中有一个新功能(来自思科漏洞ID CSCdt43016(注册客户)),允许您根据标记过滤路由。为防止路由从一个域重新分配到同一域,路由器可以在重分配时标记属于某个域的路由,并且可以根据同一标记在远程路由器上过滤这些路由。因为路由没有安装到路由表中,所以它们不会重分布回同一个域。
图 7
路由器A和路由器B的配置 |
router ospf 1
redistribute ospf 2 subnet tag 1
distribute-list 1 route-map filter_domain2 in
!
route-map filter_domain2 deny 10
match tag 2
route-map filter_domain2 permit 20
router ospf 2
redistribute ospf 1 subnet tag 2
distribute-list 1 route-map filter_domain1 in
!
route-map filter_domain1 deny 10
match tag 1
route-map filter_domain1 permit 20 |
当您从域1重新分发时,路由会使用标记1进行标记,并根据同一标记在远程路由器上进行过滤。当您从域2进行重分发时,路由会使用标记2进行标记,并在远程路由器上根据同一标记进行过滤。
注意:上一步distance ospf external 200命令已不再需要,因为未安装通过其中一个进程从远程路由器获取的路由。
如果两台路由器均失去了网络连接(如无网络故障的网络操作和有网络故障的网络操作中所述),此配置将正常工作。但是,由于从路由表中拒绝前缀,因此域无法相互备份。
重新分配时使用Match Internal关键字
从域重新分发时,可以使用match internal关键字仅将属于一个域的内部路由重新分发到另一个域。这可以防止已经是外部的前缀重新分配到同一域中。
图 8
路由器A和路由器B的配置 |
router ospf 1
redistribute ospf 2 subnet match internal
distance ospf external 200
!
router ospf 2
redistribute ospf 1 subnet match internal
distance ospf external 200
! |
如果两台路由器均失去了网络连接(如无网络故障的网络操作和有网络故障的网络操作中所述),此配置将正常工作。一个域可以备份另一个域。
如果其中一个域中已存在外部前缀(例如通过其他协议重分发的外部前缀),则不会将这些前缀重分发到其他域,因为仅重分发内部前缀。此外,无法控制外部前缀,并且所有外部前缀都可以被阻止。
基于前缀的过滤
从域重新分发时,可以针对ACL匹配前缀,以避免属于一个域的前缀重新分配到同一域中。
图 9
路由器A和路由器B的配置 |
router ospf 1
redistribute ospf 2 subnet route-map filter_domain2
distance ospf external 200
!
route-map filter_domain2 permit 10
match ip address 1
!
access-list 1
!--- Matches the prefix in Domain 1.
router ospf 2
redistribute ospf 1 subnet route-map filter_domain1
distance ospf external 200
!
route-map filter_domain1 permit 20
match ip address 2
!
access-list 2
!--- Matches the prefix in Domain 2.
|
如果两台路由器均失去了网络连接(如无网络故障的网络操作和有网络故障的网络操作中所述),此配置将正常工作。一个域可以备份另一个域。
注意:您必须在ACL中明确列出每个域的所有前缀。维护此类ACL可能非常困难。另一种解决方案是在分发过程中标记前缀,然后过滤相应的标记。
图 10
路由器A和路由器B的配置 |
router ospf 1
redistribute ospf 2 subnet tag 1 route-map filter_domain2
distance ospf 2 external 200
!
route-map filter_domain2 deny 10
match tag 2
route-map filter_domain2 permit 20
router ospf 2
redistribute ospf 1 subnet tag 2 route-map filter_domain1
distance ospf 1 external 200
!
route-map filter_domain1 deny 10
match tag 1
route-map filter_domain1 permit 20 |
基于前缀的过滤和基于前缀的管理距离
如管理距离部分中所述,需要基于前缀的管理距离,在该距离中,每个域中的其他ASBR始发外部前缀。在下一个示例拓扑中,ASBR1和ASBR2将网络X和Y分别重分布到域1和域2。
本示例使用ACL来匹配属于某个域的所有前缀(内部和外部),并使用distance 命令来增加最初不属于相应域的前缀的管理距离。
图 11
路由器A和路由器B的配置 |
router ospf 1
redistribute ospf 2 subnet route-map filter_domain2
distance 200 0.0.0.0 255.255.255.255 2
!
route-map filter_domain2 permit 10
match ip address 2
!
access-list 1
!--- Matches the prefixes in Domain 1.
access-list 2
!--- Matches the prefixes in Domain 2.
router ospf 2
redistribute ospf 1 subnet route-map filter_domain1
distance 200 0.0.0.0 255.255.255.255 1
!
route-map filter_domain1 permit 10
match ip address 1
!
access-list 1
!--- Matches the prefixes in Domain 1.
access-list 2
!--- Matches the prefixes in Domain 2.
|
进程1下的distance 200 0.0.0.0 255.255.255.255 2命令将属于域2的所有前缀的管理距离设置为200;因此,路由器A和路由器B使用域1来到达属于域1的前缀。
注意:您必须在ACL中明确列出每个域的所有外部前缀。维护此类ACL可能非常困难。
摘要
当OSPF域之间存在多个重分发点时,很容易出现路由环路。为了防止路由环路,属于域的前缀不能重分布回同一个域。此外,还可以正确设置OSPF进程的管理距离。本文中提出了这五种方法:
前两种解决方案可防止属于某个域的路由添加到路由表中,从而防止它们重分布回同一个域。
注意:因为路由表中的前缀被拒绝,所以域无法相互备份。
如果需要,您可以使用最后三个解决方案备份另一个域的域。但是,您可以注意以下警告:
-
匹配内部解决方案不允许您控制前缀,并且阻止所有外部前缀进行重分发。换句话说,如果有来自其他ASBR的外部前缀,则这些LSA不会从一个域重新分发到另一个域。
-
在重分发过程中使用基于前缀的过滤解决方案允许一个域备份另一个域。但是,只有在没有来自其他ASBR的外部路由时,备份才能正常工作。
-
使用基于前缀的过滤和基于前缀的管理距离解决方案是唯一一个允许域在存在来自其他ASBR的外部路由时备份另一个域的解决方案。
本文档反复提及使用一个域备份另一个域。可以注意到,备份意味着,路由器A是否可能失去通过指定域(例如域1)与部分域的连接,然后它可以使用其他域(域2)正确路由到无法通过域1到达的目的地。
但是,如果域由于未将前缀重分布回原始域而被分区,则另一个域无法备份已分区的域,除非将前缀重分布回原始域。但是,如管理距离和出现网络故障时的网络操作部分所述,这可能会导致其他问题。
相关信息