簡介
本檔案將說明在不同程式之間重新分發開放最短路徑優先(OSPF)的准則。
背景資訊
不同進程之間的再分配很困難,需要採取特殊措施才能使網路正常運行。本檔案還著重說明Cisco IOS®軟體中引入的變更。
為什麼要在兩個OSPF進程之間重新分配
在多個進程之間重分配的原因可能有多種。以下是幾個範例:
-
從域的一部分過濾OSPF路由
-
分隔不同的OSPF域
-
在單獨的域之間遷移
雖然在某些情況下可能需要在不同進程之間進行重新分配,但替代設計解決方案(如果可能)是一個更合適的選擇,將在本部分的各個小節中討論。
過濾OSPF路由
區域內路由
在OSPF中,某個區域中的IP字首不會在路由器之間直接交換。它們是鏈路狀態通告(LSA)的一部分,該通告還通告網路拓撲;因此,無法過濾某個區域中的路由。
注意:路由器上的本地過濾(可以防止某些路由安裝在給定路由器中)不被視為實際路由過濾。這通常在路由器OSPF下使用distribute-list命令完成。
一種解決方案是使用不同的進程並在重分發路由器上過濾所需的路由;但是,這實際上將該區域分為兩個域。更好的設計是將區域分為不同的區域並使用Cisco IOS第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錯誤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。
在更一般的方式中,域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的管理距離較低,因此可以通過域1訪問M。可能會發生以下一系列事件:
-
路由器A(路由器B)將M重新分配到域1,外部M可以到達路由器B(路由器A)。
-
由於域1的管理距離小於域2,路由器A(路由器B)通過域1安裝M,並設定為將先前發起的LSA(事件1)設定為域1的最大值。
-
由於M已在域2中設定為最大值,因此路由器A(路由器B)會通過域2安裝M,並將M重新分發到域2。
-
與事件1相同。
此循環會繼續,修復此循環的方法是通過域2可訪問域2字首。但是,如果域2的管理距離設定得較低,則域1和字首N會出現相同的問題。
解決方案是根據字首設定管理距離。如需詳細資訊,請參閱首碼型過濾和首碼型過濾以及首碼型管理距離一節。
網路出現故障時的網路操作
您希望一個域備份另一個域,以防一個域無法訪問。
例如,考慮路由器A失去通過域1到網路N的連線的情況。一旦路由器A失去通過域1的連線,它就會刷新先前生成的通告域2中的網路N的LSA,並安裝通過域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。
注意:可以將域1中路由器B的已連線介面從ACL中排除。
圖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進行標籤,並根據同一標籤在遠端路由器上進行過濾。
注意:不再需要previous 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.255 2命令將屬於域2的所有字首的管理距離設定為200;因此,路由器A和B使用域1來訪問屬於域1的字首。
注意:必須顯式列出ACL中每個域的所有外部字首。維護此類ACL可能非常困難。
摘要
當OSPF域之間存在多個重分發點時,很容易發生路由環路。為了防止路由環路,屬於某個域的字首不能重新分發回同一個域。此外,還可以正確設定OSPF進程的管理距離。本文中提出了以下五種方法:
前兩種解決方案可防止將屬於某個域的路由安裝到路由表中,從而防止這些路由重新分發回同一個域。
注意:因為字首從路由表中被拒絕,所以域無法相互備份。
如果需要,您可以使用最後三個解決方案備份另一個域的域。但是您可以注意到以下警告:
-
匹配內部解決方案不允許您控制字首,並且阻止所有外部字首進行重分發。換句話說,如果有來自其他ASBR的外部字首,則這些LSA不會從一個域重新分發到另一個域。
-
在重分發過程中使用基於字首的過濾解決方案允許一個域備份另一個域。但是,只有在沒有來自其他ASBR的外部路由時,備份才能正常工作。
-
使用基於字首的過濾和基於字首的管理距離解決方案是唯一一個允許域在存在來自其他ASBR的外部路由的情況下備份另一個域的解決方案。
本文檔重複提及使用某個域備份另一個域。可以指出的是,備份意味著路由器A可能丟失其通過給定域(如域1)與域中某部分的連線,那麼它可能使用另一個域(域2)來正確路由到無法通過域1到達的目的地。
但是,如果由於未將字首重新分發回原始域而對域進行分割槽,則另一個域無法備份已分割槽的域,除非將字首重新分發回原始域。但是,如管理距離和網路出現故障時的網路操作一節所述,這可能會導致其他問題。
相關資訊