簡介
本檔案將說明在不同程式之間重新分配「開放最短路徑優先」(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,所以在域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的管理距離較低,因此M可以透過域1到達。可能會發生以下一系列事件:
-
路由器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,並安裝透過域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之前,它會將外部N安裝到透過域2(管理距離更高)的備用路由。
-
由於路由器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在域2中生成外部網路N;在事件2和5中,路由器A撤銷字首。發生此問題的原因在於,透過某個域獲取的路由被重分佈回同一域。
建議的解決方案
本節介紹如何防止屬於域的路由重新分配到同一域,以避免路由環路。
使用「距離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進行標籤,並根據同一標籤在遠端路由器上進行過濾。
注意:不再需要前面的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的所有字首的管理距離設定為200;因此,路由器A和路由器B使用域1來訪問屬於域1的字首。
注意:您必須在ACL中明確列出每個域的所有外部字首。維護此類ACL可能非常困難。
摘要
當OSPF域之間存在多個重分配點時,很容易出現路由環路。為了防止路由環路,屬於域的字首不能重新分發回同一域。此外,OSPF進程的管理距離也可以正確設定。以下五種方法已在本文檔中提出:
前兩種解決方案防止將屬於域的路由安裝到路由表中,從而防止將其重分佈回同一域。
注意:由於字首被路由表拒絕,因此域無法互相備份。
如果需要,您可以使用最後三種解決方案將域備份到另一個域。但是,您可以注意以下警告:
-
匹配內部解決方案不允許您控制字首,並且阻止所有外部字首進行重分配。換句話說,如果有來自其他ASBR的外部字首,則這些LSA不會從一個域重新分配到另一個域。
-
在重分配過程中使用基於字首的過濾解決方案允許域備份另一個域。但是,僅當沒有來自其他ASBR的外部路由時,備份才能正常工作。
-
使用基於字首的過濾和基於字首的管理距離解決方案是唯一允許域在存在來自其他ASBR的外部路由的情況下備份另一個域的解決方案。
本檔案重複提及使用一個網域來備份另一個網域。可以注意到,備份意味著路由器A可能丟失透過指定域(例如域1)與部分域的連線,然後它可以使用另一個域(域2)正確路由到無法通過域1到達的目的地。
但是,如果由於字首未重新分發回原始域而對域進行了分割槽,則除非將字首重新分發回原始域,否則其他域無法備份已分割槽的域。但是,如管理距離和網路出現故障時的網路操作部分中所述,這可能會引發其他問題。
相關資訊