動態路由 - OSPF 一文詳解
阿新 • • 發佈:2020-09-09
## 動態路由
在之前的文章中,介紹了基於[距離向量的路由協議](https://www.cnblogs.com/michael9/p/13376928.html)。而在今天這這一部分中會主要講解鏈路狀態的路由協議,對於動態的路由協議來說,需要具備如下的能力:
**發現遠端網路**
路由器可以直接獲得直連路由,這是由路由器的介面 IP 地址得到。動態路由能夠自動學習遠端目的路由條目。
**維護和更新路由資訊**
路由資訊儲存在路由器的路由表中。但路由的情況有時會發生變動。動態路由支援自動更新這些變化
**在多個到達目的網路的路徑之中選擇最優路徑**
有時,路由協議會計算出到達同一目的網路的多條可用路徑,路由協議需要有辦法在多條路徑之中選出最優的一條用於轉發資料。
**在當前路徑不可用時發現一條新的可行路徑的能力**
我們給這種過程(網路發生變化後,路由協議重新對路由進行計算並與其它路由器交換路由資訊)起了一個名字,叫收斂。收斂的最終結果是網路重新回到一個穩定的正確的工作狀態。收斂的速度越快越好,是體現路由協議效能的重要指標。
### 鏈路狀態路由協議
在介紹具體 OSPF 協議前,先來比較一下鏈路狀態路由協議和距離向量路由協議的區別:
* 鏈路協議具有更好的擴充套件性,比如 RIP 只能最多有 15 臺路由器,而 OSPF 沒有這個限制。
* 每個路由器都有一張完整的拓撲結構(LSDB)
* 週期的觸發更新(LSA,後面會提到)
* 在在拓撲有更新時,鏈路狀態的反應速度會更快
* 路由器之間可以交流更多的資訊。
鏈路狀態協議的資料結構:
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140119564-567790091.png)
這裡簡單說一下過程,假設上面四臺路由器中都遵從鏈路狀態協議,在每臺路由器啟動後,會將 LSA 以泛洪的方式傳遞給其他路由器,進而在每個路由器中構建出完整的拓撲資訊。然後按照最短路徑的優先演算法,以自己為樹根,將到達其他網路的最優路徑放入到路由表中。
## OSPF
### OSPF 特性
開放是指 OSPF 是一種基於開放標準的路由選擇協議,其中 OSPFV2 參考 RFC2328,OSPFV3 參考 RFC5340. 路徑最短優先是指 OSPF 在路由選擇上採用 Dijkstra 所提出的最短路徑演算法。
OSPF 是基於鏈路狀態的路由協議。(鏈路狀態指這個路由器與哪些路由器相鄰,以及它們之間鏈路的"度量")。OSPF 使用頻寬、延遲、負載、距離和費用等多種元素來考慮度量,度量越小,代價越小。
每個使用 OSPF 的路由器中擁有整個拓撲,並且不傳遞路由,僅僅是傳送鏈路狀態通道 (LSA)。
OPSF 使用觸發更新加增量更新。(OSPF 有一個非常緩慢的週期更新)
> 作為對比,RIP 使用週期更新加完整更新(RIP 也具有觸發更新的機制)
> 觸發更新:當拓撲發生變化時,立即傳送更新。
> 週期更新:每經過一個時間週期,傳送一次更新。
> 增量更新:只發送變化部分的路由資訊。
> 完整更新:傳送所有路由資訊
OSPF 有可擴充套件性(適合大型網路-幾百臺),以及快速收斂的能力(但比 EIGRP 差,比 RIP 好)
獨立於傳輸層,資料包封裝在 IP 報文中。
支援 VLSM
支援手動彙總
支援認證
### 工作原理
每個路由器回週期性的向相鄰路由器傳送探測報文(Hello 報文),檢測其是否可達。如果鄰站給予應答,說明鏈路正常;否則說明鏈路出現故障。
如果一個路由器檢測到某條鏈路狀態協議發生變化,該路由器就傳送鏈路狀態更新報文,採用泛洪操作對全網更新鏈路狀態。
> 泛洪指某個路由器收到更新報文後都將這個報文傳送給自己的相鄰路由器,直到報文送到整個網路
即使鏈路狀態沒有發生變化,每隔 30min 路由器要向網路中的其他路由器廣播鏈路狀態資訊,以保證鏈路狀態資料庫和全網保持一致。
每個路由器收到其他路由器的鏈路狀態資訊後,更新鏈路狀態資料庫,構建整個網路的拓撲圖,利用 Dijkstra 的最短路徑演算法計算出到達每個網路的最短路徑(就是路由表中的內容)。
### 工作過程
鏈路狀態路由協議的主要工作原理是:
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140146380-676786475.png)
通過讓拓撲中的每臺路由器都在整個拓撲的範圍內泛洪自己的鏈路狀態通告(LSA),每臺路由器都會獲得整個拓撲中其它所有路由器的 LSA。
用這些 LSA 生成全拓撲統一的鏈路狀態資料庫(LSDB),再使用 SPF 演算法計算出一個 SPF 樹(每臺路由器以自己為起點到達拓撲中所有子網的樹形結構)。
然後將最優的路徑裝載到路由表中。
> 這個工作過程類似於拼圖。每臺路由器生成的 LSA 相當於一塊地圖的碎片,用可靠的機制泛洪這些地圖碎片後,每個路由器都能獲得一個整張拓撲的地圖,這個地圖就是 LSDB。
總結就是如下過程:
1. 發現鄰居,建立並維護鄰居關係
2. 生成 LSA,每臺路由器都會生成自己的 LSA
3. 泛洪 LSA,使用 OPSF 自身具備可靠傳輸能力將 LSA 泛洪到**區域中**的其它路由器上
4. 將收到的 LSA 組裝成LSDB,根據 SPF 演算法計算出到達拓撲中所有網路的最短路徑
5. 將計算得出的路由裝載到路由表
## OSPF 問題 - 分層架構的出現
**問題**
OSPF 在很多方面有著很大的優勢,但也存在著問題隨著網路規模越大資源消耗呈指數增長,限制擴充套件性。網路的頻寬和資源的消耗會隨著裝置數量的增加而增加,因為每臺路由器都需要維護 LSDB 的最新狀態,以及當發生更新時,進行泛洪的通告。
**解決方式**
OSPF使用兩級區域劃分,所有區域被分為普通區域和骨幹區域。區域用一個 32bit 的數來進行標識。可以用點分十進位制的方法,也可以直接用一個十進位制數標識。唯一需要注意的,骨幹區域區域號固定為0。骨幹區域只有一個,且必須連續。
區域在進行規劃的時候,一般要根據一個區域內路由器的型號,效能,以及負載來進行設計,通常一個區域中的路由器數量為30到100臺左右。
區域在進行規劃的時候,一定要注意,所有普通區域必須與骨幹區域直接相連。這樣要求主要是為了 OSPF 區域間防環。
> 由於 SPF 演算法本身可以保證 OSPF 在區域內部無環路,所以區域間防環主要依靠網路設計來解決。
>
> 因為 OSPF 在區域間使用類似距離向量路由協議的路由傳遞方式,所以不能保證沒有環路,
>
> 所以區域之間採星型的拓撲結構,通訊都要經過骨幹區域,區域與區域之間無法單獨通訊,進而無法形成環路。
進而將路由器分成了幾類:
1. 區域內部路由器(所有的介面都位於同一區域)
2. 區域邊界路由器(ABR)(有不同的介面位於不同的區域且其中一個為骨幹區域)。ABR 路由器的效能要求更高,因為需要同時裝載不同區域的 LSDB。
3. 自治系統邊界路由器(ASBR)(進行重分佈操作,將其它路由器源學習到的路由引入 OSPF 的路由器)
4. 骨幹路由器(BR)(只有一個介面位於骨幹區域)
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140221517-845286826.png)
這樣的設計,是每個路由器僅裝載本區域的 LSDB,大大提升了效率。而對於 ABR 這樣的路由器來說,由於橫跨多個區域,所以需要裝載不同的區域的路由器,自然要求的效能也比較高。在訪問不同的區域的網路時,不需要傳遞 LSA,而是傳遞路由資訊,使得效率進一步提高。
## OSPF 報文型別
1. Hello 報文,用於 OSPF 鄰居動態發現,鄰居引數協商,鄰居關係維護。
2. DBD 報文,資料庫描述。
* 用於傳遞 LSDB 摘要資訊,實際上是 LSDB 中 所有 LSA 的頭部資訊。OSPF 路由器通過交換 DBD 報文,來統計自己缺少的 LSA 並向對端傳送 LSR 報文進行請求
* 用於主從路由器的選舉
3. LSR 報文,用於向鄰居請求自己 LSDB 中沒有的 LSA
4. LSU 報文,LSU 用於給鄰居傳送它們請求的 LSA,只有 LSU 報文中會包含完整的 LSA
5. LSAck 報文,LSAck 用於向鄰居確認收到的 LSU,如果沒收到 LSAck 的話,鄰居會不斷重傳請求的 LSU。注意區分 LSA 和 LSAck
> 注意 LSA 本身不是報文
## 鄰居與鄰接
OSPF 鄰居關係,分為鄰接和鄰居兩種。LSA 只在鄰接關係的鄰居之間同步,普通鄰居關係之間不同步 LSA 資訊。
鄰居關係:路由器之間僅通過 Hello 報文,知道目前處於同一區域。
鄰接關係:在鄰居關係的基礎上,DR 和 BDR 之間互相傳送 LSA。
我們知道,在執行著多臺 OSPF 的路由器中,為了讓對方能夠發現自己,需要互相傳送 HELLO 訊息,建立鄰居關係。接著傳送在路由器之間傳送 LSA 碎片。但這就有一個問題,由於每臺路由都需要知道完整的拓撲資訊,所以所有路由器都需要廣播和接受 LSA 的碎片,假設有 n 個路由器之間連線鄰接關係,那麼將需要建立 n(n-1)/2 個鄰接關係。這無疑是對網路資源的很大損耗。
為了解決這個問題就提出了一個 DR 和 BDR 的概念,將路由器的型別分為三種:
DR: 選舉成功的路由器 - 理解成掌門
BDR:作為backup 的路由器 - 理解成副掌門,時刻監聽掌門狀態,掌門一死,副掌門就是掌門。
Other:未選舉成功的其他路由器。
接著在一個多路訪問鏈路上,所有的路由器都需要與 DR 路由器建立鄰接關係,同時也要與 BDR 路由器建立鄰接關係,DR Other 之間,只建立鄰居關係,不會同步資料庫資訊。換句話說,區域中的普通路由器只和老大和老二建立關係。進而依靠這種方式降低 OSPF 程序對路由器資源佔用的。
### OSPF 建立鄰居過程
Hello 報文:用於動態鄰居發現,鄰接引數協商,鄰接關係保持。
動態鄰居發現:OSPF 的鄰居關係,在支援廣播(支援組播)的鏈路上,可以自動建立,而不需要管理員進行顯式配置。通過向組播地址(224.0.0.5)傳送 OSPF Hello 包,OSPF 能動態發現鏈路上的其它 OSPF 路由器。
>Other -> DR/BDR 組播發送:224.0.0.6
>
>DR -> Other 組播發送:Other 會監聽 224.0.0.5 的 IP,接受 DR 的 LSA
選舉步驟:
判斷網路中是否有 DR 和 BDR:
* 如果網路中有 DR,BDR 新加入的路由要承認
* 如果有 DR,沒有 BDR,選擇 BDR
* 沒有 DR,有 BDR,則 BDR 晉升為 DR,選舉 BDR
選舉 DR 和 BDR 的過程:
1. 區域內中所有路由器傳送 Hello 報文,進行 PK 選舉出 BDR。
1. 原則是先比較 Hello 報文中的優先順序(0 - 255),其次 Router ID。
2. 稱為BDR後,監聽網路中是否存在 DR,沒有再晉升為 DR.
如果想要重新選舉,則要重啟 OSPF 程序。如果是兩個執行 OSPF 的網路整合在一起,如果都存在 DR 和 BDR,則兩個網路中 DR 和 BDR 同層次進行比較。
選舉成功後:
1. DR Other 和 DR,BDR 之間是鄰接關係
2. DR 和 BDR 之間是鄰接關係
3. DR Other 之間是鄰居關係
4. DR other 監聽組地址是 224.0.0.5
5. DR BDR 監聽組地址 224.0.0.5, 224.0.0.6(BDR 和 DR 之間通訊)
### 鄰居協商引數
1. Router-ID,路由器識別符號。兩臺路由器想建立 OSPF 鄰居關係,Router-ID 必須不同。Router-ID 可以由管理員進行手工配置,一個點分十進位制的 32bit 值。
* 如果管理員沒有顯式配置 Router-ID,路由器獲取自身最大的環回介面 IP 地址作為自己的 Router-ID
* 如果沒有配置環回介面,則獲取最大物理介面 IP 地址作為自己的 Router-ID。推薦對 Router-ID 進行手工配置。
2. Hello Interval&Dead Interval,Hello 計時器和死亡計時器。預設在高速鏈路上,為10秒 40秒。當 Hello 計時器超時,路由器將傳送Hello 報文,當死亡計時器超時,路由器將會斷掉與該鄰居的鄰居關係。而每次從鄰居收到 Hello 報文將重置死亡計時器。建立鄰居關係的路由器要求擁有完全一致的 Hello 和 Dead Interval。
3. Active Neighbors,活躍鄰居,一個傳送 Hello 報文路由器的鄰居列表。
4. Area ID,區域號,代表該介面屬於哪個 OSPF 區域。建立鄰居關係的兩個路由器(兩個介面)必須屬於同一個區域。
5. Router Priority: 介面的優先順序,影響 DR,BDR 選舉。越大越好,預設為 1,最大為 255,當優先順序為 0 時,代表不參與 DR,BDR 選舉。
6. DR 指定路由器,BDR 備份指定路由器。在每個鏈路上通過選舉產生,路由器優先順序越大越好,當優先順序都相等時,選舉 Router-ID 最大的路由器。
7. Authentication Type&Date,認證型別與認證資料,認證型別指示鄰居關係使用什麼方式進行認證(空:不認證,明文認證,MD5 摘要認證),預設使用空認證且不攜帶認證資料。認證型別或認證資料不一致都會導致 OSPF 鄰居建立失敗。
8. Stub Area Flag 末節區域標記,建立鄰居的路由器必須擁有完全一致的末節區域標記。
### OSPF狀態機-建立鄰接狀態過程
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140251935-933387085.png)
**建立鄰居關係:**
**1. Down 初始狀態**
與鄰居之間的介面沒有宣告 OPSF 程序。某些情況下也會讓鄰居處於 DOWN 的狀態比如鏈路兩端分別為點到點和點到多點網路型別
**2. Init 初始化狀態**
從鄰居收到一個 Hello 包,其中不包含自己的 Router-ID。會讓自己處於初始化狀態。如果鏈路存在單向鏈路問題,會讓鄰居關係保持在初始化的狀態無法繼續向前遷移。
**3. Attempt(NBMA)嘗試狀態**
每 poll 時間(120秒)向對面傳送一個 Hello 包嘗試建立一個鄰居關係。只在低速的 NBMA 鏈路上出現。
**3. 2-WAY 雙向通訊狀態**
收到鄰居發來的 Hello 包,且其中包含自己的 router-id,則認為與鄰居之間的雙向通訊已經建立,進入 2-WAY 狀態。
2-WAY 狀態鄰居兩端需要進行如下操作:
* 先判斷網路型別,是否需要選舉 DR,BDR
* 如果不需要選舉 DR,BDR,則直接轉換到 EX-START。
* 如果是廣播型或 NBMA 網路,則選舉 DR, BDR。
* 判斷鄰居之間是否需要建立鄰接關係。
* 這個是鄰居路由器之間的穩定工作狀態。
* 當 DR,BDR 選舉結束,且鄰居之間需要建立鄰接關係,則繼續向 ExStart 狀態遷移。
**建立鄰接關係:**
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140311898-1342901275.png)
**4. ExStart**
該狀態下路由器的主要任務是選舉主從路由器主導 DBD 的互動。傳送空的,標誌位置位情況為 111 的 DBD 報文來進行主從選舉, 確定初始序列號,比較介面 MTU.
* 當從路由器發出標誌位置位情況為 010 或 000 的報文後,則進入 Ex-Change 狀態。
* 如果介面的 MTU 設定不一致,則鄰居關係會停留在 ExStart 狀態
為什麼要進行主從的選舉?
想象有 R1,R2 兩臺路由器。其中 R1 共有 1000 個 LSA 碎片,對應 DBD 假設共有 10 個。而 R2 有 300 個 LSA 碎片,DBD 有 3 個。假設只能一次傳送一個 DBD. 如果沒有主從關係的話,R1 和 R2 直接會向對方傳送,但這就存在對方可能沒有收到的情況,到時資料庫不一致。
但如果先選擇了主從關係後,這裡假設 R1 為主,R2 為從。這時 R1 需要給 R2 傳送 10 個 DBD。R2 需要給 R1 傳送 3 個 DBD。由 R1 先給 R2 傳送第一個 DBD 報文,R2 收到後將自己的 DBD 報文再發送 R1。R2 給 R1 恢復,表明兩件事。第一之前的 DBD 我收到了。並把自己的 DBD 傳送 R1。R1 收到後給 R2 傳送第二個 DBD 報文,同樣表示之前的 DBD 收到了,下面是序號為 2 的 DBD 報文。假設某次沒有收到對方的回覆,則會重複傳送。這樣就保證了可靠性。
如果想 R1 和 R2 DBD 數量不對等的情況,如第三次 R2 給 R1 傳送了序號為 3 的 DBD 報文,自己所有的 DBD 都已經發送 R1了。之後再給 R1 的回覆中就是空報文,表示 R1 給自己的報文收到了,並且自己已經沒有要傳送的報文了。
**5. ExChange**
通過傳送 DBD 報文,同步資料庫結構。
當主發出 001,從回覆 000 報文的時候,DBD 報文互動結束。根據鏈路狀態請求列表的情況,進入 Loading 或者 Full 狀態。
Loading 繼續傳送 LSR,請求資料庫中缺少的 LSA。同步資料庫。
Full 資料庫同步完成。一個鄰接關係成功建立。Full 是鄰接關係的穩定工作狀態。
在哪些情況下需要選舉 DR,BDR?
根據鏈路型別進行選擇 (點對點不選,乙太網線選)
為什麼要在多路訪問網路當中選舉 DR,BDR ?
為了減少鄰接關係的數量,減少 LSA 的泛洪流量,減少 CPU 資源和鏈路頻寬的佔用。
如何選舉 DR, BDR?
根據介面優先順序。優先順序越大,越可能稱為 DR。預設優先順序為 1,優先順序為 0 時,代表不參與選舉。如果優先順序相同,則比較 Router-ID 來進行選舉,Router-ID 大的路由器,成為 DR
**6. Loading State:**
載入收到的 DBD 的內容,發現本地缺少的 LSA,接著取請求需要的 LSA。收到 LSR 報文,回覆 LSU 報文。
**7. Full State**
回覆對方收到了需要的 LSA。回覆 LSAck 報文。
### OSPF 鄰居無法建立原因彙總
1. 鄰居路由器傳送的 HELLO 包中,Router-ID 欄位相同
2. 鄰居路由器傳送的 HELLO 包中,Area-ID 與本端介面 Area 宣告不一致,鄰居無法建立
3. 鄰居兩端認證型別不一致,鄰居無法建立
4. 鄰居兩端認證資料不一致,鄰居無法建立
5. 鄰居兩端介面掩碼配置不一致,鄰居無法建立
6. 鄰居兩端的 Hello-interval 配置必須一致,否則鄰居無法建立
7. 鄰居兩端的 dead-interval 配置必須一致,否則鄰居無法建立
8. 如果鄰居兩端末節區域標記不一致,則鄰居無法建立
## 抓包 OSPF 通訊過程
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140337919-792717701.png)
### 選取 DR 和 BDR 的區別
這裡首先假設 R1,R2,R3 已經配置了 OSPF 的協議。
這時我們將 R1 宣告的 12.1.1.0 網路刪除掉,在 R2 檢視鄰居狀態:
```
Router#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
34.1.1.1 1 FULL/DR 00:00:31 23.1.1.2 Ethernet0/1
12.1.1.1 1 FULL/BDR 00:00:39 12.1.1.1 Ethernet0/0
```
可以看到, 沒有立馬消失,在 Dead time 到達 0 時,會將 12 網路刪除。
之後在 R1 網路上重新宣告,在 R2 上可以看到,非常快就建立鄰接關係成功了:
```
Router#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
34.1.1.1 1 FULL/DR 00:00:30 23.1.1.2 Ethernet0/1
12.1.1.1 1 FULL/BDR 00:00:38 12.1.1.1 Ethernet0/0
```
但是如果我們把,R1 和 R2 宣告的 12 網路都刪掉,再重新宣告,就會發現狀態卡在 2-Way 狀態很長時間:
```
Router#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
34.1.1.1 1 FULL/DR 00:00:35 23.1.1.2 Ethernet0/1
12.1.1.1 1 2WAY/DROTHER 00:00:33 12.1.1.1 Ethernet0/0
```
這裡卡成的時間,是在選舉 DR 和 BDR,可見 DR 和 BDR 的選舉在是非常影響網路的效能的。
### 鏈路的狀態變化
**從 down 狀態到 init 狀態:**
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140357886-974209605.png)
可以看到這時傳送的 Hello 包發往 224.0.0.5 組播地址。並且報文裡,沒有記錄活躍的鄰居。
**init 到 2-way 狀態:**
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140427366-146431559.png)
這時 R1 收到了 R2 的 Hello 報文,並告訴對方我的鄰居是你,這時就可以成為 2-Way 狀態了。對應就是 Active Neighbor 欄位,這裡是 23.1.1.1 是因為 R2 的 router-id 沒有指定,也沒有 loopback 介面,所以用的是物理介面。
**2-way到 exstart狀態:**
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140509186-1350246318.png)
紅框的部分,就是通過傳送空的 DBD 報文,置位 111 進行主從選舉的過程。
**Exchange狀態到 Full 狀態:**
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140524081-413152141.png)
R1 傳送 LSR 報文,獲取缺少的鏈路狀態。R2 回覆 LSU 報文。之後傳送 LSU 到組播,然後對方進行 Ls Ack 進行確認。
### OSPF 基本 Header
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140538142-1079087819.png)
* version: ospf 版本
* Message Type: 共有五種報文
* Packet Length:包括 Header Ospf 總長度
* Source OSPF Router:傳送者的 Router-id
* Area ID:傳送介面表示所在區域
* Checksum: 整個資料包的校驗和
* Auth Type:
* 0:沒有認證
* 1:明文認證
* 2:MD5 認證
Auth Data: 所需要的認證資訊
### Hello 報文
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140556077-132942372.png)
* Network Mask: 傳送介面的網路掩碼
* Hello Interval [sec]: Hello 報文傳送的時間間隔
* Options: OSPF 啟用的功能
* Router Priority: 優先順序,用於 DR 和 BDR 的選舉
* Router Dead Interval [sec]: 路由失效週期
* Designated Router: 選舉出的 DR IP
* Backup Designated Router: 選舉出的 BDR IP
* Active Neighbor: 當前的鄰居,在剛開始的 Hello 包中並沒有
### DBD 報文
空 DBD 用於選舉:
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140610561-141571468.png)
正常 DBD 用於同步狀態:
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140622737-731706135.png)
* Interface MTU: 在資料包不分片的情況下,始發路由器介面可以傳送的最大 IP 資料包的大小,如果 MTU 不一致,會導致鄰接關係無法建立
* Options: OSPF 啟用的功能
* DB Description:
* R:保留位
* I:Init = 1,代表此報文用於選舉主從,I = 0,表示主從選擇完畢,傳送帶摘要資訊的 DBD.
* M:M = 1,表示 DBD 並未發完,後續還有。M = 0,報名此 DBD 報文最 last DBD.
* MS: 表示主從位,MS=1 為 Master,=0 為 Slave.
* DD Sequence: DBD 的序列號,主從雙方利用序列號來確保DD報文傳輸的可靠性和完整性
* LSA - type: LSA 頭部資訊
### LSR 報文
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140637162-407614922.png)
* LS Type: LSA 種類
* Link State ID:根據 LS Type 而變化
* Advertising Router: 始發這條 LSA 的路由器的 Router Id.
### LSU 報文
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140650618-685104238.png)
* number of LSAs: 包含 LSA 的數量
* LSA :具體的 LSA 資訊
### LS ACK 報文
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140704326-2088444523.png)
## OSPF 網路型別
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140943508-847174317.png)
Point-to-Point:點到點網路,不需要選擇 DR 和 BDR,二層封裝為 P2P 和 HDLC
Broadcast:二層協議為乙太網協議,為廣播型,需要選 DR 和 BDR,解決 LSA 泛洪的型別
NMA:二層協議為幀中繼,為低速網路,已經淘汰
P2MP:需要管理員手動配置,為幀中繼網路使用
P2MP-nobrocast:P2MP 的子類,幀中繼網路,已經淘汰
Loopback:環回口網路型別,會將環回口路由掩碼設定為 /32. 通過修改網路型別來改變掩碼。
其中 P2P,Broadcast:傳送 Hello 間隔為 10s
NMA P2MP P2MP-nobrocast :傳送 Hello 週期為 120s
## LSA 型別
OSPFV2 中共有 6 中 LSA:
* Router LSA (TYPE 1)
* Network LSA (TYPE 2)
* Network Summary LSA (Type 3)
* SABR Summary LSA (Type 4)
* AS-External LSA (Type 5)
* NSSA LSA(Type 7)
從如下角度考慮 LSA:
* 由誰始發
* 傳播範圍
* 作用
### Router LSA : 一類 LSA
只要執行 OSPF,都會產生,在區域內傳播,描述了路由器的鏈路狀態和開銷,可根據一類 LSA 還原拓撲結構
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909140959473-676797777.png)
LSA 頭部:
* Age:16 bit,後 15 位表示 age,最多在資料庫存在 3600s,LSA 每 1800s 泛洪一次,最高位為 1 表示 LSA 在 LSDB 永不老化.
* Option: 表示 LSA 支援的可選效能
* LS Type:標識 LSA 型別, 這裡是型別1
* Link State ID:產生該 LSA 路由器的 Router ID
* advertising Router:產生該 LSA 路由器的 Router ID
* Sequence Number:識別 LSA 新舊問題,初始值從Ox80000001 開始
* Checksum:對 Age 外的欄位進行校驗
* Length:包含 LSA 頭部的 LSA 大小
LSA 內容:
* Flags:
* V:1 表示始發路由器是一條或者多條具有完全鄰接關係的虛鏈路的端帶
* E:1 表示始發路由是一個 ASBR 路由器
* B:1表示是 ABR 路由器
* Number of links:鏈路的數量
* Type:OSPF 定義了四種 Link 型別(根據網路型別不同)
* | | Link Type | Link ID | Link Data |
| ---- | --------------------- | ------------------------ | ----------- |
| 1 | P2P(P2P 網路) | 鄰居路由器的 Router ID | 自己介面 IP |
| 2 | Transit(廣播型網路) | DR 的介面 IP 地址 | 自己介面 IP |
| 3 | Stub(描述環回介面) | IP 所在網路 | 子網掩碼 |
| 4 | Virtual-Link | 虛擬鄰居路由器 Router ID | 本虛鏈路 IP |
* number of Metrics:開銷 metrics
### Network LSA:二類 LSA
網路 LSA,由 DR 產生,區域內傳播,描述了 DR 所在網路中的網路資訊和拓撲資訊
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141013027-1477264304.png)
LSA 頭部:
* Age:16 bit,後 15 位表示 age,最多在資料庫存在 3600s,LSA 每 1800s 泛洪一次,最高位為 1 表示 LSA 在 LSDB 永不老化.
* Option: 表示 LSA 支援的可選效能
* LS Type:標識 LSA 型別, 這裡是型別 2
* **Link State ID:DR IP 地址**
* advertising Router:產生該 LSA 路由器的 Router ID
* Sequence Number:識別 LSA 新舊問題,初始值從Ox80000001 開始
* Checksum:對 Age 外的欄位進行校驗
* Length:包含 LSA 頭部的 LSA 大小
LSA 內容:
network mask:網路掩碼,用於表示 Transit 網路使用的網路掩碼
Attached:由哪些路由器連到網路中,列出 MA (multiple access多路訪問,廣播型) 網路中與 DR 形成鄰接關係,包括自身的 ID.
偽節點:二類 LSA 是 DR 代替偽節點產生的。為了方便表示廣播網路中的 Metric 開銷和表示。
### Network Summary LSA : 三類 LSA
由 ABR 產生,**在區域內傳播**,描述區域內某個網段的路由。
由於 ABR 具有 Area 0 和 Are1 的兩個資料庫,為了傳輸的方便和效能,會將資料庫的資訊轉換為路由資訊進行傳輸。比如這裡的 R2,會將 Area 0 的資料庫轉換為路由資訊,傳送給 Area1 裡的路由器。將 Area 1 的資料庫轉換為路由資訊,傳送給 Area0 裡的路由器。傳送的報文就是網路彙總 LSA - 三類 LSA.
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141032818-978828127.png)
* Link State ID: 網路號
* Network Mask:子網掩碼
* Metric:度量值
* Advertising Router:產生報文的路由器
在 R2 檢視 3 類 LSA 資訊,可以發現在 Area 0 中,自己產生了 `12` 網段的路由資訊。
```
Router>show ip ospf database
OSPF Router with ID (2.2.2.2) (Process ID 100)
Router Link States (Area 0)
Link ID ADV Router Age Seq# Checksum Link count
2.2.2.2 2.2.2.2 329 0x80000004 0x00D40D 1
3.3.3.3 3.3.3.3 312 0x80000007 0x004032 2
4.4.4.4 4.4.4.4 245 0x80000005 0x00199F 1
Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
23.1.1.1 2.2.2.2 329 0x80000002 0x00EE14
34.1.1.2 4.4.4.4 245 0x80000002 0x005D89
Summary Net Link States (Area 0)
Link ID ADV Router Age Seq# Checksum
12.1.1.0 2.2.2.2 329 0x80000002 0x00FB20
45.1.1.0 4.4.4.4 245 0x80000002 0x0011E1
```
在 R1 上檢視引入的路由(區域間的路由,不是本區域的路由):
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141053934-1786830004.png)
### AS-External LSA:五類 LSA
由 ASBR 產生,描述 AS 外部的路由資訊,如果將外部路由在 OSPF 區域內,做了重分佈(redistribute ), 則會在整個 OSPF (AS)內泛洪。
如 R6 中並沒執行 OSPF,在 R6 的迴環介面上配置 6.6.6.6/24 的 IP, 這時在 R5 就會通過靜態路由的方式,通過重分佈引入 AS,然後將去往 6.6.6.6/24 網路的資料包通過 E0/1 轉發給 R6.
在 R4 E0/1 抓包 ,可以收到五類 LSA 的更新:
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141105075-74285003.png)
* Link State ID:目標網路
* Netmask: 網路子網掩碼
* Advertising Router:始發該報文的 Router ID
* Options - E 位: 用於更改引入 OSPF 外部路由的 Metric 計算方式
* 置位 1:為 E2 型別, 僅僅計算外部開銷。在思科裝置中,預設為 20,永遠為 20.
* 置位 0:為 E1 型別, 計算外部和內部開銷.
* Forwarding Address:轉發地址,用於優化網路,解決網路中次優路由的問題(多臺路由器介面,在同一網路)。
* 轉發地址為 0.0.0.0, 則會將資料包報轉發至始發 ASBR 上。
* 在 ASBR 上,如果引入外部路由的外部介面不參與 OSPF,則為全 0
* 轉發地址非 0 ,則會將資料包轉發至 FA 地址。
* 在 ASBR 上,滿足下面則 FA 不為 0,IP 為 是 ASBR 路由器 AS 外部鄰居的介面 IP 地址
* ASBR 外部介面參與 OSPF
* 該介面網路型別不是 P2P 或 P2MP
* 該介面不能是被動介面
### ASBR Summary:四類 LSA
ABR 產生,描述到 ASBR 的路由,整個 AS 區域內傳播(ASBR 區域除外).
這時考慮,當 R1 在知道五類 LSA 的資訊後,知道要去往 6.6.6.0/24 網路,需要找 Router-Id 為 5.5.5.5 的路由器。但由於並不知道 5.5.5.5 路由器的路由資訊,所以就需要四類 LSA,要告知其需要的路由。由 ABR - R4 產生。
在 R3 E 0/1 口進行抓包:注意報文格式和三類 LSA 一樣。
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141124928-1084581433.png)
### AS External Link States - 7 類 LSA
由 ASBR 產生,描述 AS 外部路由,NSSA 區域內傳播。
OSPF 特殊區域:在一些場景下,由於某些路由器的效能不高,不足以接受和計算特別大量的路由資訊,減小鏈路狀態資料庫,會將這樣的區域配置成特殊區域。
特殊區域的型別:
* Stub 區域:末節區域,Stub 區域的 ABR 不傳播接受到的自治系統外部路由。一般在該區域,只會有一類,二類,三類 LSA。預設情況下,Stub 區域中的 ABR 會向 Stub 區域自動通告三類 LSA OIA 的預設路由。預設路由,開銷值為 1.
* 完全 Stub 區域:在 Stub 區域的基礎上,也不允許區域間的路由傳播。不傳送三類 LSA,僅有一類和二類的 LSA。配置時需要在所有 ABR 裝置上進行 no-summary 配置。
* NSSA 區域:Not So Stubby Area. 外部區域引入的路由不要,但是本身區域想要可以引入外部路由。NSSA 區域沒有 LSA 5,但允許外部路由通告到 NSSA 區域。通過 NSSA 內的 ASBR 傳送 LSA 7 類將外部路由通告到 NSSA 區域中。在 NSSA 區域內泛洪,存在 1,2,7 類 LSA。
* NSSA 區域不會通告預設路由,需要在 ABR 上手動下發路由
* 完全 NSSA 區域:完全非末節區域。不予許區域間路由進入,僅存在 LSA 1, 2, 7 和 LSA 3 類預設路由的資訊。配置時需要在所有 ABR 裝置上增加關鍵字 no-summary.
* 由於 7類 LSA 只能在 NSSA 區域內泛洪,需要 NSSA 區域 ABR 將 LSA7 轉換成 LSA5 進行泛洪。如果存在多臺 ABR,由 Router-Id 大的路由器泛洪。
## 開銷計算
OSPF 使用 Metric 組委度量值,Metric 越低,表示路徑越好。預設情況下,介面的開銷與介面頻寬成反比。,頻寬越高則開銷越低。
在思科裝置上,OSPF 開銷計算公式:
Metric = 參考頻寬 / 實際頻寬
* 預設參考頻寬為 10^8 bit/s
cost = 10^8 / 10 mbps = 10
cost = 10^8 / 100 mbps = 1
cost = 10^8 / 1000 mbps = 0.1
但由於只能是整數,所以千兆鏈路也是 1 所以無法區分百兆和千兆鏈路。這裡可以採用修改標準比如將 十兆頻寬的標準修改為 10^9 ,但需要注意的是,在所有的鏈路都要修改.
修改方式:
1. 如上修改參考頻寬
2. 修改介面開銷,ip ospf cost(推薦)
## 虛鏈路
虛鏈路通過在兩臺邊界裝置之間,穿越所屬的**非骨幹區域**所建立的一條邏輯上的連線通道。讓非骨幹區域連線到骨幹區域或骨幹區域被分割的情況。
虛鏈路所穿越的區域稱為傳輸區域。
比如下面的 R4 和 R2 之間連線的虛鏈路,讓非骨幹區域連線到骨幹區域:
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141213233-1371988430.png)
或者像 R1 和 R4 所在 Area0 區域被分割的情況:
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141219698-1329691577.png)
在配置虛鏈路時需要注意:
* 在兩端裝置同時配置,並且處於同一區域。
* 傳輸區域不能是特殊區域。
* 其中一臺裝置必須連線骨幹區域。
* 如果骨幹區域配置認證,虛鏈路也需要配置認證。
### 配置
按照第一個圖正常配置 OSPF 後,在 R3 和 R5 上查詢 database:
```
# 發現 Area3 區域的路由並沒有收到
R3#show ip ospf database
OSPF Router with ID (34.1.1.3) (Process ID 100)
Router Link States (Area 2)
Link ID ADV Router Age Seq# Checksum Link count
23.1.1.2 23.1.1.2 219 0x80000003 0x004575 1
34.1.1.3 34.1.1.3 117 0x80000005 0x003AFE 2
46.1.1.4 46.1.1.4 113 0x80000002 0x00155C 1
Net Link States (Area 2)
Link ID ADV Router Age Seq# Checksum
23.1.1.2 23.1.1.2 219 0x80000001 0x00DEE2
34.1.1.3 34.1.1.3 117 0x80000001 0x00C5CA
Summary Net Link States (Area 2)
Link ID ADV Router Age Seq# Checksum
10.1.0.1 23.1.1.2 323 0x80000002 0x007297
10.1.1.1 23.1.1.2 323 0x80000002 0x0067A1
10.1.2.1 23.1.1.2 323 0x80000002 0x005CAB
10.1.3.1 23.1.1.2 323 0x80000002 0x0051B5
12.1.1.0 23.1.1.2 323 0x80000002 0x004DBB
# 發現 Area0,1,2 區域的路由並沒有收到
R5#show ip ospf database
OSPF Router with ID (45.1.1.5) (Process ID 100)
Router Link States (Area 3)
Link ID ADV Router Age Seq# Checksum Link count
45.1.1.5 45.1.1.5 272 0x80000003 0x00F760 1
46.1.1.4 46.1.1.4 282 0x80000003 0x00E375 1
Net Link States (Area 3)
Link ID ADV Router Age Seq# Checksum
45.1.1.4 46.1.1.4 282 0x80000001 0x001B4F
```
沒有收到路由的原因就因為 R4 並不是 ABR,並不能傳遞區域間的路由,所以需要配置虛鏈路,讓 R4 稱為 ABR.
```
# R2 配置
R2(config)#router ospf 100
# 46.1.1.4 為 R4 的 Router-id
R2(config-router)#area 2 virtual-link 46.1.1.4
# R4 配置
R4(config)#router ospf 100
# 23.1.1.2 為 R2 的 Router-id
R4(config-router)#area 2 virtual-link 23.1.1.2
# 查詢虛鏈路
R4#show ip ospf virtual-links
Virtual Link OSPF_VL0 to router 23.1.1.2 is up
Run as demand circuit
DoNotAge LSA allowed.
Transit area 2, via interface Ethernet0/0
Topology-MTID Cost Disabled Shutdown Topology Name
0 20 no no Base
Transmit Delay is 1 sec, State POINT_TO_POINT,
Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
Hello due in 00:00:01
Adjacency State FULL (Hello suppressed)
Index 1/1/3, retransmission queue length 0, number of retransmission 0
First 0x0(0)/0x0(0)/0x0(0) Next 0x0(0)/0x0(0)/0x0(0)
Last retransmission scan length is 0, maximum is 0
Last retransmission scan time is 0 msec, maximum is 0 msec
```
**虛鏈路使用單播發送 hello 包建立鄰居,建立成功後,Hello 包將不再發送。**通過虛鏈路學到的 LSA,AGE 欄位為 DNA,表示永不老化。
## 認證
OSPF 提供認證功能,共有三種模式:
1. 不啟用認證
2. 明文認證
3. MD5 密文認證
OSPF 有三種認證部署型別:
1. 介面認證
2. 區域認證
3. 虛鏈路認證
### 介面認證
為 R1 E0/0 和 R2 E0/0 配置:
明文認證:
```
# R1 開啟明文認證
R1(config)#int e0/0
R1(config-if)#ip ospf authentication me
R1(config-if)#ip ospf authentication-key 123456
# R2 開啟明文認證
R2(config)#int e0/0
R2(config-if)#ip ospf authentication me
R2(config-if)#ip ospf authentication-key 123456
```
密文認證:
```
R1(config)#int e0/0
R1(config-if)#ip ospf authentication message-digest
R1(config-if)#ip ospf message-digest-key 1 md5 1234
R2(config)#int e0/0
R2(config-if)#ip ospf authentication message-digest
R2(config-if)#ip ospf message-digest-key 1 md5 1234
```
### 區域認證
為某個區域下同時配置認證,比如為 Area 0 區域,比在每個介面下配置認證更加方便:
```
# R1 為 Are0 下的介面開啟認證功能
R1(config)#router ospf 100
R1(config-router)#area 0 authentication
# 去介面下設定密碼
R1(config)#int e 0/0
R1(config-if)#ip ospf authentication-key 123
# R2 為 Are0 下的介面開啟認證功能
R2(config)#router ospf 100
R2(config-router)#area 0 authentication
# 去介面下設定密碼
R2(config)#int e 0/0
R2(config-if)#ip ospf authentication-key 123
```
### 虛鏈路認證
當為骨幹區域配置了區域認證時,如果啟用了虛鏈路,也要為虛鏈路配置認證,因為虛鏈路也需要骨幹區域
虛鏈路明文認證:
```
R2(config)#router ospf 100
R4(config-router)#area 0 authentication
R2(config-router)#area 2 virtual-link 46.1.1.4 authentication
R2(config-router)#area 2 virtual-link 46.1.1.4 authentication-key 123123
R4(config)#router ospf 100
R4(config-router)#area 0 authentication
R4(config-router)#area 2 virtual-link 23.1.1.2 authentication
R4(config-router)#area 2 virtual-link 23.1.1.2 authentication-key 123123
```
密碼認證:
```
R2(config)#router ospf 100
R4(config-router)#area 0 authentication
R2(config-router)#area 2 virtual-link 46.1.1.4 authentication message-digest
R2(config-router)#area 2 virtual-link 46.1.1.4 message-digest-key 1 md5 1234
R4(config)#router ospf 100
R4(config-router)#area 0 authentication
R4(config-router)#area 2 virtual-link 23.1.1.2 authentication message-digest
R4(config-router)#area 2 virtual-link 23.1.1.2 message-digest-key 1 md5 1234
```
## 路由彙總
彙總後將減小產生 3 類 LSA 的數量,減少頻寬,提高效能。
### 區域間彙總
在 ABR 配置: Area1 的路由進行彙總
```
# 在 R1 上配置
R1(config)#router ospf 100
# area 1 表示所需彙總路由的區域
R1(config-router)#area 1 range 10.1.0.0 255.255.252.0
# 可加引數,進行路由過濾
not-advertise
# 在 R2 檢視
R2#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is not set
10.0.0.0/22 is subnetted, 1 subnets
O IA 10.1.0.0 [110/11] via 12.1.1.1, 00:00:08, Ethernet0/0
12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 12.1.1.0/24 is directly connected, Ethernet0/0
L 12.1.1.2/32 is directly connected, Ethernet0/0
23.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 23.1.1.0/24 is directly connected, Ethernet0/1
L 23.1.1.2/32 is directly connected, Ethernet0/1
34.0.0.0/24 is subnetted, 1 subnets
O 34.1.1.0 [110/20] via 23.1.1.3, 01:04:26, Ethernet0/1
45.0.0.0/24 is subnetted, 1 subnets
```
### 區域外匯總
在 ASBR 配置: 將外部路由進行彙總後再重分佈到上 OSPF
```
R4(config)#router ospf 100
# 將 eigrp 中的路由重分佈到 ospf 中
R4(config-router)#redistribute eigrp 50
# 將路由彙總
R4(config-router)#summary-address 60.1.0.0 255.255.252.0
```
## 預設路由下發
向 OSPF 區域內釋出預設路由,無法使用重分佈命令進行路由的下發
```
# 假設 R4 連線的是 ISP 的網路,會在 R4 配置預設路由,並引入到 OSPF 區域內
R4(config)#ip route 0.0.0.0 0.0.0.0 46.1.1.5
R4(config)#router ospf 100
R4(config-router)#default-information originate
# 加入 always 表示無論是否自身有預設路由,都會想 OSPF 域內下發
```
## 被動介面
當一些路由器連線的是交換機介面時,這時傳送 OSPF 報文給交換機是沒有意義的,所以一般會將和交換機連線的介面設定成被動介面。
```
R1(config)#router ospf 100
R1(config-router)#passive-interface ethernet 0/1
```
## OSPFV3 配置
```
ipv6 router ospf 100
router-id 1.1.1.1
int e 0/0
ipv6 ospf 100 are3
```
## SPF 演算法
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141259756-1515269570.png)
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141314046-642880905.png)
cost = 10^8 / 10mbps = 10
cost = 10^8 / 100mbps = 1
cost = 10^8 / 1000mbps = 0.1
但由於只能是整數,所以千兆鏈路也是 1 所以無法區分百兆和千兆鏈路。這裡可以採用修改標準比如將 十兆頻寬的標準修改為 10^9 ,但需要注意的是,在所有的鏈路都要修改
## 排錯
1. 檢查直連連通性
2. 檢視鄰居表是否正常建立
1. router-id 唯一(`show ip protocols`)
2. 鏈路兩端 Area 號不一致(`show run | s router ospf`, `show run interface x`)
3. 認證方式是否匹配
4. Hello 報文 Dead 計時器設定不一致
1. Broadcast,P2P: Hello 10s, Dead 20s;
2. NBMA,P2MP,P2MP-NB: Hello 30s, Dead:120s
5. 廣播型網路,介面掩碼是否一致
6. DBD mtu 設定不一致(卡到 ExStart 狀態)
1. 配置相同 MTU
2. 在小的 MTU 端配置,忽略 MTU(ip ospf mtu-ignore)
7. Hello包:特殊區域標識位不一致
8. Hello 包: 優先順序相同(都為 0 無法建立連線)
3. 檢視是否有路由
1. 對應網路是否通告
2. 是否配置路由過濾
## OSPF 配置
### 實驗1:模擬特殊區域情況。
在 R1 和 R5 配置去往 6.6.6.6 / 24 的預設路由,但在 R6 是通過重分佈引入 OSPF,開銷計算為 Type1.
而 R1 所在區域模擬效能不好的情況,配置為特殊區域.
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141353287-1086361644.png)
在 R5 上配置到 6.6.6.6 網路的預設路由,並設定開銷計算為 Type1:
```
# R5 - 配置靜態路由
ip route 6.6.6.0 255.255.255.0 56.1.1.6
# 重分佈到 OSPF
router ospf 100
redistribute static metric-type 1
# 在 R1 上檢視 metric:
型別為 E1,並且 Metric 為 60:乙太網口預設為 10 mbps = 10^8/ 10^7=10, 所以內部開銷為 10 + 10 + 10 + 10 + 40.
對於思科裝置來說,外部開銷預設為 20,所以加起來一共 60.
```
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141409273-1775485669.png)
將 Area1 配置 Stub 區域 - ABR 不傳播自治系統外的路由:
```
# R1 配置 stub 區域,
Router1(config-router)#area 1 stub
# R2 配置 stub 區域
Router2(config-router)#area 1 stub
可以發現,之前去往 6.6.6.6 的外部路由已經沒有了,多了一條 O*IA 的預設路由
```
> 需要將 stub 區域中的路由器都配置成 stub,否則會因為 Hello 中無法匹配 Stub 標識,導致無法連線鄰居。
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141424138-1014797916.png)
並且在 R1 檢視資料庫:可以發現,無法區域外部路由已經沒有了。
```
Router#show ip ospf database
OSPF Router with ID (1.1.1.1) (Process ID 100)
Router Link States (Area 1)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 1329 0x80000008 0x007786 1
2.2.2.2 2.2.2.2 1324 0x80000009 0x003AB8 1
Net Link States (Area 1)
Link ID ADV Router Age Seq# Checksum
12.1.1.2 2.2.2.2 1324 0x80000005 0x0028EB
Summary Net Link States (Area 1)
Link ID ADV Router Age Seq# Checksum
0.0.0.0 2.2.2.2 1324 0x80000002 0x0073C1
23.1.1.0 2.2.2.2 1324 0x80000004 0x00868A
34.1.1.0 2.2.2.2 1324 0x80000004 0x005BA0
45.1.1.0 2.2.2.2 1324 0x80000004 0x0030B6
```
將 Area 區域配置為完全 stub 區域, 連區域間的路由資訊也不要 - 在 ABR 上配置:
```
# 在 ABR R2 配置完全 stub 區域
Router2(config-router)#area 1 stub no-summary
# 在 R1 上檢視,發下區域間的路由也沒有了
Router#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is 12.1.1.2 to network 0.0.0.0
O*IA 0.0.0.0/0 [110/11] via 12.1.1.2, 00:00:02, Ethernet0/0
1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 1.1.1.0/24 is directly connected, Loopback0
L 1.1.1.1/32 is directly connected, Loopback0
12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 12.1.1.0/24 is directly connected, Ethernet0/0
L 12.1.1.1/32 is directly connected, Ethernet0/0
Router#show ip ospf database
OSPF Router with ID (1.1.1.1) (Process ID 100)
Router Link States (Area 1)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 1666 0x80000008 0x007786 1
2.2.2.2 2.2.2.2 1661 0x80000009 0x003AB8 1
Net Link States (Area 1)
Link ID ADV Router Age Seq# Checksum
12.1.1.2 2.2.2.2 1661 0x80000005 0x0028EB
Summary Net Link States (Area 1)
Link ID ADV Router Age Seq# Checksum
0.0.0.0 2.2.2.2 7 0x80000004 0x006FC3
```
將 Area 區域配置為NSSA 區域, 不要區域外部路由,但允許本區域內配置外部路由 :
```
# R1 配置 nssa 區域,
Router1(config-router)#area 1 nssa
# R2 配置 nssa 區域
Router2(config-router)#area 1 nssa
# 在 R6 上配置 7.7.7.7/24 的迴環口 Lo 2
# 在 R1 配置到 6.6.6.6 的靜態路由
Router1(config)#ip route 7.7.7.0 255.255.255.0 16.1.1.6
# 重分佈 static
Router1(config-router)#redistribute static
# 此時 R1 作為 ABR 連線了外部路由器
# 檢視 R2 路由資訊,多出了去往 7.0 網路的路由:
Router#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is not set
2.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 2.2.2.0/24 is directly connected, Loopback0
L 2.2.2.2/32 is directly connected, Loopback0
6.0.0.0/24 is subnetted, 1 subnets
O E1 6.6.6.0 [110/50] via 23.1.1.2, 00:08:38, Ethernet0/1
7.0.0.0/24 is subnetted, 1 subnets
O N2 7.7.7.0 [110/20] via 12.1.1.1, 00:04:32, Ethernet0/0
12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 12.1.1.0/24 is directly connected, Ethernet0/0
L 12.1.1.2/32 is directly connected, Ethernet0/0
23.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 23.1.1.0/24 is directly connected, Ethernet0/1
L 23.1.1.1/32 is directly connected, Ethernet0/1
34.0.0.0/24 is subnetted, 1 subnets
O 34.1.1.0 [110/20] via 23.1.1.2, 00:08:38, Ethernet0/1
45.0.0.0/24 is subnetted, 1 subnets
O IA 45.1.1.0 [110/30] via 23.1.1.2, 00:08:38, Ethernet0/1
# 在 R2 需要手動配置,為其他裝置新增預設路由資訊:
Router2(config-router)#area 1 nssa default-information-originate
# 在 R1 檢視路由,多了一條預設路由,注意下發的是 7 類預設路由
Router#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is 12.1.1.2 to network 0.0.0.0
O*N2 0.0.0.0/0 [110/1] via 12.1.1.2, 00:00:18, Ethernet0/0
1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 1.1.1.0/24 is directly connected, Loopback0
L 1.1.1.1/32 is directly connected, Loopback0
7.0.0.0/24 is subnetted, 1 subnets
S 7.7.7.0 [1/0] via 16.1.1.6
12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 12.1.1.0/24 is directly connected, Ethernet0/0
L 12.1.1.1/32 is directly connected, Ethernet0/0
16.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 16.1.1.0/24 is directly connected, Ethernet0/1
L 16.1.1.1/32 is directly connected, Ethernet0/1
23.0.0.0/24 is subnetted, 1 subnets
O IA 23.1.1.0 [110/20] via 12.1.1.2, 00:21:19, Ethernet0/0
34.0.0.0/24 is subnetted, 1 subnets
O IA 34.1.1.0 [110/30] via 12.1.1.2, 00:21:19, Ethernet0/0
```
將 Area 區域配置為完全 NSSA 區域, 不要區域外部路由,但允許本區域內配置外部路由 :
```
# 在 R2 開啟
Router2(config-router)#area 1 nssa no-summary
# 在 R1 檢視路由,發現區域間路由沒有了
Router1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
a - application route
+ - replicated route, % - next hop override, p - overrides from PfR
Gateway of last resort is 12.1.1.2 to network 0.0.0.0
O*IA 0.0.0.0/0 [110/11] via 12.1.1.2, 00:00:09, Ethernet0/0
1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 1.1.1.0/24 is directly connected, Loopback0
L 1.1.1.1/32 is directly connected, Loopback0
7.0.0.0/24 is subnetted, 1 subnets
S 7.7.7.0 [1/0] via 16.1.1.6
12.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 12.1.1.0/24 is directly connected, Ethernet0/0
L 12.1.1.1/32 is directly connected, Ethernet0/0
16.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 16.1.1.0/24 is directly connected, Ethernet0/1
L 16.1.1.1/32 is directly connected, Ethernet0/1
```
注意此時預設路由變成了 OIA 原因在於,執行 no-summary 會產生一條3類LSA 0.0.0.0 的預設路由,會優先選擇該路由。
```
Router#show ip ospf database
OSPF Router with ID (1.1.1.1) (Process ID 100)
Router Link States (Area 1)
Link ID ADV Router Age Seq# Checksum Link count
1.1.1.1 1.1.1.1 198 0x80000014 0x00ECFA 1
2.2.2.2 2.2.2.2 15 0x80000019 0x00A731 1
Net Link States (Area 1)
Link ID ADV Router Age Seq# Checksum
12.1.1.2 2.2.2.2 525 0x80000004 0x00B15B
Summary Net Link States (Area 1)
Link ID ADV Router Age Seq# Checksum
0.0.0.0 2.2.2.2 16 0x80000001 0x00FC31
Type-7 AS External Link States (Area 1)
Link ID ADV Router Age Seq# Checksum Tag
0.0.0.0 2.2.2.2 1118 0x80000001 0x00D0D8 0
7.7.7.0 1.1.1.1 1616 0x80000001 0x00E38A 0
```![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141303564-1974515645.png)
![](https://img2020.cnblogs.com/blog/1861307/202009/1861307-20200909141307078-945760716.png)