简介
本文档介绍在不同进程之间重分布开放最短路径优先(OSPF)的准则。
背景信息
不同进程之间的再分配非常困难,需要采取特殊措施才能使网络正常运行。本文档还重点介绍了Cisco IOS®软件中引入的一些更改。
为什么要在两个OSPF进程之间重分布
在多个进程之间进行重分发可能有几个原因。以下是几个示例:
-
从域的一部分过滤OSPF路由
-
分隔不同的OSPF域
-
在单独的域之间迁移
虽然在某些情况下可能需要在不同进程之间进行重新分配,但替代设计解决方案(如果可能)更适合,将在本节的各小节讨论。
过滤OSPF路由
区域内路由
在OSPF中,某个区域中的IP前缀不会在路由器之间直接交换。它们是链路状态通告(LSA)的一部分,该通告还通告网络拓扑;因此,无法过滤区域内的路由。
注意:路由器上的本地过滤(为了防止某些路由安装在给定路由器中而可以进行)不被视为实际路由过滤。这通常在路由器OSPF下使用distribute-list命令完成。
一种解决方案是使用不同的进程并在重分发路由器上过滤所需的路由;但是,这实际上将区域分为两个域。更好的设计是将区域分为不同的区域并使用Cisco IOS type 3过滤功能,这将在后面介绍。
区域间路由
在OSPF中,区域中的所有路由器都有完全相同的拓扑。一个区域不知道另一个区域的拓扑;因此,它依赖于所连接的区域边界路由器(ABR)所通告的信息。
ABR(作为第3类LSA)在区域内部通告的信息实际上是从远程区域获取的IP前缀,或为其他连接区域计算的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,因此同一网络N在域2中获知为外部路由。
现在,在每台路由器中,通过一个进程获知的内部网络与另一个进程的外部网络相互竞争。如前所述,不同进程之间没有首选规则;因此,结果将是不确定的,因为两个进程具有相同的管理距离。
注:这可能会导致第5类进程不断从其中一个进程注入和退出另一个进程。
在Cisco Bug 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。
更一般地说,通过域1到达域1内部的所有网络,通过路由器A和路由器B通过域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中设置为最大值,因此路由器A(路由器B)通过域2安装M,并将M重新分发到域2。
-
与事件1相同。
此循环持续进行,修复此循环的方法是通过域2可访问域2前缀。但是,如果将域2的管理距离设置为较低,则域1和前缀N会出现相同的问题。
解决方案是根据前缀设置管理距离。有关详细信息,请参阅基于前缀的过滤和基于前缀的过滤以及基于前缀的管理距离部分。
网络出现故障时的网络运行
您希望一个域备份另一个域,以防一个域无法访问。
例如,考虑路由器A通过域1与网络N失去连接的情况。一旦路由器A失去通过域1的连接,它就会刷新先前生成的通告域2中的网络N的LSA,并通过从B接收的外部网络安装通过域2到网络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命令时,它会拒绝从属于域1的路由器B接收的任何路由。由于路由器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软件中有一个新功能(来自Cisco Bug 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 0.0.0.0 255.255.255.255 2命令将属于域2的所有前缀的管理距离设置为200;因此,路由器A和B使用域1来访问属于域1的前缀。
注意:必须明确列出ACL中每个域的所有外部前缀。维护此类ACL可能非常困难。
摘要
当OSPF域之间存在多个重分发点时,很容易出现路由环路。为防止路由环路,不能将属于某个域的前缀重新分发回同一域。此外,可以正确设置OSPF进程的管理距离。本文中提出了以下五种方法:
前两种解决方案可防止将属于某个域的路由添加到路由表中,从而防止这些路由重新分发回同一个域。
注意:因为从路由表中拒绝前缀,所以域无法相互备份。
如果需要,您可以使用最后三种解决方案备份一个域和另一个域。但是,您可以注意以下警告:
-
match internal solution不允许您控制前缀,并且会阻止所有外部前缀进行重分发。换句话说,如果有来自其他ASBR的外部前缀,则这些LSA不会从一个域重新分发到另一个域。
-
在重分发过程中使用基于前缀的过滤解决方案允许一个域备份另一个域。但是,仅当没有来自其他ASBR的外部路由时,备份才能正常工作。
-
使用基于前缀的过滤和基于前缀的管理距离解决方案是唯一一个允许域在存在来自其他ASBR的外部路由时备份另一个域的解决方案。
本文档重复提及使用一个域备份另一个域。可以注意到,备份意味着,路由器A可能失去通过给定域(例如域1)与部分域的连接,然后它可能使用其他域(域2)正确路由到无法通过域1到达的目的地。
但是,如果由于未将前缀重新分发回原始域而划分了域,则除非将前缀重新分发回原始域,否则其他域无法备份已分区的域。但是,正如管理距离和网络故障下的网络操作部分中所述,这可能会引发其他问题。
相关信息