閱讀315 返回首頁    go 阿裏雲 go 技術社區[雲棲]


用snmp4j開發網管應用(一) - SNMP

要開發網管應用,SNMP是必學的協議,這裏首先對SNMP進行一下簡單的介紹和想要開發SNMP協議的內容所需要用到的工具。

 

SNMP

SNMP 協議分為了多個版本,V1太簡單,V2加入了一些驗證,V3最嚴謹,下麵都是以V2進行說明

概念:

ASN.1 高級數據描述語言,用於定義數據類型,語法規則等。

BER ASN.1的基本編碼規則,發送消息之前經過其編碼,接收後先解碼

SMI 管理信息結構,ASN.1的子集加上一部分宏等內容。SNMP用它來描述MIB和PDU

MIB 管理信息庫,一般是一個樹形結構,使用SMI描述,用來定義一個或者多個網元

OID 網絡節點的唯一ID,用在MIB中,是一個國際機構統一分配的,比如1.3.6.1.4.1代表enterprises企業網

PDU SNMP協議數據單元,是一個數據包的格式。每一種SNMP方法對應一種PDU,使用SMI描述,BER編碼,傳輸層(UDP)協議進行傳輸

 

SNMP跟網管有關的開發可能會涉及如下的內容:

1. 獲取網元信息

  •     網元已經存在,其提供MIB文件,其中定義了該網元節點的結構以及想獲取該結構內容所需要用到的OID
  •     使用代碼或者其他的方式構建PDU,比如用snmp4j構建一個get請求類型的PDU(這個PDU是SMI描述的,BER編碼的,包含了要操作的OID)到網元,得到返回結果。
  •     根據返回結果進行操作(可以通過getNext達到遍曆的效果),或者是把單純的數據信息持久化起來用於觀察。

2. 設置網元參數

  •     發送set請求的PDU到網元達到設置網元某個參數的作用

3. 開發trap服務器接收trap消息

  •     開發trap接收服務端,並在在網元端配置服務器端地址,網元因為某個時間出發一個trap發送到該服務端。
  •    服務端記錄該trap消息,用於數據分析

4. 開發一個網元模擬器

  •     開發一個模擬器,自己作為網元被人管理,通常用於測試。因為網管係統對應的真是網元都是昂貴的硬件,不容易找到合適的測試環境。

 

為了進行網元開發,首先我們需要準備一下所用到的工具

MIB Browser

我上傳的一個免費版本:https://download.csdn.net/detail/three_man/7477903

官網下載地址:https://ireasoning.com/download.shtml

可以下載

  iReasoning MIB Browser Free Personal Edition         

這個版本是個人版,沒有時間限製,但是有導入的mib文件數量的限製,不過很適合開發使用。

 

我自己寫了一個文件可以來這裏上傳:https://download.csdn.net/detail/three_man/7477887

這裏對這個文件進行簡單的說明。

文件主要內容:

CMS-MIB DEFINITIONS ::= BEGIN   
 // 文件描述開始

IMPORTS                                                        
   MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Integer32, enterprises,  
// 導入基本的庫,特別注意enterprises.他的oid是1.3.6.1.4.1

convediaCorp   OBJECT IDENTIFIER ::= { enterprises 7569 }
// 定義了一個節點,表示他是enterprises+ 7569,所以他的Oid是1.3.6.1.4.1.7569

nodeInfo             OBJECT IDENTIFIER ::= { msMIBObjects 1 } 
// 按照上麵的類推,這個節點的Oid為.1.3.6.1.4.1.7569.1.2.1.1
nodeLicensedPorts OBJECT-TYPE     
   SYNTAX      Integer32 (0.. 65535)  
   MAX-ACCESS  read-only  
   STATUS      current  
   DESCRIPTION  
      "Future: The maximum number of ports licensed for this MS."  
   DEFVAL { 18000   }  
   ::= { nodeInfo 1 }

 // 表示從屬於nodeInfo的一個節點。其Oid為.1.3.6.1.4.1.7569.1.2.1.1.1.0可以通過get OID這樣的結構得到這個屬性的值,後續會說具體的方式。

    這裏說一下SMI定義一個OBJECT-TYPE的結構。

  • SYNTAX表示值的類型為Integer32,SMI本身定義了很少的基本類型和一個複合類型Sequences.
  • MAX-ACCESS 訪問權限,這個在MibBrowers中read-only表示為一個葉子,write表示為一個筆尖
alarmTable  OBJECT IDENTIFIER ::= { msMIBObjects 23 }  
alarmEventTable OBJECT-TYPE  
   SYNTAX      SEQUENCE OF AlarmEventEntry  
   MAX-ACCESS  not-accessible  
   STATUS      current  
   DESCRIPTION  
      "A list of alarm status history entries."  
   ::= { alarmTable 3 }  
  
