開放最短路徑優先(OSPF)路由協定由RFC 2328 OSPF版本2定義 。本白皮書的目標是提供一種程式框架,使組織能夠實施配置管理程式,以根據OSPF設計計畫驗證OSPF部署,並定期稽核OSPF部署以確保與預期設計長期一致。
本文重點介紹ITU-T定義的FCAPS(故障、配置、記帳/庫存、效能、安全)模型中的配置管理功能。配置管理由ITU-T M.3400定義,提供控制、識別、收集資料以及向NE(網元)提供資料的功能。
本檔案所提供的資料分為以下幾個主要部分。
OSPF Background部分提供了OSPF的技術概述,包括有關OSPF部署重要方面的背景資訊。
進程定義部分概述了用於完成OSPF配置管理的進程定義。進程詳細資訊按照目標、績效指標、輸入、輸出和單個任務進行描述。
任務定義部分提供了詳細的流程任務定義。每個任務都按照目標、任務輸入、任務輸出、完成任務所需的資源以及任務實施者所需的作業技能進行描述。
資料標識部分描述了OSPF的資料標識。資料標識考慮資訊的來源或所在位置。例如,資訊由系統包含在簡單網路管理協定(SNMP)管理資訊庫(MIB)、系統日誌生成的日誌檔案或只能通過命令列介面(CLI)訪問的內部資料結構中。
本文檔的資料收集部分描述了OSPF資料的收集。資料的收集與資料的位置密切相關。例如,SNMP MIB資料是由多個機制(例如陷阱、遠端監控(RMON)警報和事件或輪詢)收集的。由內部資料結構維護的資料由自動指令碼收集或由使用者手動登入到系統以發出CLI命令,然後記錄輸出來收集。
Data Presentation部分提供了資料如何以報告格式表示的示例。在識別和收集資料之後,對其進行分析。本文提供可用於記錄和比較OSPF配置資料的示例報告。
Commercial and Public Internet Monitoring Tools、SNMP Polling Data和Example Data Collection Algorithms部分提供了有關開發工具以實施OSPF配置管理過程的資訊。
OSPF是一種內部網關協定,設計用於在單個自治系統內使用。與路由協定(如路由資訊協定(RIP))中的距離向量技術或貝爾曼 — 福特技術相比,OSPF使用基於鏈路狀態或最短路徑優先(SPF)的技術。 單個鏈路狀態通告(LSA)描述OSPF路由域的部分,例如整個自治系統。這些LSA在整個路由域中泛洪,形成鏈路狀態資料庫。域中的每個路由器都具有相同的鏈路狀態資料庫。使用可靠的泛洪演算法來維護鏈路狀態資料庫的同步。在鏈路狀態資料庫中,每台路由器通過計算最短路徑樹來構建路由表,該樹的根是計算路由器本身。此計算通常稱為Dijkstra演算法。
LSA很小,每個LSA都描述OSPF路由域的一小部分,具體來說,是單個路由器的鄰居、單個傳輸網路的鄰居、單個區域間路由或單個外部路由。
下表定義了OSPF的主要功能:
功能 | 說明 |
---|---|
鄰接關係 | 當成對OSPF路由器相鄰時,兩台路由器通過以OSPF資料庫交換資料包的形式交換資料庫摘要來同步其鏈路狀態資料庫。然後,相鄰路由器通過可靠的泛洪演算法保持其鏈路狀態資料庫的同步。通過串列線路連線的路由器總是會相鄰。在多路訪問網路(Ethernet)上,連線到網路的所有路由器都變得與指定路由器(DR)和備用指定路由器(BDR)相鄰。 |
指定路由器 | 當在所有多路訪問網路中選擇DR時,它會建立網路LSA來描述網路的本地環境。它在泛洪演算法中也扮演特殊角色,因為網路上的所有路由器都通過在泛洪過程中向DR傳送和接收LSA來同步其鏈路狀態資料庫。 |
備用指定路由器 | 當當前的DR消失時,在多路訪問網路上選擇BDR以加快DR的過渡。BDR接管時,無需在區域網(LAN)上經歷鄰接過程。 BDR還能夠在發現DR消失之前在DR不存在的情況下進行可靠的泛洪演算法。 |
非廣播多路訪問網路支援 | OSPF將幀中繼公共資料網路(PDN)等網路視為區域網。但是,連線到這些網路的路由器需要其他配置資訊才能在開始時找到彼此。 |
OSPF配置管理區域 | OSPF允許將自治系統分成多個區域。這樣可提供額外的路由保護,從而保護區域內的路由不受該區域外部的所有資訊的影響。此外,通過將自治系統分成區域,降低了Dijkstra過程在CPU週期方面的成本。 |
虛擬鏈路 | 通過允許配置虛擬鏈路,OSPF消除了自治系統中區域佈局的拓撲限制。 |
路由協定交換的身份驗證 | 每次OSPF路由器收到路由協定資料包時,它可以選擇先對資料包進行身份驗證,然後再進一步處理。 |
靈活路由度量 | 在OSPF中,度量分配給出站路由器介面。路徑的開銷是路徑的元件介面的總和。預設情況下,路由度量是從鏈路的頻寬派生的。系統管理員可以指定它來指示網路特性(如延遲、頻寬和成本)的任意組合。 |
等價多路徑 | 當存在多條到達目的地的最佳開銷路由時,OSPF會發現並使用它們將共用流量載入到目的地。 |
可變長子網支援 | 通過在每個通告的目的地中攜帶網路掩碼,支援可變長子網掩碼。 |
末節區域支援 | 為了支援記憶體不足的路由器,可以將區域配置為末節。外部LSA不會泛洪到末節區域中或整個末節區域中。在末節區域中路由到外部目的地僅基於預設值。 |
流程定義是指座席為滿足目的或實現目標而執行的一系列相關操作、活動和更改。
過程控制是規劃和調整的過程,其目標是以有效和高效的方式執行過程。
下圖以圖形方式顯示。
流程的輸出必須符合由組織定義的基於業務目標的操作規範。如果流程符合一組規範,則該流程被認為是有效的,因為它可以重複、衡量、管理,並且有助於實現業務目標。如果以最小的努力開展活動,那麼這一程式也被認為有效。
流程跨越各種組織邊界。因此,必須有一個單獨的進程所有者負責該進程的定義。所有者是確定和報告流程是否有效和高效的焦點。如果流程不能有效或高效,則流程所有者將推動流程的修改。流程的修改由變更控制和審閱流程控制。
制定流程目標以設定流程定義的方向和範圍。目標還用於定義用於衡量流程有效性的指標。
此過程的目標是提供一個框架,以根據預期設計驗證OSPF實施的部署配置,並提供一個機制定期稽核OSPF部署,以確保與預期設計相關的一段時間內的一致性。
過程績效指標用於衡量過程定義的有效性。業績指標應是可計量的、可量化的。下列績效指標為數字指標或按時間衡量。OSPF配置管理進程的效能指示符定義如下:
在整個流程中循環所需的時間長度。
需要執行頻率,以便主動檢測OSPF問題以免它們影響使用者。
與進程執行相關聯的網路負載。
該進程建議的更正運算元。
作為該過程結果實施的糾正措施的數目。
實施糾正措施所需的時間長度。
實施糾正措施所需的時間長度。
糾正操作的積壓。
停機時間歸因於OSPF相關問題。
種子檔案中新增、刪除或修改的專案數。這是準確性和穩定性的一個指標。
流程輸入用於定義流程的標準和前提條件。很多情況下,識別進程輸入可以提供外部依賴性的資訊。下面提供了與OSPF配置管理相關的輸入清單。
OSPF設計文檔
SNMP輪詢收集的OSPF MIB資料
系統日誌資訊
過程輸出定義如下:
本文資料演示部分中定義的OSPF配置報告
OSPF配置建議用於要執行的糾正操作
以下各節定義與OSPF配置管理關聯的初始化和迭代任務。
初始化任務在執行流程期間執行一次,不應在流程的每次迭代中執行。
在驗證前提任務時,如果確定任何一項任務未實施或未提供足夠資訊以有效滿足此過程的需要,則此事實應由流程所有者記錄並提交管理層。下表概述了先決條件初始化任務。
必備任務 | 說明 |
---|---|
任務目標和投入 |
|
任務輸出 | 任務輸出是關於前提任務條件的狀態報告。如果認為任何支援任務無效,流程所有者應提交請求以更新支援流程。如果無法更新支援流程,請對此流程的影響進行評估。 |
任務角色 | 網路工程師技能集 |
OSPF配置管理過程需要使用種子檔案來消除網路發現功能的需要。種子檔案記錄由OSPF進程管理的路由器集,還用作協調組織中變更管理進程的焦點。例如,如果將新節點輸入網路,則需要將其新增到OSPF種子檔案中。如果由於安全要求而對SNMP社群名稱進行了更改,這些修改需要在種子檔案中反映出來。下表概述了建立種子檔案的過程。
流程 | 說明 |
---|---|
任務目標 | 建立用於初始化OSPF配置管理軟體的種子檔案。種子檔案的格式取決於用於實施OSPF配置管理過程的資源。如果開發自定義指令碼,則種子檔案的格式由軟體設計定義。如果使用網路管理系統(NMS),則種子檔案的格式由NMS文檔定義。 |
任務輸入 |
|
任務輸出 | OSPF配置管理進程的種子檔案。 |
任務資源 |
|
任務角色 |
|
在過程的每一次迭代中執行迭代任務,並且確定和修改其頻率以便改進效能指標。
種子檔案對於有效實施OSPF配置管理流程至關重要。因此,必須主動管理種子檔案的當前狀態。影響種子檔案內容的網路更改需要由OSPF配置管理進程所有者跟蹤。
流程 | 說明 |
---|---|
任務目標 |
|
任務輸入 |
|
任務輸出 |
|
任務資源 |
|
任務角色 |
|
執行OSPF掃描的兩個步驟是:
正在收集資料。
分析資料。
根據使用過程的方式,這兩個步驟的頻率會有所不同。例如,此過程可用於驗證安裝修改。在這種情況下,資料收集在變更之前和之後運行,資料分析在變更之後執行,以確定變更是否成功。
如果使用此過程驗證OSPF配置管理設計記錄,則資料收集和分析頻率取決於網路中的變化率。例如,如果網路發生大量更改,則設計驗證每週執行一次。如果網路變化很小,則設計驗證每月不超過一次。
OSPF配置管理報告的格式取決於用於實施OSPF配置管理過程的資源。下表提供了建議的自定義開發的報告格式。
報告 | 格式 |
---|---|
任務輸入 | 有關OSPF配置管理報告,請參閱本文檔中的資料演示部分。 |
任務輸出 | 如果在掃描報告和邏輯設計記錄之間發現問題,則必須決定哪個項是正確的,哪個項是不正確的。應更正錯誤的專案。這可能包括修改設計記錄或網路變更單。 |
任務資源 |
|
任務角色 |
|
下表描述了可以應用於OSPF配置管理的資料。
資料 | 說明 |
---|---|
OSPF區域 | 描述路由器連線區域的資訊包括:
|
OSPF介面 | 從OSPF的角度描述一個介面,例如:
|
OSPF鄰居狀態 | 描述OSPF鄰居。
|
Cisco目前支援RFC 1253 OSPF第2版MIB 。RFC 1253不包含OSPF的SNMP陷阱定義。OSPF MIB的最新版本為RFC 1850 OSPF版本2 。SNMP陷阱在RFC 1850中為OSPF定義。思科的OSPF MIB實施不支援RFC 1850。
有關詳細資訊,請參閱本文檔的SNMP輪詢資料部分。
請參閱思科網路管理軟體頁面,以明確列出哪些平台和代碼版本支援的MIB。
此過程不需要RMON特定資料。
通常,系統日誌會為不同的技術生成特定於服務的消息。雖然系統日誌資訊更適合故障和效能管理,但此處提供的資訊是參考。有關Cisco裝置生成的OSPF系統日誌資訊的示例,請參閱OSPF錯誤消息。
有關按設施列出的系統消息的完整清單,請參閱消息和恢復過程。
在此版本的OSPF配置管理過程中,不需要CLI資料。
下表定義了SNMP資料收集的不同元件。
SNMP資料元件 | 定義 |
---|---|
常規SNMP配置 | 有關SNMP配置最佳實踐的一般資訊,請參閱配置SNMP。 |
服務特定的SNMP配置 | 此過程不需要服務特定的SNMP配置。 |
SNMP MIB要求 | 請參閱上面的資料標識部分。 |
SNMP MIB輪詢集合 | SNMP輪詢資料由商業系統(如hp OpenView)或自定義指令碼收集 。有關收集演算法的進一步討論,請參閱本文檔的示例資料收集演算法部分。 |
SNMP MIB陷阱收集 | Cisco裝置上支援的OSPF MIB的當前版本不支援SNMP陷阱。此過程不需要SNMP陷阱。 |
此版本的過程不需要RMON配置和資料。
常規系統日誌配置准則不在本文檔的討論範圍之內。有關詳細資訊,請參閱使用單個內部網路配置和故障排除Cisco Secure PIX防火牆。
通過使用以下命令配置OSPF路由器以使用syslog消息記錄鄰居更改,從而滿足OSPF特定要求:
OSPF_ROUTER(config)# ospf log-adj-changes
通常,Cisco IOS CLI提供對NE包含的原始資訊的最直接訪問。但是,CLI訪問更適合於故障排除過程和變更管理活動,而不是此過程定義的全域性配置管理。通過CLI進行訪問不會針對大型網路的管理進行擴展。在這些情況下,需要自動訪問資訊。
在此版本的OSPF配置管理過程中,不需要CLI配置和資料。
以下是OSPF區域報告的示例格式。報告的格式取決於商業NMS的功能(如果使用了)或自定義指令碼的設計輸出。
區域 | 資料欄位 | 上次運行 | 此運行 |
---|---|---|---|
區域ID #1 | 驗證 | ||
SPF運行 | |||
ABR計數 | |||
ASBR計數 | |||
LSA計數 | |||
LSA校驗和 | |||
地址錯誤 | |||
路由丟棄 | |||
找不到路由 | |||
區域ID #n | 驗證 | ||
SPF運行 | |||
ABR計數 | |||
ASBR計數 | |||
LSA計數 | |||
LSA校驗和 | |||
地址錯誤 | |||
路由丟棄 | |||
找不到路由 |
以下是OSPF介面報告的示例格式。在實踐中,報告的格式取決於商業NMS的功能(如果使用了NMS)或定製指令碼的設計輸出。
區域 | 裝置 | 介面 | 資料欄位 | 上次運行 | 此運行 |
---|---|---|---|---|---|
區域ID #1 | 節點ID #1 | 介面ID設#1 | IP 位址 | ||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 | |||||
介面ID設#n | IP 位址 | ||||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 | |||||
節點ID #n | 介面ID設#1 | IP 位址 | |||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 | |||||
介面ID設#n | IP 位址 | ||||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 | |||||
區域ID #n | 節點ID #1 | 介面ID設#1 | IP 位址 | ||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 | |||||
介面ID設#n | IP 位址 | ||||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 | |||||
節點ID #n | 介面ID設#1 | IP 位址 | |||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 | |||||
介面ID設#n | IP 位址 | ||||
區域ID | |||||
管理狀態 | |||||
OSPF狀態 | |||||
指標/成本/計時器 |
以下是OSPF鄰居報告的示例格式。在實踐中,報告的格式取決於商業NMS的功能(如果使用了NMS)或定製指令碼的設計輸出。
區域 | 裝置 | 鄰居 | 資料欄位 | 上次運行 | 此運行 |
---|---|---|---|---|---|
區域ID #1 | 節點ID #1 | 鄰居ID #1 | 路由器ID | ||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 | |||||
鄰居ID #n | 路由器ID | ||||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 | |||||
節點ID #n | 鄰居ID #1 | 路由器ID | |||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 | |||||
鄰居ID #n | 路由器ID | ||||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 | |||||
區域ID #n | 節點ID #1 | 鄰居ID #1 | 路由器ID | ||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 | |||||
鄰居ID #n | 路由器ID | ||||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 | |||||
節點ID #n | 鄰居ID #1 | 路由器ID | |||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 | |||||
鄰居ID #n | 路由器ID | ||||
路由器IP地址 | |||||
狀態 | |||||
活動 | |||||
雷特拉斯克 |
有商業工具可以協助收集和處理系統日誌資訊以及收集一般SNMP MIB變數的輪詢。
據知沒有商業或公共Internet監控工具支援此過程定義的OSPF配置管理。因此,需要本地自定義指令碼和過程。
對象名稱 | 對象描述 |
---|---|
ipRouteDest | 路由的目標IP地址。值為0.0.0.0的條目被視為預設路由。表中可顯示到達單個目的地的多條路由,但是對此類多條目的項的訪問取決於使用的網路管理協定定義的表訪問機制。::= { ipRouteEntry 1 }對象識別符號= 1.3.6.1.2.1.4.21.1.1 |
ipRouteMask | 指示在將掩碼與ipRouteDest欄位中的值進行比較之前與目標地址進行邏輯運算的掩碼。對於不支援任意子網掩碼的系統,代理可通過使用以下掩碼網路之一確定相應的ipRouteDest欄位的值是否屬於A類、B類或C類網路來構建ipRouteMask的值:
注意:所有IP路由子系統都隱式使用此機制。 ::= { ipRouteEntry 11 }對象識別符號= 1.3.6.1.2.1.4.21.1.11 |
ipRouteNextHop | 該路由下一跳的IP地址。如果路由繫結到使用廣播媒體實現的介面,則此欄位的值是代理在介面上的IP地址。::= { ipRouteEntry 7 }對象識別符號= 1.3.6.1.2.1.4.21.1.7 |
ipRouteIfIndex | 唯一標識到達路由下一跳的本地介面的索引值。此介面與IfIndex值所標識的介面相同。::= { ipRouteEntry 2 }對象識別符號= 1.3.6.1.2.1.4.21.1.2 |
對象名稱 | 對象描述 |
---|---|
ipAdEntIfIndex | 唯一標識適用於條目的介面的索引值。此介面與IfIndex值所標識的介面相同。::= { ipAddrEntry 2 }對象識別符號= 1.3.6.1.2.1.4.20.1.2 |
ipInAddrErrors | 由於IP報頭中的IP地址是實體的無效目標欄位而丟棄的輸入資料包數。此計數包括無效地址(0.0.0.0)和不支援的類地址(E類)。 對於不是IP網關且沒有轉發資料包的實體,計數器包括因為目標地址不是本地地址而丟棄的資料包。{ ip 5 } object identifier = 1.3.6.1.2.1.4.5 |
ipRoutingDiscards | 丟棄的有效路由條目數。丟棄此類條目的一個可能原因是為其他路由條目釋放了緩衝區空間。{ ip 23 } object identifier = 1.3.6.1.2.1.4.23 |
ipOutNoRoutes | 由於找不到將資料包傳輸到目的地的路由而丟棄的IP資料包數。{ ip 12 } object identifier = 1.3.6.1.2.1.4.12 |
對象名稱 | 對象描述 |
---|---|
ospfAreaID | 唯一標識區域的32位整數。區域ID 0.0.0.0用於OSPF主幹。::= { ospfAreaEntry 1 }對象識別符號= 1.3.6.1.2.1.14.2.1.1 |
ospfAuthType | 為此區域指定的身份驗證型別。其他身份驗證型別可以按區域本地分配。預設值為0. ::= { ospfAreaEntry 2 } object identifier = 1.3.6.1.2.1.14.2.1.2 |
OspfSpfRuns | 使用此區域的鏈路狀態資料庫計算區域內路由表的次數。對象識別符號= 1.3.6.1.2.1.14.2.1.4 |
ospfAreaBdrRtrCount | 此區域內可訪問的ABR總數。該值最初為預設值0,並在每個SPF通道中計算。::= { ospfAreaEntry 5 }對象識別符號= 1.3.6.1.2.1.14.2.1.5 |
ospfASBdrRtrCount | 此區域內可訪問的ABSR總數。初始值為0(預設值),並在每個SPF通道中計算。::= { ospfAreaEntry 6 }對象識別符號= 1.3.6.1.2.1.14.2.1.6 |
ospfAreaLSACount | 區域鏈路狀態資料庫中的LSA總數(不包括外部LSA)。預設值為0。 ::= { ospfAreaEntry 7 } object identifier = 1.3.6.1.2.1.14.2.1.7 |
ospfAreaLSACksumSum | 區域鏈路狀態資料庫中包含的LSA LS校驗和的32位無符號和。此總數不包括外部(LS型別5)LSA。總和可用於確定路由器的鏈路狀態資料庫是否有變化,並比較兩台路由器的鏈路狀態資料庫。預設值為0. ::= { ospfAreaEntry 8 } object identifier = 1.3.6.1.2.1.14.2.1.8 |
對象名稱 | 對象描述 |
---|---|
OspfIfIpAddress | OSPF介面的IP地址。對象識別符號= 1.3.6.1.2.1.14.7.1.1 |
OspfIfEvents | OSPF介面改變其狀態或發生錯誤的次數。對象識別符號= 1.3.6.1.2.1.14.7.1.15 |
OspfIfState | OSPF介面狀態。對象識別符號= 1.3.6.1.2.1.14.7.1.12 |
對象名稱 | 對象描述 |
---|---|
OspfNbrIpAddr | 此鄰居的IP地址。::= { ospfNbrEntry 1 }對象識別符號= 1.3.6.1.2.1.14.10.1.1 |
ospfNbrAddressLessIndex | 在沒有IP地址的索引上,Internet標準MIB中IfIndex的對應值。在建立行時,可以從例項中匯出該屬性。::= { ospfNbrEntry 2 }對象識別符號= 1.3.6.1.2.1.14.10.1.2 |
ospfNbrRtrId | 32位整數,表示為IpAddress,唯一標識自治系統中的相鄰路由器。預設值為0.0.0.0。 ::= { ospfNbrEntry 3 } object identifier = 1.3.6.1.2.1.14.10.1.3 |
ospfNbrState | 與鄰居的關係狀態。這些狀態包括:
|
ospfNbrEvents | 鄰居關係更改狀態或發生錯誤的次數。預設值為0。 ::= { ospfNbrEntry 7 } object identifier = 1.3.6.1.2.1.14.10.1.7 |
ospfNbrLSRetranQLen | 重新傳輸隊列的當前長度。預設值為0。 ::= { ospfNbrEntry 8 } object identifier = 1.3.6.1.2.1.14.10.1.8 |
在本文的研究過程中,開發了一個原型C程式。該程式名為oscan,使用Microsoft Developer Studio 97和Visual C++ 5.0進行編寫。有兩個特定的庫提供SNMP函式應用程式程式設計介面(API)。 這些庫是snmpapi.lib和mgmpapi.lib
Microsoft API提供的函式分為三個主要類別並列於下表。
代理功能 | 管理員功能 | 實用程式函式 |
---|---|---|
SnmpExtensionInit SnmpExtensionInitEx SnmpExtensionQuery SnmpExtensionTrap | SnmpMgrClose SnmpMgrGetTrap SnmpMgrOidToStr SnmpMgrOpen SnmpMgrRequest SnmpMgrStrToOid SnmpMgrTrapListen | SnmpUtilMemAlloc SnmpUtilMemFree SnmpUtilMemReAlloc SnmpUtilOidAppend SnmpUtilOidCmp SnmpUtilOidCpy SnmpUtilFree SnmpUtilOidNCmp SnmpUtilPrintAsnAny SnmpUtilVarBindCpy SnmpUtilVarBindSnmpCpy UtilVarBindFree SnmpUtilVarBindListFree |
oscan原型代碼用下面列出的一組附加函式封裝了Microsoft API。
snmpWalkStrOid
snmpWalkAsnOid
snmpWalkVarBind
snmpWalkVarBindList
這些函式提供通用API,允許訪問用於維護OSPF配置資料的各種SNMP MIB表。將要訪問的表的對象識別符號(OID)與表特定的回撥函式一起傳遞到oscan API。回撥函式具有對從表中返回的資料執行操作的智慧。
第一個任務是構建將成為oscan程式目標的節點的清單。為了避免「裝置發現」問題,需要用種子檔案來標識要掃描的節點。種子檔案提供IP地址和SNMP只讀社群字串等資訊。
oscan程式需要維護多個內部資料結構,以儲存從路由器收集的SNMP資訊。通常,對於收集的每個SNMP MIB表都有一個內部資料結構。
Main load node array based on information in the seed file. while more entries in the node array start SNMP session for this node collect IP route table for this node collect OSPF area table for this node collect OSPF Neighbor table for this node collect sysName for this node collect OSPF Interface table for this node end SNMP session for this node end while
使用SNMP訪問IP路由表時必須小心,因為在此操作期間路由器的CPU過載非常簡單。因此,oscan程式利用使用者可配置的延遲引數。引數提供每個SNMP請求之間的延遲。對於大型環境,這意味著收集資訊的總時間可能非常長。
路由表包含四個對oscan感興趣的資訊:
ipRouteDest
ipRouteMask
ipRouteNextHop
ipRouteIfIndex
路由表由ipRouteDest索引。因此,從SNMP get-request返回的每個對象都將ipRouteDest附加到OID。
對象ipRouteIfIndex是索引到IP地址表(ipAddrTable)中的整數。 ipAddrTable使用ipAdEntAddr對象(介面的IP地址)進行索引。 要獲取介面的IP地址,需要四個步驟:
從路由表中收集ipRouteIfIndex。
使用ipRouteIfIndex進行模式匹配訪問ipAddrTable。
找到模式後,將OID轉換為字串,並收集最後四個點分十進位制欄位(將成為介面的IP地址)。
將介面的IP地址儲存回IP路由表中。
訪問IP路由表的一般演算法如下所示。此時,僅儲存ipRouteIfIndex的整數值。在此過程稍後的階段,收集介面資訊時會訪問ipAddrTable並收集剩餘資訊並將其放入內部IP路由表中。
OID List = ipRouteDestOID, ipRouteMaskOID, ipRouteNextHopOID, ipRouteIfIndexOID; For each object returned by SNMP route table walk Sleep // user configurable polling delay. check varbind oid against OID list if OID is ipRouteDestOID add new entry in the internal route table array if OID is one of the others search internal route array for matching index value store information in array
所收集的資訊以類似於下面路由器CLI中常見輸出的表表示。
ROUTE TABLE ********************************************************** Destination Mask GW Interface 10.10.10.4 255.255.255.252 10.10.10.5 10.10.10.5 10.10.10.16 255.255.255.252 10.10.10.6 10.10.10.5 10.10.10.24 255.255.255.252 10.10.10.25 10.10.10.25 10.10.10.28 255.255.255.252 10.10.11.2 10.10.11.1 10.10.10.36 255.255.255.252 10.10.10.6 10.10.10.5 10.10.11.0 255.255.255.0 10.10.11.1 10.10.11.1 10.10.13.0 255.255.255.0 10.10.11.2 10.10.11.1
通過掃描OSPF區域表(ospfAreaTable)並在資料返回時對其進行處理,從OSPF區域表收集資訊。ospfAreaTable的索引是ospfAreaId。ospfAreaId以與IP地址相同的點分十進位制格式儲存。因此,在這裡可以重複使用那些用來處理和搜尋ipRouteTable和ipRouteIfIndex的子常式。
本節包含幾個實際上不在OSPF區域表中的資料項。例如,ipInAddrErrors、IpRoutingDiscards和ipOutNoRoute對象在MIB-2定義中,但不與OSPF區域關聯。這些對象與路由器相關聯。因此,通過將區域中的每個節點的值新增到區域計數器,這些計數器可用作區域度量。例如,在OSPF區域報告中,由於找不到路由而丟棄的資料包數量實際上是該區域中所有路由器丟棄的資料包的總和。這是一個高級度量,提供區域路由運行狀況的常規檢視。
OID List = ipInAddrErrorsOID, ipRoutingDiscardsOID, ipOutNoRouteOID, areaIdOID, authTypeOID, spfRunsOID, abrCountOID, asbrCountOID, lsaCountOID, lsaCksumSumOID; For object returned from the SNMP walk of the Area Table Sleep // user configurable polling delay. check varbind oid against OID list. if OID is ospfAreaId add new entry in the internal route table array if OID one of the others search internal array for matching index value store information in array end of for loop get ipInAddrErrors, ipRoutingDiscards, ipOutNoRoute add values to overall Area counters
收集的資訊在下面的ASCII表中表示。
AREAS ********************************************************** AREA = 0.0.0.0 AREA = 0.0.0.2 authType = 0 authType = 0 spfRuns = 38 spfRuns = 18 abrCount = 2 abrCount = 1 asbrCount = 0 asbrCount = 0 lsaCount = 11 lsaCount = 7 lsaCksumSum = 340985 lsaCksumSum = 319204 ipInAddrErrors = 0 ipInAddrErrors = 0 ipRoutingDiscards = 0 ipRoutingDiscards = 0 ipOutNoRoutes = 0 ipOutNoRoutes = 0
鄰居表的索引是兩個值:
ospfNbrIpAddr - ospfNbrIpAddr是鄰居的IP地址。
ospfNbrAddressLessIndex - ospfNbrAddressLessIndex可以是以下兩個值之一:
對於分配了IP地址的介面,該介面為零。
對於未分配IP地址的介面,它被解釋為來自網際網路標準MIB的IfIndex。
因為索引有兩個值,所以您需要調整之前用於附加在返回OID上的額外資訊的演算法。進行此調整後,可在此處重新使用處理和搜尋ipRouteTable和ipRouteIfIndex所使用的相同子常式。
OID List = ospfNbrIpAddrOID, ospfNbrAddressLessIndexOID, ospfNbrRtrIdOID, ospfNbrStateOID, ospfNbrEventsOID, ospfNbrLSRetransQLenOID, For object returned from the SNMP walk of the Neighbor Table Sleep // user configurable polling delay. check varbind OID against OID list. if OID matches ospfNbrIpAddr add new entry in the internal neighbor table array if OID matches one of the others search array for matching index value store information in array
收集的資訊在下面的ASCII表中表示。
NEIGHBORS ************************************************************ NEIGHBOR #0 NEIGHBOR #1 Nbr Ip Addr = 10.10.10.6 Nbr Ip Addr = 10.10.11.2 Nbr Rtr Id = 10.10.10.17 Nbr Rtr Id = 10.10.10.29 Nbr State = 8 Nbr State = 8 Nbr Events = 6 Nbr Events = 30 Nbr Retrans = 0 Nbr Retrans = 0