SNMP基礎概念


一、什么是SNMP?    

SNMP=Simple Network Management Protocol (簡單網絡管理協議)

SNMP是被廣泛接受並投入使用的工業標准,提供了一個框架來定義管理信息以及用於這些信息交換的協議。它是一個應用層協議,作為TCP/IP協議組的一部分,在UDP(User Datagram Protocol,用戶數據報協議)上操作。它采用輪詢機制,提供最基本的功能集。最適合小型、快速、低價格的環境使用。

SNMP模型假設存在管理者和代理。管理者是管理系統中的軟件模塊,代表網絡管理應用程序和用戶負責管理一部分或全部的配置;代理是被管設備中的軟件模塊,負責維護本地的管理信息,並通過SNMP向管理者傳遞這些信息。管理信息交換可以由管理者引發(通過調查),也可以由代理來引發(通過捕獲)。

SNMP管理的數據包括被管理對象、代理和網絡管理系統(NMS)三個主要組件。被管理設備是網絡節點,包括一個駐留的SNMP代理(Agent);NMS監測並控制被管理設備。

二、SNMP能作什么?

SNMP用於在網絡設備間交換管理信息,保證管理信息在任意兩點中傳送,便於網絡管理員在網絡上的任何節點檢索信息,進行修改,尋找故障;完成故障診斷,容量規划和報告生成,使網絡管理人員能夠管理網絡,發現並解決網絡問題,規划網絡的發展。

三、SNMP的優勢是什么?

1、SNMP協議的最大優勢就是設計簡單,既不需要復雜的實現過程,也不會占用太多的網絡資源,非常便於使用;

2、使用非常廣泛,幾乎所有的網絡管理人員都喜歡使用簡單的SNMP來完成工作操作。這就促使各大網絡硬件產品商在設計和生產網橋、路由器等網絡設備時都加入了對SNMP協議的支持;

3、良好的可擴展性是SNMP協議的另外一個可取之處。因為協議本身非常簡單,所以對協議的任何升級或擴展也非常方便,從而能夠滿足今后網絡的發展需求。

四、SNMP存在什么不足?

1、 SNMP協議存在一些安全漏洞,網絡入侵者很容易獲取正在通過網絡傳遞的各種信息,設置可以關閉某些終端。新版本SNMPv2中增加了一些安全機制,可以有效的解決以下幾種安全性問題:數據的保密性——可以防止網絡入侵者獲取網絡信息;驗證——可以防止網絡入侵者通過網絡發送虛假數據;訪問控制——限制不同用戶可以使用的變量類型,從而避免由於單個用戶的錯誤操作所引發的網絡崩潰;

2、SNMP協議的最大問題還是由於太過簡單而無法處理各種細節信息,無法滿足當今日益膨脹的網絡的發展需要。新版本SNMPv2允許使用更多、更加詳細的變量規范,並且加入了兩種新的PDU可以對方便數據讀取的表數據結構對象進行管理和控制。SNMPv2使協議規范從最初的36頁猛增到416頁,已經喪失了原先的簡單性;

3、SNMPv2仍然只停留在理論階段,SNMPv2的失敗主要應當歸因於開發商不能在關鍵性的問題上達成一致。此外,目前也很難找到能夠全面支持SNMPv2協議各種擴展功能的產品。事實上,SNMP所獲得的空間成功從某種意義上也影響了SNMPv2的進一步發展,無論是SNMPv2還是更高版本的SNMPv3似乎都無法成為SNMP的合格繼承者;

4、由於調查性能的局限,SNMP可能不適合真正大型網絡的管理。使用SNMP,必須發送一個包來獲得一個包的信息,這種類型的調查結果導致大量的路由消息並產生不可能接受的響應時間問題;

5、SNMP並不完全適合接受大量的數據,例如整個路由表;

6、SNMP trap不被確認。在典型的用UDP/IP來遞交消息的情況下,代理不能夠確認關鍵消息是否已經到達管理工作站;

