1. 程式人生 > >SNMP介紹, OID及MIB庫

SNMP介紹, OID及MIB庫

1 SNMP概覽

1.1 SNMP的基本知識介紹

簡單網路管理協議(SNMP-Simple Network Management Protocol)是一個與網路裝置互動的簡單方法。該規範是由IETF在1990年五月釋出的RFC 1157中定義的。SNMP通常被認為相當難懂,並且過於複雜,其可用的API似乎在本來非常簡單的東西外面封裝了大量的東西。現在關於SNMP的書籍又往往只是把它更加複雜化了,而沒有解釋清楚。

 SNMP對於任何程式設計人員來說是特別易於理解的。總體的簡化能夠很好地把這個系統簡化。一個網路裝置以守護程序的方式執行SNMP代理,該守護程序能夠響應來自網路的各種請求資訊。該SNMP代理提供大量的物件識別符號(OID-Object Identifiers)。一個OID是一個唯一的鍵值對。該代理存放這些值並讓它們可用。一個SNMP管理器(客戶)可以向代理查詢鍵值對中的特定資訊。從程式設計師的角度看,這和匯入大量的全域性變數沒有多少區別。SNMP的OID是可讀或可寫的。儘管向一個SNMP裝置寫入資訊的情況非常少,但它是各種管理應用程式用來控制裝置的方法(例如針對交換機的可管理GUI)。SNMP中有一個基本的認證框架,能夠讓管理員傳送公共名來對OID讀取或寫入的認證。絕大多數的裝置使用不安全的公共名 "public" 。 SNMP協議通過UDP埠161和162進行通訊的。

注意,我還沒有提到MIB!MIB的重要性被大大地誇大了。剛開始時,MIB顯得非常複雜,但是它們其實非常簡單。OID是數字的和全域性的鍵值對。一個OID看起來和一個IPv6的地址很象,並且不同的廠商有不同的字首等資訊。OID都非常長,使得人們難以記住,或者對他非常感冒。因此,人們就設計了一種將數字OID翻譯為人們可讀的格式。這種翻譯對映被儲存在一個被稱為 “管理資訊基礎"(Management Infomation Base) 或MIB的、可傳遞的無格式文字檔案裡。使用SNMP或者向SNMP裝置查詢,你不需要使用MIB,但是,如果沒有MIB,你就得猜測你正在檢視的資料是什麼。某些情況下,不使用MIB也非常簡單,例如檢視主機名、磁碟使用率數字,或者埠狀態資訊。其他情況下,就非常困難了,這個時候使用MIB就非常有幫助。對於準備編寫的應用程式來說,為了讓使用者避免妥當安裝MIB帶來的麻煩,而嚴格使用數字OID很常見。安裝一個MIB的動作,只是將他放置到你的SNMP客戶端應用軟體能夠搜尋到並進行上述翻譯對映工作的某個位置而已。


SNMP可以按照兩種方式來使用: 輪詢和陷阱。輪詢就是說你編寫一個應用程式能夠設定一個傳送給一個SNMP代理檢視某些值的SNMP GET請求。這種方法非常有用,因為如果該裝置響應了請求,你就得到了你需要的資訊,如果該裝置沒有響應請求,你就能夠知道存在某些問題。輪詢是網路監控的一種主動形式。另一方面,SNMP陷阱能夠被用來進行被動形式的網路監控。SNMP陷阱是通過配置SNMP裝置的代理,讓他在某些動作發生時聯絡另一個SNMP代理來實現的

可以配置為在某些事件發生時傳送SNMP陷阱。例如,你可以配置Cisco的IOS在某個獨立事件(例如鏈路斷開)發生時,或者在任何定義的陷阱事件發生時,傳送SNMP陷阱。(IOS:snmp伺服器開啟了鏈路斷開的snmp陷阱)。當陷阱事件發生時,裝置中的snmp代理會發送該陷阱到一個預先配置好的通常成為陷阱主機的目標上。陷阱主機會執行有自己的SNMP代理,該代理能夠接受並處理傳入的陷阱。這些陷阱的處理由陷阱處理器來完成。陷阱處理器可以用任何語言編寫,並且可以通過STDIN(標準輸入)傳入的來自發送陷阱的資訊。該處理器之後可以根據陷阱進行任何想作的事情,例如傳送郵件或者你想要的任何事情。