alarmEventEntry OBJECT-TYPE  
   SYNTAX      AlarmEventEntry  
   MAX-ACCESS  not-accessible  
   STATUS      current  
   DESCRIPTION  
      "An entry in the Alarm Event Table."  
   INDEX   { aleEventIndex }  
   ::= { alarmEventTable 1 }  
  
AlarmEventEntry ::=  
   SEQUENCE {  
      aleEventIndex        Unsigned32,  
      aleSequenceID        Unsigned32,  
      aleEventTime         DateAndTime,  
      aleEventType         EventType,  
      aleAlarmID           Unsigned32,  
      aleAlarmText         DisplayString,  
      aleAlarmSeverity     AlarmSeverity,  
      aleInstanceID        Unsigned32,  
      aleSlotNumber        Unsigned32  
   }  
  
aleEventIndex OBJECT-TYPE  
   SYNTAX      Unsigned32 (1.. 2000 )  
   MAX-ACCESS  not-accessible  
   STATUS      current  
   DESCRIPTION  
      "This object is used as a key attribute to  
      specify the row entry in this table."  
   ::= { alarmEventEntry 1 }  
  
aleSequenceID OBJECT-TYPE  
   SYNTAX      Unsigned32  
   MAX-ACCESS  read-only  
   STATUS      current  
   DESCRIPTION  
      "Unique sequential event identification number."  
   ::= { alarmEventEntry 2 }  
// 關鍵來了,這裏定義了一個Table,SMI中使用SEQUENCE 來定義複雜的結構,該結構可以看做是一個表,然後可以通過get,getNext來遍曆這張表中的內容。
alarm001 NOTIFICATION-TYPE  
   OBJECTS { aleSequenceID, aleEventType, aleAlarmID, aleInstanceID,  
             aleAlarmText, aleAlarmSeverity, aleEventTime, aleSlotNumber }  
   STATUS  current  
   DESCRIPTION  
      "External alarm 1 has been triggered. Text and severity  
      of this alarm are user-configurable. This alarm is  
      deactivated when the external contact is cleared."  
        --#SUMMARY "Alarm #001: %s.  Slot: %d  Event type: %d  Severity: %d  Instance: %d  Sequence: #%d"  
        --#ARGUMENTS {4,7,1,5,3,0}  
        --#SEVERITY MAJOR  
        --#TIMEINDEX 10  
        --#STATE OPERATIONAL  
   ::= { msTraps 11 }  
// 這個注意NOTIFICATION-TYPE,其定義了一個Trap消息,還定義了該trap消息中的內容是使用了AlarmTable中的內容。

好了基本上一個網元在設計的時候都是先去申請OID節點,然後設計這個MIB文件座位開發的標準。

然後我們使用MibBrowser導入它。

下載安裝MibBrowser打開它。


點擊File->Load MIBS,選擇一個mib文件打開就會得到上麵的樣子了。

我們再來看看其他功能。

1. get

  • 在左樹中選擇要操作的節點,
  • 最上麵Address中輸入網元地址,這裏是筆者自己寫的一個模擬器,後麵會把模擬器的代碼奉上。
  • Advanced可以設置SNMP的版本,一個用來身份驗證的Community和端口
  • Operations選擇為Get,此外還能選擇為Getnext walk等。 點擊Go.截圖沒截到
  • 這樣就完成了一個請求操作,在後下的列表中會返回結果

2. getNext

    與1相同,隻是Operations設置為GetNext

3. walk

    與1相同,Operations設置為walk,這個的返回結果會是一個列表。會默認輪詢調用getNext獲取整個Mib結構的所有值。


4, trapReceiver

打開TrapReceiver. Tool->Trap Receiver.

 按照5中的方式發送Trap

然後看到結果:

輸入一些信息,點擊SendTrap,在4中看結果

 

好了基本就這麼多的功能了,因為SNMP本身就是很簡單的協議。這些功能也是我們之後在開發中要用代碼實現的。

 

Linux SNMP服務

這個有可能需要安裝,也是比較好用的。主要的命令格式是:

snmpget -v2c -c CONV 10.85.134.194 .1.3.6.1.2.1.1.1.0

snmpwalk -v2c -c CONV 10.32.147.19:10161 1.3.6.1.4.1.7569.1.2.1.28.1

這個一看明了了吧, -v2c是版本, -c是Community, 然後是ip:port oid.

Linux上開發必備

 

SNMP4J

 這個是下一篇要說的內容,是基於Java的開源的開發SNMP的包。下一篇具體說。


最後更新:2017-04-03 07:56:58

  上一篇:go 積累(三)
  下一篇:go KMP字符串匹配