7、基本的SNMP標准只提供了基本的鑒別。因此,基本的SNMP只適合於監視,而不適合於控制;

8、SNMP並不直接支持命令式的命令。在代理引發事件的唯一途徑是通過設定對象的取值間接實現的,這是比某種類型的遠程過程調用更不靈活和無力的方案,遠程過程調用要報告參數、條件、狀態和結果;

9、SNMP MIB模型有局限性,並不容易支持那些真正基於對象的類型和取值來進行復雜查詢的應用程序;

10、SNMP不支持管理站到管理站之間的通信。例如,沒有一種機制允許管理系統知道有另外一套管理系統管理的設備和網絡的情況。

五、什么是SMI?

SMI=Structure of Management Information(管理信息結構)

SMI確定了可用於MIB中的數據類型並說明對象在MIB內部怎樣表示和命名。它只能檢索標量,包括表中的單個條目,不支持復雜數據結構的創建檢索。原因在於MIB內部鼓勵簡單性和可擴展性。

SMI通過定義一個宏OBJECT-TYPE,規定了管理對象的表示方法,從這個意義上說,它是ASN.1的一個子集。

六、什么是MIB?

MIB=Management Information Base(網絡管理信息庫)

MIB是網絡管理數據的標准,在這個標准里規定了網絡代理設備必須保存的數據項目,數據類型,以及允許在每個數據項目中的操作。通過對這些數據項目的存取訪問,就可以得到該網關的所有統計內容。再通過對多個網關統計內容的綜合分析即可實現基本的網絡管理。

MIB是管理對象信息的集合,本質上是一個分層組織的樹形結構數據庫。網絡中的每個設備都是一個對象元素,MIB由被管理對象組成,並有對象標識。對象標識在MIB樹中唯一標識一個被管理對象。

作為訪問集,MIB的職能就是為管理工作站指定代理。可以通過修改變量來改變代理中配置的設置。

七、什么是ASN.1

ASN.1是由CCITT(X.208)和ISO(ISO 8824)開發和標准化的正式語言,是一種可以用來定義數據結構的語言。他可用於定義應用程序數據的抽象語法、定義應用程序結構和表示PDU、為SNMP和OSI系統管理定義管理信息庫。

抽象語法:描述獨立於任何用於表示數據的編碼技術的通用數據結構,該語法允許定義數據類型並規定這些類型的取值。

ASN.1規范的基本組成單元是模塊(module)。結構定義以命名模塊的形式來進行,然后模塊的名稱就可以被用來引用該結構。

模塊的基本形式為

<modulereference> DEFINITIONS ::=

BEGIN

EXPORTS

IMPORTS

AssignmentList

END

Modulereference是模塊名稱,后面可以跟一個對象標識符來標識該模塊。EXPORTS結構表示該模塊中的一個定義可以由其他模塊引入;IMPORTS接口表示有其他模塊中的哪一些類型和取值定義要被引人到該模塊中。如果沒有包括該模塊的對象標識符,就沒有IMPORTS或EXPORTS結構。最后賦值列表由類型賦值、取值賦值和宏定義組成。

類型和取值賦值有下面的形式 <name>::=<description>

宏定義:

八、SNMP支持的操作有哪些?

SNMP支持的操作僅僅是對變量的修改和檢查,對標量對象有三種一般用途的操作:

Get:管理站從被管理站中檢索標量對象的取值。

Set:管理站更新被管理站的標量對象的取值。

Trap:被管理站向管理站主動發送標量對象取值。

通過添加或刪除對象實例來改變MIB的結構是不可能的,發送一個命令要求執行一定的動作也是不可能的。在對象標識符樹中,只提供對終端對象的訪問,不可能通過一個具有基本特性的動作來訪問整個表或表中的一行。這些限制極大簡化了SNMP的實現,但另一方面也限制了網絡管理系統的性能。

九、什么是community