SNMP被廣泛應用在NMS網路管理系統中(Network Management System)。知名的NMS包括BMC的Patrol、CA的Unicenter、Sun Mangegement控制檯、IBM的Tivoli Netview、以及全球著名的HP Openview。NMS的目標是提供一個監控和管理所有開啟SNMP功能的裝置的單一入口。通過配置你的裝置代理來接受寫訪問,你可以從一個應用程式中處理你的網路環境。如果你的整個環境圍攏NMS解決方案架構你的環境,你就能無限制地控制、檢視你的整個網路。儘管Net-SNMP提供了可用來構建你自己的NMS網管系統的所有工具,我們不會再進一步討論關於NMS的話題。不過請記住,如果你認為你的SNMP裝置廠商沒有提供SNMP代理方面的詳細資訊,很可能是因為他們希望你購買他們的NMS網路管理系統,或者購買能夠在另一個NMS平臺上使用的外掛。

1.2 SNMP的三大版本 

    SNMP的常用版本有三個:SNMPv1、SNMPv2、SNMPv3
    SNMPv1是為基於公共管理的初始標準。SNMPv2是SNMPv1框架下衍生出來的,但是沒有定義資訊,其後修訂為SNMPv2c,一個帶有於SNMPv1類似資訊格式的給予公共管理的版本。SNMPv2添加了幾個新的資料型別(Counter32、Counter64、Gauge32、UInteger32、NsapAdress 以及BIT STRING),以及對OID表和OID值的設定的增強。SNMPv3是一個帶有新的資訊格式、ACL、安全功能和遠處SNMP引數配置的、擴充套件了SNMPv2框架的版本。

    SNMP是基於幾個其他規範的,包括定義給予SNMP的資料型別的ASN.1 BER(Abstract Syntax Notation 1 Basic Encoding Rules), 以及詳細描述有SNMP MIB使用的語法的管理資訊結構(SMI)。如果你選擇修改MIB的某些東西,你需要學習SMIv2和ASN.1語法,不過其他情況下你只需要在興趣時看看他,而不必學習他。

    現在,SNMPv1和SNMPv2被廣泛應用,但是由於這些協議的不安全特性,通常只使用只讀訪問。通常,除非你確實需要附加安全特性,否則你不需要過多地關注SNMPv3。SNMPv3是具有安全性的通訊協議。
 

    Net-SNMP中關於同步和非同步應用程式的文件,常常會把沒有經驗的編碼新手給嚇唬住。別擔心,那只是指無法坐等響應的應用程式。如果你的應用程式需要以非阻塞方式處理SNMP資料流,就使用一步介面(例如GUI、執行緒、forking等)。否則,只需要使用同步介面就可以了。

2 MIB和OID

    OID(物件識別符號),是SNMP代理提供的具有唯一標識的鍵值。MIB(管理資訊基)提供數字化OID到可讀文字的對映。

2.1 OID


    OID的編寫規則和習慣
    SNMP OID是用一種按照層次化格式組織的、樹狀結構中的唯一地址來表示的,它與DNS層次相似。與其他格式的定址方式型別,OID以兩種格式加以應用:全名和先對名(有時稱為“相關”)


    完全驗證格式從root根開始,並且向外移到某個裝置的獨立的質上。例如一個完整驗證的地址為:

    該OID可用人們可讀的方式重寫為:

    所有完全驗證OID都有 .iso.org.dod.internet.private 開始,數字表達為: .1.3.6.4. 。幾乎所有的OID都會跟上企業(.1)和由IANA(網際網路編號分配中心分配的)唯一的廠商標號。例如OID 789表示Network Appliance格式的廠商編號( NetApp )。廠商編號後面的是基於廠商實現的功能,並且各不相同。請注意,在iso.前面的 .  ,與DNS中的後點相似,正確驗證的OID是有一個表示根的字首 . 開始的。

    OID的相對格式,從企業值開始,略過所有的隱含地址。因此,我們可以用相對地址 enterprises.netapp.netappl.raid.diskSUmmary.diskSpaceCount.0 來表示上述的OID,或者用數字格式 .1.789.6.4.8.0 .


寫OID的常用格式是用MIB名稱和在MIB中定義的唯一鍵值。例如,我們可以用簡寫的格式重寫上述OID:
NETWORK-APPLIANCE-MIB::diskSpareCount.0
MIB中OID的書寫格式規則為::MIB Name::唯一鍵值.instance.

某些唯一鍵值,可用多個例項表示,這樣所有的OID都以例項值結尾。這就是為什麼你得注意到大多數OID都是以一個 .0 結尾的。
 


2.2 MIB介紹


    MIB的內部結構剛開始時會讓人感覺有些奇怪和不好理解,不過它的結構非常好,你可以在不懂的情況下一個一個看進去。MIB的結構來源於IETF RFC1155和2578定義的管理資訊結構。如果你想要修改或編寫自己的MIB,在動手前理解SMI非常有幫助。


    為了更好地理解他們是怎樣工作的,我們先來看看MIB的頭:
-- PowerNet-MIB {iso org(3) dod(6) internet(1) private(4)
-- enterprises(1) apc(318) }

PowerNet-MIB DEFINITIONS ::= BEGIN

IMPORTS
enterprises, IpAddress, Gauge, TimeTicks FROM RFC1155-SMI
DisplayString FROM RFC1213-MIB
OBJECT-TYPE FROM RFC-1212
TRAP-TYPE FROM RFC-1215;


apc OBJECT IDENTIFIER ::= { enterprises 318 }
products OBJECT IDENTIFIER ::= { apc 1 }
apcmgmt OBJECT IDENTIFIER ::= { apc 2 }


Comments can be inserted into a MIB by prepending them with two dashes. In the header the declaration BEGIN starts off the MIB. Imports can be used to pull information from other MIBs, typically those mandated by the MIB-II standard.
可以用行開頭為 -- 的方法在MIB中加入註釋。
在頭部用 BEGIN`宣告來開始MIB的定義。 
`Imports 可用來從其他MIB中提取資訊,通常用它來提取MIB-II規範要求的內容。
MIB放置從enterprise值開始的OID地址的結構。在此,enterprise值是318, 對應 "apc" (相對地址為 .1.318)。 通常之後會定義幾個類別。注意在花括號間定義的兩個值,其父地址後面跟一個它自己的地址。因此產品識別符號有apc識別符號表示,其父為enterprise識別符號,以此類推。類別和自類別的型別通常跟在MIB頭的後面,並且把有用的鍵值分割為子組。通過分段,各種值分別被列出,這樣可用的值更容易瀏覽。



MIB的真正好處在於物件型別的描述。以下是一個整形鍵值的例子:
upsBasicOutputStatus OBJECT-TYPE
SYNTAX INTEGER {
   unknown(1),
   onLine(2),
   onBattery(3),
   onSmartBoost(4),
   timedSleeping(5),
   softwareBypass(6),
   off(7),
   rebooting(8),
   switchedBypass(9),
   hardwareFailureBypass(10),
   sleepingUntilPowerReturn(11),
   onSmartTrim(12)
}
ACCESS read-only
STATUS mandatory
DESCRIPTION
   "The current state of the UPS. If the UPS is unable
    to determine the state of the UPS this variable is set
    to unknown(1)."
::= { upsBasicOutput 1 }

    因此,在這裡真正需要注意的是,MIB其實只是提供給我們一張我們想從某個SNMP代理中獲得的可用OID的各種值的地圖。一個MIB描述了在哪裡找某個值、以及返回結果是什麼。我們可以不用MIB與裝置進行互動,只不過在理獲得'Up'的返回值,要比‘1’的返回值要簡單的多。通過利用Net-SNMP命令列工具,你可以決定你希望返回結果的輸出樣式(這種方式下使用“Up"這樣的格式更好),或者你用指令碼呼叫工具時(這種方式下使用”1“的格式就更好)。
 


2.3 OID資料型別 


    SMI定義的OID返回值的資料型別。

    SMI定義了一定數量的OID返回的資料型別。這些資料型別包括:

Integer 整型

Signed 32bit Integer (values between -2147483648 and 2147483647). 有符號32位整數(值範圍: -2147483648 - +2147483648) 

Integer32

Same as Integer. 與Integer相同。 

UInteger32

Unsigned 32bit Integer (values between 0 and 4294967295). 無符號32位整數(值範圍:0-4294967295).

Octet String

Arbitrary binary or textual data, typically limited to 255 characters in length. 任意二進位制或文字資料,通常長度限制在255個字元內。 

Object Identifier

An OID. 一個OID。

Bit String

Represents an enumeration of named bits. This is an unsigned datatype. 表示取名的位的列舉。這是一個無符號的資料型別。 

IpAddress

An IP address. 一個IP地址。 

Counter32

Represents a non-negative integer which monotonically increases until it reaches a maximum value of 32bits-1 (4294967295 dec), when it wraps around and starts increasing again from zero. 表示一個非負的整數(可遞增到32位最大值-1),然後恢復並從0開始遞增。 

Counter64

Same as Counter32 but has a maximum value of 64bits-1. 與Counter32相同,最大值為64位的最大值-1。 

Gauge32

Represents an unsigned integer, which may increase or decrease, but shall never exceed a maximum value. 表示無符號整數,可增加或減少,但是不超過最大值。 

TimeTicks

Represents an unsigned integer which represents the time, modulo 2ˆ32 (4294967296 dec), in hundredths of a second between two epochs. 表示代表資料的一個無符號整數,2^32取模(4294967296),兩個值之間為百分之一秒。 

Opaque

Provided solely for backward-compatibility, its no longer used. 提供向下相容,不再使用的資料型別 

NsapAddress
Represents an OSI address as a variable-length OCTET STRING. 表示一個用變長八進位制字元窗表示的OSI地址。 

Net-SNMP tools will report the datatype when returning an OID unless you otherwise disregard it. As an example of that you’ll see:

Net-SNMP工具在返回一個OID時會包括其資料型別,除非你不想要他。以下是一個例子:
SNMPv2-MIB::sysContact.0 = STRING: Ben Rockwood
IF-MIB::ifPhysAddress.1 = STRING: 0:c0:b7:63:ca:4c
SNMPv2-MIB::sysUpTime.0 = Timeticks: (47372422) 5 days, 11:35:24.22
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.318.1.3.7
RFC1213-MIB::atPhysAddress.1.1.10.10.1.1 = Hex-STRING: 00 50 73 28 47 A0
RFC1213-MIB::atNetAddress.1.1.10.10.1.1 = Network Address: 0A:0A:01:01
IF-MIB::ifSpeed.1 = Gauge32: 10000000
SNMPv2-MIB::snmpInPkts.0 = Counter32: 316
SNMPv2-MIB::snmpOutPkts.0 = Counter32: 314

這是一個相當典型的由Net-SNMP工具返回的資料型別表單。注意有些值已經由Net-SNMP自動解釋了,比如sysUpTime和ifAdminStatus。這些值返回時使用到MIB,Net-SNMP會在MIBzhong找到返回值,並且為我們提供該值的文字表示。

3 例項

(1) MIB 結構

TEST-TRAP-MIB DEFINITIONS ::= BEGIN  

  
IMPORTS  
    MODULE-IDENTITY, OBJECT-TYPE, TimeTicks FROM SNMPv2-SMI  
       DisplayString, FROM SNMPv2-TC  
    enterprises  
        FROM RFC1155-SMI;  
    test OBJECT IDENTIFIER ::= { enterprises 1000 }  
    TestTraps OBJECT IDENTIFIER ::= { test 1 }  
      
  
   cpuRatioHigh NOTIFICATION-TYPE  
          OBJECTS  {SystemTrapDescription}  
          STATUS  current  
          DESCRIPTION  
              "."  
      ::= { TestTraps 1 }      
        
  
   TestDescription OBJECT IDENTIFIER ::= { TestTraps 2 }  
     
   TestTrapDescription  OBJECT-TYPE  
       SYNTAX  DisplayString (SIZE (0..256))  
       MAX-ACCESS read-only  
       STATUS current  
       DESCRIPTION "  "  
       ::= { TestDescription 1 }  
          
END  




(2) 對應OID:

 const oid cpuRatioHigh_oid[] = { 1,3,6,1,4,1,1000,1,1 };  
 const oid TestTrapDescription_oid[] = { 1,3,6,1,4,1,1000,1,2,1, 0 };  


某些唯一鍵值,可用多個例項表示,這樣所有的OID都以例項值結尾。這就是為什麼你得注意到大多數OID都是以一個 .0 結尾的。

本文轉自:

http://blog.sina.com.cn/s/blog_4502d59c0101fcy2.html