此产品的文档集力求使用非歧视性语言。在本文档集中,非歧视性语言是指不隐含针对年龄、残障、性别、种族身份、族群身份、性取向、社会经济地位和交叉性的歧视的语言。由于产品软件的用户界面中使用的硬编码语言、基于 RFP 文档使用的语言或引用的第三方产品使用的语言,文档中可能无法确保完全使用非歧视性语言。 深入了解思科如何使用包容性语言。
思科采用人工翻译与机器翻译相结合的方式将此文档翻译成不同语言,希望全球的用户都能通过各自的语言得到支持性的内容。 请注意:即使是最好的机器翻译,其准确度也不及专业翻译人员的水平。 Cisco Systems, Inc. 对于翻译的准确性不承担任何责任,并建议您总是参考英文原始文档(已提供链接)。
本文档提供了在不同进程之间重分发开放最短路径优先(OSPF)的指南。不同进程之间的重分发非常困难,为了正确运行网络,必须采取特殊措施。本文档还重点介绍Cisco IOS®软件中引入的一些更改。
在多个进程之间重分发可能有多种原因。以下是几个示例:
从域的一部分过滤OSPF路由
分隔不同的OSPF域
在不同域之间迁移
虽然在某些情况下可能需要在不同流程之间进行重分发,但备选设计解决方案(如果可能)是更合适的选择,本节的子部分将讨论这一点。
在OSPF中,区域内的IP前缀不会直接在路由器之间交换。它们是链路状态通告(LSA)的一部分,该通告也通告网络拓扑;因此,无法过滤区域内的路由。
注意:路由器上的本地过滤(可以执行此过滤以防止某些路由安装在给定路由器中)不被视为实际路由过滤。这通常通过路由器OSPF下的distribute-list命令来完成。
一种解决方案是使用不同的流程并过滤重分发路由器上所需的路由;但是,这实际上将区域分为两个域。更好的设计是将区域划分到不同区域,并使用Cisco IOS第3类过滤功能,如后文所述。
在OSPF中,区域内的所有路由器具有相同的拓扑。某个区域不知道另一区域的拓扑;因此,它依赖于所连接的区域边界路由器(ABR)通告的信息。
ABR(作为第3类LSA)通告的区域内的信息实际上是从远程区域获知的或为其他连接区域计算的IP前缀。
ABR会发出以下路由:
非主干区域内路由到主干
主干区域内和区域间路由到非主干区域
因此,区域之间有一种距离矢量行为,可用于过滤区域之间的路由。
Cisco IOS软件实施了区域间过滤功能。有关此功能的详细信息,请参阅OSPF ABR第3类LSA过滤。
由于外部路由通告为第5类LSA,并在整个域内泛洪,除末节区域和非末节区域(NSSA)外,目前无法过滤第5类LSA。一种解决方案是使用不同的流程,并在重新分发时在流程之间进行过滤。
通常的做法是使用不同的OSPF进程来分隔不同的IP路由域,无论是出于管理目的还是为了对路由域进行分段,还是在重分发点中控制路由信息。
但是,应该注意,一个域中的不稳定可能影响另一个域。例如,如果OSPF网络(第1类和第2类)中自治系统边界路由器(ASBR)驻留在两个域之间,则所有第5类LSA都将重新发起并泛洪到整个远程域。因此,如果一个网络中存在持续的不稳定性,这可能导致另一个域中第5类LSA的持续注入和退出。
更好的设计选择是在不同域之间使用边界网关协议(BGP)。在这种情况下,不同域之间的OSPF交换通过BGP;而且,由于BGP具有阻尼功能,因此一个域中的不稳定性在另一个域中将不明显。
如前所述,可以提供替代在多个进程之间重分发的解决方案。本节显示如何根据重分发点的数量仔细规划不同进程之间的重分发。
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从一个进程持续注入和退出另一个进程。
在Cisco Bug ID CSCdw10987(仅限注册客户)(集成在Cisco IOS软件版本12.2(07.04)S、12.2(07.04)T和更高版本中)之前,最后一个过程是创建最短路径优先算法(SPF)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到达,而域2内部的所有网络将通过域2通过路由器A和路由器B到达。每个域中的其他路由器会选择最近的ASBR(如果使用度量类型2)或通过其中一个ASBR的最短路径(如果使用度量类型1)。
如果两个域外有前缀(来自某些其他重分发点),则仍然会出现相同的问题,因为这两个进程中这些外部路由的管理距离相同。如果使外部进程的管理距离不同,则无法解决问题。示例如下:
图 4
路由器C(ASBR)将外部N通告到域1。此前缀由路由器A和路由器B重新分发到域2,并将到达每台路由器;因此,N在两个域中都是外部的。为了正确运行,外部路由的管理距离对于两个进程而言需要不同,因此一个域优先于另一个域。假设域1的管理距离设置为低于域2。
现在,如果路由器D(ASBR)将外部M通告到域2,则此前缀由路由器A和路由器B重新分发到域1,并将到达每台路由器。因此,M在两个域中都是外部的,而且,由于域1的管理距离较短,因此M可以通过域1到达。可能会发生以下事件序列:
路由器A(路由器B)将M重分发到域1,外部M将到达路由器B(路由器A)。
由于域1的管理距离低于域2,因此路由器A(路由器B)将通过域1安装M,并将其设置为将其先前始发的LSA(事件1)最大化为域1。
由于M在域2中设置为maxage,因此路由器A(路由器B)将通过域2安装M,因此将M重分布到域2。
与事件1相同。
此循环继续,修复此循环的方法是使域2前缀可通过域2到达。但是,如果域2的管理距离设置得更低,则域1和前缀N将出现相同的问题。
解决方案是根据前缀设置管理距离。有关详细信息,请参阅基于前缀的过滤和基于前缀的过滤和基于前缀的管理距离部分。
您希望一个域备份另一个域,以防某个域无法访问。
例如,假设路由器A通过域1失去与网络N的连接。一旦路由器A失去通过域1的连接,它将刷新其先前生成的LSA,在域2中通告网络N,并通过从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之前,它会将外部N通过域2(管理距离较大)安装为备用路由。
由于路由器A(路由器B)通过进程2安装了N,因此它将在域1中生成外部N。
路由器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,因此它将在域2中生成外部N。
您可以看到存在一个竞争条件,该条件可能从一个域显示到另一个域。在事件1、4和7中,路由器A在域2中生成外部网络N;在事件2和事件5中,路由器A撤回前缀。出现此问题是因为通过一个域获知的路由被重新分发回同一域。
本节介绍如何防止属于某个域的路由重分发回同一域以避免路由环路。
上一节显示如果从一个域获取的前缀重新分发回同一域,如何创建路由环路。由于从路由表进行重分发,因此您可以防止属于域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软件中有一项新功能(来自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关键字仅将属于一个域的内部路由重新分发到另一个域。这会阻止已经外部的前缀重新分发到同一域。
图 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进程的管理距离。本文中提出了以下五种方法:
使用distance 255命令。
根据标记过滤。
在重分发期间使用match internal关键字。
在重分发期间使用基于前缀的过滤。
使用基于前缀的过滤和基于前缀的管理距离。
前两种解决方案可防止属于某个域的路由被添加到路由表中,从而防止它们重分发回同一域。
注意:由于前缀从路由表中被拒绝,因此域无法相互备份。
如果需要,您可以使用最后三个解决方案将域备份到另一个域。但是,您应注意以下警告:
匹配内部解决方案不允许您控制前缀,并且所有外部前缀都将被阻止重分发。换句话说,如果有来自其他ASBR的外部前缀,则这些LSA不会从一个域重分发到另一个域。
“在重分发期间使用基于前缀的过滤”解决方案允许域备份另一个域。但是,仅当没有来自其他ASBR的外部路由时,备份才能正常工作。
“使用基于前缀的过滤和基于前缀的管理距离”解决方案是唯一允许域在存在来自其他ASBR的外部路由时备份另一域的解决方案。
本文档反复指使用一个域备份另一个域。应注意,“备份”意味着,如果路由器A通过给定域(如域1)失去与域部分的连接,则它可以使用另一个域(域2),以便正确地路由到无法通过域1到达的目标。
但是,如果域因前缀未重分发回原始域而被分区,则其他域无法备份分区域,除非前缀重分发回原始域。但是,如“管理距离”和“网络故障时的网络运行”部分所述,这将带来其他问题。