管理系統需要保護自己和自己的MIB不被授權的訪問所訪問,SNMP為這些安全問題提供了基本的有限的功能,概念上稱之為公用體。

公共體指定義驗證、訪問控制和代理特征的SNMP管理者與SNMP代理之間的關系。公共體是本地概念,在被管理系統中定義。被管理系統為每個被要求的驗證、訪問控制和代理特征的組合建立一個公共體,每個公共體被賦予一個(在代理內部)公共體名。

由於公共體代理本地定義,不同的代理可以使用相同的名稱。

用途:

鑒別服務——確保通信是可信的,community的功能和密碼一樣。

訪問策略——訪問控制有兩方面,SNMP MIB視圖(MIB內部對象的一個子集)和SNMP訪問模式(READ-ONLY和READ-WRITE),兩者的組合稱為SNMP公共體輪廓。可以通過community指定訪問策略。

代理服務器服務——代理系統為代表的每一個設備保留一個community從而控制對每一個設備的訪問策略。

十、什么是對象、對象標識符、對象實例?

對象(Object):在SNMP上下文中代表某一資源或被管理設備的其他方面的數據變量,也指被管理對象。

對象標識符(OID):在MIB內部唯一確定一個對象。對象標識符是由點號隔開的整數序列,該序列定義對象在樹型結構的MIB中的位置,該對象本身也是該樹型結構的一部分。

對象實例:確定要取某一具體數值的對象類型的某一具體實例。

表中的列對象:一個表有多個實例,表通過INDEX對象來區分每一列的多個對象,簡單的表只有一個INDEX對象,對於更復雜的情況,例如tcp組中的tcpConnTable,該表含有四個INDEX對象,因此表中五個列對象的任何一個列對象的實例標識符就由該對象的標識符串接四個INDEX對象為特定行的取值組成的。更一般的描述:給定其對象標識符為y的對象和表中的INDEX對象i1、i2、……、iN,則特定行中一個對象實例的實例標識符為y.i1.i2.…….iN

字典序:對象標識符是反映MIB中對象的層次或樹型結構的整數序列,給定MIB的樹型結構,特定對象的對象標識符可以通過從根到該對象的路徑衍生出來。父結點的子結點總是按升序描述

十一、SNMP的協議規范

管理工作站和代理之間的信息交換以SNMP消息的形式進行,每一條消息包含指示SNMP版本的版本序列和5種協議數據單元(GetRequest、GetNextRequest、SetRequest、GetResponse、Trap)類型中的一種。

1、SNMP格式

(a)SNMP message

Version

Community

SNMP PDU

(b)GetRequest PDU、GetNextRequest PDU、SetRequest PDU

PDU type

request-id

0

0

variablebindings

(c)GetResponse PDU

PDU type

request-id

error-status

error-index

variablebindings

(d)Trap PDU

PDU type

enterprise

agent-addr

generic-trap

specific-trap

time-stamp

variablebindings

(e)variablebindings

name1

value1

name2

value2

……

namen

valuen

2、SNMP的運行過程

駐留在被管設備上的AGENT從UDP端口161接受來自網管站的串行化報文,經解碼、團體名驗證、分析得到管理變量在MIB樹中對應的節點,從相應的模塊中得到管理變量的值,再形成響應報文,編碼發送回網管站。網管站得到響應報文后,再經同樣的處理,最終顯示結果。

(1) SNMP消息的傳輸

第一:使用ASN.1的結構來構造PDU;

第二:該PDU來源及目的傳輸層地址和公共體名稱一起被送往鑒別服務,鑒別服務對這些交換執行要求的變換,例如加密或包含鑒別密碼,然后返回結果;

第三:協議實體構造消息,包括版本字段、公共體名稱和從第二步返回的結果;

第四:新的ASN.1對象使用BNR對其編碼,然后送往傳輸服務。

(2) SNMP消息的接收者

第一:解碼生成用內部數據結構表示的報文,解碼依據ASN.1的基本編碼規則,如果在此過程中出現錯誤導致解碼失敗則丟棄該報文,不做進一步處理;

第二:將報文中的版本號取出,如果與本Agent支持的SNMP版本不一致,則丟棄該報文,不做進一步處理。當前北研的數據通信產品只支持SNMP版本1;

第三:將報文中的團體名取出,此團體名由發出請求的網管站填寫。如與本設備認可的團體名不符,則丟棄該報文,不做進一步處理,同時產生一個陷阱報文。SNMPv1只提供了較弱的安全措施,在版本3中這一功能將大大加強;

第四:從通過驗證的ASN.1對象中提出協議數據單元PDU,如果失敗,丟棄報文,不做進一步處理。否則處理PDU,結果將產生一個報文,該報文的發送目的地址應同收到報文的源地址一致。

 

根據不同的PDU,SNMP協議實體將做不同的處理:

1)、GetRequestPDU:

第一種情況:如果PDU中的變量名在本地維護的MIB樹中不存在,則接受到這個PDU的協議實體將向發出者發送一個GetResponse報文,其中的PDU與源PDU只有一點不同:將ERROR-STATUS置為noSuchName,並在ERROR-INDEX中指出產生該變量在變量LIST中的位置。

第二種情況:如果本地協議實體將產生的響應報文的長度大於本地長度限制,將向該PDU的發出者發送一個GetResponse報文,該PDU除了ERROR-STATUS置為tooBig,ERROR-INDEX置為0以外,與源PDU相同。

第三種情況:如果本地協議實體因為其他原因不能產生正確的響應報文,將向該PDU的發出者發送一個GetResponse報文,該PDU除了ERROR-STATUS置為genErr,ERROR-INDEX置為出錯變量在變量LIST中的位置,其余與源PDU相同。

第四中情況:如果上面的情況都沒有發生,則本地協議實體向該PDU的發出者發送一個GetResponse報文,該PDU中將包含變量名和相應值的對偶表,ERROR-STATUS為noError,ERROR-INDEX為0,request-id域的值應與收到PDU的request-id相同。

2)、GetNextRequestPDU

GetNextRequestPDU的最重要的功能是表的遍歷,這種操作受到了前面所說的管理變量的表示方法的支持,從而可以訪問一組相關的變量,就好象他們在一個表內。

有如下一個表:

ipRouteDest

ipRouteMetric1

ipRouteNextHop

9.1.2.3

3

99.0.0.3

10.0.0.51

5

89.1.1.42

10.0.0.99

5

89.1.1.42

假設管理工作站希望能構檢索整個表,但當前不知道其中的內容,甚至表中的行數。管理工作站可以發送一個包含所有列對象名稱的GetNextRequest:  GetNextRequest(ipRouteDest,ipRouteMetric1,ipRouteNextHop)

代理將會返回表中的第一行的取值:

GetResponse((ipRouteDest.9.1.2.3=9.1.2.3),(ipRouteMetric1.9.1.2.3=3),(ipRouteNextHop.9.1.2.3=99.0.0.3))

管理工作站可以存儲這些結果並用下面的語句來檢索第二行:

GetNextRequest(ipRouteDest.9.1.2.3,ipRouteMetric1.9.1.2.3,ipRouteNextHop.9.1.2.3)

SNMP代理響應為:

GetResponse((ipRouteDest.10.0.0.51=10.0.0.51),(ipRouteMetric1.1.0.0.0.51=5),(ipRoute NextHop.10.0.0.51=89.1.1.42))

     接下來出現一下交換:

GetNextRequest(ipRouteDest.10.0.0.51,ipRouteMetric1.10.0.0.51,ipRouteNextHop.10.0.0.51)

GetResponse((ipRouteDest.10.0.0.99=10.0.0.99),(ipRouteMetric1.10.0.0.99=5),(ipRouteNextHop.10.0.0.99=89.1.1.42))

管理工作站不知道這是表的末尾,因此繼續:

GetNextRequest(ipRoutDest.10.0.0.99,iprouteMetric1.10.0.0.99,ipRouteNextHop.10.0.0.99)

然而表中再沒用更多的行了,因此代理返回MIB視圖中按字典順序的下一個對象:

GetResponse((ipRouteMeric1.9.1.2.3=3),(ipRouteNextHop.9.1.2.3=99.0.0.3),(ipNetToMediaInIndex.1.3=1))

由於響應列表中對象的名稱與請求不匹配,這就指示管理工作站已經到達了路由表的末端。

3)、GetResponsePDU

GetResponsePDU只有當受到getRequestGetNextRequestSetRequest才由協議實體產生,網管站收到這個PDU后,應顯示其結果。

4)、SetRequestPDU

SetRequestPDU除了PDU類型標識以外,和GetRequest相同,當需要對被管變量進行寫操作時,網管站側的協議實體將生成該PDU。

對SetRequest的響應將根據下面情況分別處理:

(1).如果是關於一個只讀變量的設置請求,則收到該PDU的協議實體產生一個GetReponse報文,並置errorstatus為noSuchName,errorindex的值是錯誤變量在變量list中的位置。

(2).如果被管設備上的協議實體收到的PDU中的變量對偶中的值,類型、長度不符和要求,則收到該PDU的協議實體產生一個GetReponse報文,並置errorstatus為badValue,errorindex的值是錯誤變量在變量list中的位置。

(3).如果需要產生的GetReponse報文長度超過了本地限制,則收到該PDU的協議實體產生一個GetReponse報文,並置errorstatus為tooBig,errorindex的值是0。

(4).如果是其他原因導致SET失敗,則收到該PDU的協議實體產生一個GetReponse報文,並置errorstatus為genErr,errorindex的值是錯誤變量在變量list中的位置。

如果不符合上面任何情況,則agent將把管理變量設置收到的PDU中的相應值,這往往可以改變被管設備的運行狀態。同時產生一個GetResponsePDU,其中errorstatus置為noError,errorindex的值為0。

十二、 Windows XP 上安裝SNMP

1、以管理員的身份登陸;

2、點擊開始,指向設置,點擊控制面板, 雙擊添加或刪除程序, 然后點擊添加/刪除 Windows 組件;

3、點擊管理和監視工具 (但不要選擇或清除其復選框), 然后點擊詳細信息;

4、選擇簡單網絡管理協議復選框,並點擊確定,點擊下一步;

5、插入相應的CD 或指定文件存儲位置的完整路徑,然后點擊繼續;

6、SNMP 會在安裝后自動啟動;這樣將完成安裝過程。

十三、使用NET-SNMP包開發程序

1、windows平台下編譯NET-SNMP

    只需把源碼下的win32目錄中的幾個庫的工程編譯就行了。但注意,要把netsnmp.lib放在最后編譯,否則編譯結果不一樣。最后用編譯出來的四個庫文件:netsnmp.lib , netsnmpagent.lib , netsnmphelpers.lib , netsnmpmibs.lib,來編譯netsnmp.dll。注意還要加上wsock32.lib。如果編譯出錯,提示跟VC默認的庫有沖突,按提示在編譯環境中用NODEFAULTLIB:XXX來去掉VC的缺省庫文件。

2、設置編譯環境

A、工程放在開發包的win32文件夾下;

B、打開VC++6.0編譯器,Project->C/C++->Category選擇Preprocessor,在Additional include directories下填寫.,..,..\..\snmplib,..\..,..\..\include,這是include的路徑,不填此項在編譯時會報錯找不到<netsnmp/**.h>;

C、Project->Link->Category選擇General,在Object/library modules下添加netsnmp.lib netsnmpagent.lib netsnmphelpers.lib netsnmpmibs.lib netsnmptrapd.lib Ws2_32.lib,其中前五個正是編譯NET-SNMP包時得到的.lib庫文件,最后一個是Windows下socket編程所要包含的庫文件;然后在Project->Link->Category選擇Input,在Additional library path下填寫../lib/debug,這是那五個庫文件的路徑。這一步設置解決鏈接時的錯誤。

十四、NET-SNMP包中的命令

1snmpget ——通過給出主機名、訪問權限及對象標識符從遠程主機獲取其相關數據

例如:snmpget  -c  demopublic  -v  2c  test.net-snmp.org  system.sysUpTime.0
結果:system.sysUpTime.0 = Timeticks: (586731977) 67 days, 21:48:39.77

其中test.net-snmp.org 是將要訪問的主機名,demopublic 是SNMP的community,OID是system.sysUpTime.0. 早期的ucd-snmp默認使用的是SNMPv1,而且community在主機名后.

注意不能少后綴‘0’,否則會出錯,版本1和版本2的報錯不同:

 snmpget  -v  1  -c  demopublic  test.net-snmp.org  sysUpTime
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
This name doesn't exist: system.sysUpTime
Snmpget  -v  2c  -c  demopublic  test.net-snmp.org  sysUpTime
system.sysUpTime = No Such Instance currently exists

可以同時訪問多個變量:

 snmpget  -v  2c  -c  demopublic  test.net-snmp.org  sysUpTime.0  ucdDemoUserList.0
system.sysUpTime.0 = Timeticks: (586903243) 67 days, 22:17:12.43
enterprises.ucdavis.ucdDemoMIB.ucdDemoMIBObjects.ucdDemoPublic.ucdDemoUserList.0 = " noAuthUser MD5User MD5DESUser SHAUser SHADESUser"

2、snmptable ——獲取SNMP中的表信息。

 snmptable -v  1  -c public  202.117.11.141 ip.ipNetToMediaTable

注意OID只寫到表名,而不寫到Entry,也不在末尾加‘.0’

BUGS

      The test for TABLE-OID actually specifying a table is rather heuristic.

      Note also that the test requires the defining MIB file to be loaded.

 3、snmpbulkget——獲取設備大批MIB信息

snmpbulkget  -v 2c  -Cn<NUM> -Cr<NUM>  -c public  202.117.11.141 system  ifTable

-Cn用來指定對前<NUM>個OID各只進行一次get操作,其余的都從所給OID的下一個對象開始反復執行get以獲取若干個對象的信息。默認值為0,即所有列出的OID均可重復多次get;

-Cr用來指定在Cn限制之外的OID分別能順序獲取<NUM>個對象信息。默認值為10,即所有列出的OID默認重復10次get獲取10個對象信息。

4、snmpbulkwalk——作用和用法與snmpwalk類似,讀取子 信息,區別在於一個用於SNMPv2,一個用於SNMPv1
    snmpbulkget也能像snmpbulkwalk一 實現子 的遍歷,兩者的區別在於前者對獲取的每一個變量作單獨轉換,而后者則是收集到子 的所有信息之后做一次轉換,可見snmpbulkwalk比snmpbulkget高效。

十五、什么是VLAN

    VLAN(Virtual Local Area Network)即虛擬局域網,是一種通過將局域網內的設備邏輯地而不是物理地划分成一個個網段從而實現虛擬工作組的新興技術VLAN的划分有三種方式:基於端口(Port)、基於MAC地址和基於IP地址通過划分虛擬網,可以把廣播限制在各個虛擬網的范圍內,從而減少整個網絡范圍內廣播包的傳輸,提高了網絡的傳輸效率;同時各虛擬網之間不能直接進行通訊,而必須通過路由器轉發,為高級的安全控制提供了可能,增強了網絡的安全性雖然VLAN並非最好的網絡技術,但這種用於網絡結點邏輯分段的方法正為許多企業所使用VLAN采用多種方式配置於企業網絡中,包括網絡安全認證、使無線用戶在802.11b接入點漫游、隔離IP語音流在不同協議的網絡中傳輸數據等虛擬局域網(VLAN)的出現打破了傳統網絡的許多固有觀念,使網絡結構變得靈活、方便


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM