一文讀懂什么是SNMP


簡(jiǎn)介


SNMP系統(tǒng)組成


NMS
NMS是網(wǎng)絡(luò)中的管理者,是一個(gè)采用SNMP協(xié)議對(duì)網(wǎng)絡(luò)設(shè)備進(jìn)行管理/監(jiān)視的系統(tǒng),運(yùn)行在NMS服務(wù)器上。
NMS可以向設(shè)備上的SNMP Agent發(fā)出請(qǐng)求,查詢或修改一個(gè)或多個(gè)具體的參數(shù)值。
NMS可以接收設(shè)備上的SNMP Agent主動(dòng)發(fā)送的SNMP Traps,以獲知被管理設(shè)備當(dāng)前的狀態(tài)。
SNMP Agent
SNMP Agent是被管理設(shè)備中的一個(gè)代理進(jìn)程,用于維護(hù)被管理設(shè)備的信息數(shù)據(jù)并響應(yīng)來自NMS的請(qǐng)求,把管理數(shù)據(jù)匯報(bào)給發(fā)送請(qǐng)求的NMS。
SNMP Agent接收到NMS的請(qǐng)求信息后,通過MIB表完成相應(yīng)指令后,并把操作結(jié)果響應(yīng)給NMS。
當(dāng)設(shè)備發(fā)生故障或者其它事件時(shí),設(shè)備會(huì)通過SNMP Agent主動(dòng)發(fā)送SNMP Traps給NMS,向NMS報(bào)告設(shè)備當(dāng)前的狀態(tài)變化。
Managed Object
Managed object指被管理對(duì)象。每一個(gè)設(shè)備可能包含多個(gè)被管理對(duì)象,被管理對(duì)象可以是設(shè)備中的某個(gè)硬件,也可以是在硬件、軟件(如路由選擇協(xié)議)上配置的參數(shù)集合。
MIB
MIB是一個(gè)數(shù)據(jù)庫(kù),指明了被管理設(shè)備所維護(hù)的變量。MIB在數(shù)據(jù)庫(kù)中定義了被管理設(shè)備的一系列屬性:對(duì)象的名稱、對(duì)象的狀態(tài)、對(duì)象的訪問權(quán)限和對(duì)象的數(shù)據(jù)類型等。MIB也可以看作是NMS和SNMP Agent之間的一個(gè)接口,通過這個(gè)接口,NMS對(duì)被管理設(shè)備所維護(hù)的變量進(jìn)行查詢/設(shè)置操作。
MIB是以樹狀結(jié)構(gòu)進(jìn)行存儲(chǔ)的,如圖1-2所示。樹的節(jié)點(diǎn)表示被管理對(duì)象,它可以用從根開始的一條路徑唯一地識(shí)別,這條路徑就稱為OID,如system的OID為1.3.6.1.2.1.1,interfaces的OID為1.3.6.1.2.1.2。
子樹可以用該子樹根節(jié)點(diǎn)的OID來標(biāo)識(shí)。如以private為根節(jié)點(diǎn)的子樹的OID為private的OID——{1.3.6.1.4}。
圖1-2 OID樹結(jié)構(gòu)

用戶可以配置MIB視圖來限制NMS能夠訪問的MIB對(duì)象。MIB視圖是MIB的子集合,用戶可以將MIB視圖內(nèi)的對(duì)象配置為exclude或include。exclude表示當(dāng)前視圖不包含該MIB子樹的所有節(jié)點(diǎn);include表示當(dāng)前視圖包含該MIB子樹的所有節(jié)點(diǎn)。
@歡迎關(guān)注公眾號(hào):網(wǎng)絡(luò)工程師阿龍
SNMP查詢
SNMP查詢是指NMS主動(dòng)向SNMP Agent發(fā)送查詢請(qǐng)求,如圖1-3所示。SNMP Agent接收到查詢請(qǐng)求后,通過MIB表完成相應(yīng)指令,并將結(jié)果反饋給NMS。
SNMP查詢操作有三種:Get、GetNext和GetBulk。SNMPv1版本不支持GetBulk操作。
Get操作:NMS使用該操作從SNMP Agent中獲取一個(gè)或多個(gè)參數(shù)值。
GetNext操作:NMS使用該操作從SNMP Agent中獲取一個(gè)或多個(gè)參數(shù)的下一個(gè)參數(shù)值。
GetBulk操作:基于GetNext實(shí)現(xiàn),相當(dāng)于連續(xù)執(zhí)行多次GetNext操作。在NMS上可以設(shè)置被管理設(shè)備在一次GetBulk報(bào)文交互時(shí),執(zhí)行GetNext操作的次數(shù)。
圖1-3 SNMP查詢操作

SNMP查詢操作的報(bào)文
SNMPv1和SNMPv2c查詢報(bào)文格式如圖1-4所示。SNMPv1和SNMPv2c的報(bào)文主要由版本、團(tuán)體名、SNMP PDU組成。各類SNMP操作的報(bào)文封裝在SNMP PDU中。
圖1-4 SNMPv1/SNMPv2c查詢操作報(bào)文格式

報(bào)文中的主要字段如下:
版本:表示SNMP的版本,如果是SNMPv1報(bào)文則對(duì)應(yīng)字段值為0,SNMPv2c則為1。
團(tuán)體名:用于在SNMP Agent與NMS之間完成認(rèn)證,字符串形式,用戶可自行定義。團(tuán)體名包括“read”和“write”兩種,執(zhí)行SNMP查詢操作時(shí),采用“read”團(tuán)體名進(jìn)行認(rèn)證;執(zhí)行SNMP設(shè)置操作時(shí),則采用“write”團(tuán)體名進(jìn)行認(rèn)證。
Request ID:用于匹配請(qǐng)求和響應(yīng),SNMP給每個(gè)請(qǐng)求分配全局唯一的ID。
Non repeaters/Max repetitions:GetBulk操作基于GetNext操作實(shí)現(xiàn),相當(dāng)于多次執(zhí)行GetNext操作,這兩個(gè)參數(shù)用于設(shè)置執(zhí)行GetNext操作次數(shù)。
Error status:用于表示在處理請(qǐng)求時(shí)出現(xiàn)的狀況。
Error index:差錯(cuò)索引。當(dāng)出現(xiàn)異常情況時(shí),提供變量綁定列表(Variable bindings)中導(dǎo)致異常的變量的信息。
Variable bindings:變量綁定列表,由變量名和變量值對(duì)組成。
通過捕獲報(bào)文工具獲取設(shè)備發(fā)送的SNMPv2c版本Get請(qǐng)求報(bào)文如圖1-5所示,SNMPv2c版本GetNext請(qǐng)求報(bào)文如圖1-6所示。SNMPv2c版本GetBulk請(qǐng)求報(bào)文如圖1-7所示。
圖1-5 SNMPv2c版本Get請(qǐng)求報(bào)文



SNMPv3查詢報(bào)文格式如圖1-8所示,SNMPv3報(bào)文主要由版本、MsgID、MaxSize、Flags、Security Model、Security Parameters、Context EngineID、Context Name和SNMP PDU組成。SNMPv3報(bào)文的SNMP PDU的格式與SNMPv2c的一致。SNMPv3版本的報(bào)文可以使用鑒權(quán)機(jī)制,會(huì)對(duì)Context EngineID、Context Name和SNMP PDU進(jìn)行加密。
圖1-8 SNMPv3報(bào)文格式

報(bào)文中的主要字段定義如下:
版本:表示SNMP的版本,如果是SNMPv3報(bào)文則對(duì)應(yīng)字段值為3。
MsgID:請(qǐng)求報(bào)文的序列號(hào)。
MaxSize:消息發(fā)送者所能夠容納的消息最大字節(jié),同時(shí)也表明了發(fā)送者能夠接收到的最大字節(jié)數(shù)。
Flags:消息標(biāo)識(shí)位,占一個(gè)字節(jié),有三個(gè)特征位:reportableFlag,privFlag和authFlag。
reportableFlag=1,在能夠?qū)е翿eport PDU生成的情況下,SNMPv3報(bào)文接收方必須向發(fā)送方發(fā)送Report PDU;reportableFlag=0,SNMPv3報(bào)文接收方不發(fā)送Report PDU。只有在SNMP PDU部分不能被解密時(shí)(比如由于密鑰錯(cuò)誤導(dǎo)致解密失敗等)才會(huì)用到Report。
privFlag=1,對(duì)SNMPv3報(bào)文進(jìn)行加密;privFlag=0,不對(duì)SNMPv3報(bào)文進(jìn)行加密。
authFlag=1,對(duì)SNMPv3報(bào)文進(jìn)行鑒權(quán);authFlag=0,不對(duì)SNMPv3報(bào)文進(jìn)行鑒權(quán)。
除了privFlag=1,authFlag=0的情況外,其他任意組合都可以,所以在配置SNMPv3的安全級(jí)別的時(shí)候需要注意:如果用戶組是privacy級(jí)別,用戶和告警主機(jī)就必須是privacy級(jí)別;用戶組是authentication級(jí)別,用戶和告警主機(jī)可以是privacy或者authentication級(jí)別。
SecurityModel:消息采用的安全模型,發(fā)送方和接收方必須采用相同的安全模型。
SecurityParameters:安全參數(shù),包含SNMP實(shí)體引擎的相關(guān)信息、用戶名、鑒權(quán)參數(shù)、加密參數(shù)等安全信息。
Context EngineID:SNMP唯一標(biāo)識(shí)符,和PDU類型一起決定應(yīng)該發(fā)往哪個(gè)應(yīng)用程序。
Context Name:用于確定Context EngineID對(duì)被管理設(shè)備的MIB視圖。
SNMPv3提供了鑒權(quán)機(jī)制,推薦用戶使用SNMPv3版本。通過捕獲報(bào)文工具獲取設(shè)備發(fā)送的SNMPv3版本加密的Get請(qǐng)求報(bào)文如圖1-9所示,SNMPv3版本不加密的Get請(qǐng)求報(bào)文如圖1-10所示。
圖1-9 SNMPv3版本加密的Get請(qǐng)求報(bào)文


SNMP查詢操作的工作原理
不同版本的SNMP查詢操作的工作原理基本一致,唯一的區(qū)別是SNMPv3版本增加了身份驗(yàn)證和加密處理。下面以SNMPv2c版本的Get操作為例介紹SNMP查詢操作的工作原理。
假定NMS想要獲取被管理設(shè)備MIB節(jié)點(diǎn)sysContact的值,使用可讀團(tuán)體名為public,過程如下所示:
NMS:向SNMP Agent發(fā)送Get請(qǐng)求報(bào)文。報(bào)文中各字段的設(shè)置如下:版本號(hào)為所使用的SNMP版本;團(tuán)體名為public;PDU中PDU類型為Get類型,綁定變量填入MIB節(jié)點(diǎn)名sysContact。
SNMP Agent:首先對(duì)報(bào)文中攜帶版本號(hào)和團(tuán)體名進(jìn)行認(rèn)證,認(rèn)證成功后,SNMP Agent根據(jù)請(qǐng)求查詢MIB中的sysContact節(jié)點(diǎn),得到sysContact的值并將其封裝到Response報(bào)文中的PDU,向NMS發(fā)送響應(yīng);如果查詢不成功,SNMP Agent會(huì)向NMS發(fā)送出錯(cuò)響應(yīng)。

SNMP設(shè)置

SNMP設(shè)置是指NMS主動(dòng)向SNMP Agent發(fā)送對(duì)設(shè)備進(jìn)行Set操作的請(qǐng)求,如圖1-11所示。SNMP Agent接收到Set請(qǐng)求后,通過MIB表完成相應(yīng)指令,并將結(jié)果反饋給NMS。
SNMP設(shè)置操作只有一種Set,NMS使用該操作可設(shè)置SNMP Agent中的一個(gè)或多個(gè)參數(shù)值。
圖1-11 SNMP Set操作

SNMP Set操作的報(bào)文
SNMPv1和SNMPv2c的Set操作報(bào)文格式如圖1-12所示。一般情況下,SNMPv3的Set操作信息是經(jīng)過加密封裝在SNMP PDU中,其格式與SNMPv2c的Set操作報(bào)文格式一致。
圖1-12 SNMPv1/SNMPv2c Set操作報(bào)文格式

報(bào)文中主要字段的含義如下:
Request ID:用于匹配請(qǐng)求和響應(yīng),SNMP給每個(gè)請(qǐng)求分配全局唯一的ID。
Error status:用于表示在處理請(qǐng)求時(shí)出現(xiàn)的狀況。
Error index:差錯(cuò)索引。當(dāng)出現(xiàn)異常情況時(shí),提供變量綁定列表(Variable bindings)中導(dǎo)致異常的變量的信息。
Variable bindings:變量綁定列表,由變量名和變量值對(duì)組成。
通過捕獲報(bào)文工具獲取設(shè)備發(fā)送的SNMPv2c版本Set請(qǐng)求報(bào)文如圖1-13所示。
圖1-13 SNMPv2c版本Set請(qǐng)求報(bào)文

@歡迎關(guān)注公眾號(hào):網(wǎng)絡(luò)工程師阿龍
SNMP Set操作的工作原理
不同版本的SNMP Set操作的工作原理基本一致,唯一的區(qū)別是SNMPv3版本增加了身份驗(yàn)證和加密處理。下面以SNMPv3版本的Set操作為例介紹SNMP Set操作的工作原理。
假定NMS想要設(shè)置被管理設(shè)備MIB節(jié)點(diǎn)sysName的值為HUAWEI,過程如下所示:
NMS:向Agent發(fā)送不帶安全參數(shù)的Set請(qǐng)求報(bào)文,向SNMP Agent獲取Context EngineID、Context Name和安全參數(shù)(SNMP實(shí)體引擎的相關(guān)信息)。
SNMP Agent:響應(yīng)NMS的請(qǐng)求,并向NMS反饋請(qǐng)求的參數(shù)。
NMS:再次向SNMP Agent發(fā)送Set請(qǐng)求,報(bào)文中各字段的設(shè)置如下:
版本:SNMPv3
報(bào)文頭數(shù)據(jù):指明采用鑒權(quán)、加密方式。
安全參數(shù):NMS通過配置的算法計(jì)算出鑒權(quán)參數(shù)和加密參數(shù)。將這些參數(shù)和獲取的安全參數(shù)填入相應(yīng)字段。
PDU:將獲取的Context EngineID和Context Name填入相應(yīng)字段,PDU類型設(shè)置為Set,綁定變量填入MIB節(jié)點(diǎn)名sysName和需要設(shè)置的值HUAWEI,并使用已配置的加密算法對(duì)PDU進(jìn)行加密。
SNMP Agent:首先對(duì)報(bào)文中攜帶版本號(hào)和團(tuán)體名進(jìn)行認(rèn)證,認(rèn)證成功后,SNMP Agent根據(jù)請(qǐng)求設(shè)置管理變量在管理信息庫(kù)MIB中對(duì)應(yīng)的節(jié)點(diǎn),設(shè)置成功后向NMS發(fā)送響應(yīng);如果設(shè)置不成功,Agent會(huì)向NMS發(fā)送出錯(cuò)響應(yīng)。

SNMP Traps

SNMP Traps是指SNMP Agent主動(dòng)將設(shè)備產(chǎn)生的告警或事件上報(bào)給NMS,以便網(wǎng)絡(luò)管理員及時(shí)了解設(shè)備當(dāng)前運(yùn)行的狀態(tài)。
SNMP Agent上報(bào)SNMP Traps有兩種方式:Trap和Inform。SNMPv1版本不支持Inform。Trap和Inform的區(qū)別在于,SNMP Agent通過Inform向NMS發(fā)送告警或事件后,NMS需要回復(fù)InformResponse進(jìn)行確認(rèn),如圖1-14所示。
圖1-14 SNMP Traps操作

SNMP Traps報(bào)文格式
SNMPv1的Trap操作報(bào)文格式如圖1-15所示,Trap PDU由PDU type、enterprise、Agent addr、Generic trap、Specific trap、Time stamp和Variable bindings組成。
圖1-15 SNMPv1版本Trap操作報(bào)文格式

報(bào)文中的主要字段定義如下:
enterprise:Trap源(生成Trap的設(shè)備)的類型。
Agent addr:Trap源的地址。
Generic trap:通用Trap類型,包括coldStart、warmStart、linkDown、linkUp、authenticationFailure、egpNeighborLoss、enterpriseSpecific。
Specific trap:企業(yè)私有Trap信息。
Time stamp:上次重新初始化網(wǎng)絡(luò)實(shí)體和產(chǎn)生Trap之間所持續(xù)的時(shí)間。
Variable bindings:變量綁定列表,由變量名和變量值對(duì)組成。
通過捕獲報(bào)文工具獲取設(shè)備發(fā)送的SNMPv1版本Trap報(bào)文如圖1-16所示。
圖1-16 SNMPv1版本Trap報(bào)文

SNMPv2c的Trap操作的報(bào)文格式和Inform操作的報(bào)文格式如圖1-17所示。一般情況下,SNMPv3的Trap操作或inform操作是經(jīng)過加密封裝在SNMP PDU中,其格式與SNMPv2c的Trap操作或inform操作的報(bào)文格式一致。
圖1-17 SNMPv2版本Trap/Inform操作報(bào)文格式

報(bào)文中的主要字段定義如下:
Request ID:用于匹配請(qǐng)求和響應(yīng),SNMP給每個(gè)請(qǐng)求分配全局唯一的ID。
Variable bindings:變量綁定列表,由變量名和變量值對(duì)組成。
通過捕獲報(bào)文工具獲取設(shè)備發(fā)送的SNMPv2版本Trap報(bào)文如圖1-18所示,SNMPv2版本Inform報(bào)文如圖1-19所示。
圖1-18 SNMPv2版本Trap報(bào)文

圖1-19 SNMPv2版本Inform報(bào)文

SNMP Traps工作原理
Trap操作工作原理
Trap不屬于NMS對(duì)被管理設(shè)備的基本操作,它是被管理設(shè)備的自發(fā)行為。當(dāng)被管理設(shè)備達(dá)到告警的觸發(fā)條件時(shí),會(huì)通過SNMP Agent向NMS發(fā)送Trap消息,告知設(shè)備側(cè)出現(xiàn)的異常情況,便于網(wǎng)絡(luò)管理人員及時(shí)處理。例如被管理設(shè)備熱啟動(dòng)后,SNMP Agent會(huì)向NMS發(fā)送warmStart的Trap。
這種Trap信息是受限制的。只有在設(shè)備端的模塊達(dá)到模塊預(yù)定義的告警觸發(fā)條件時(shí),SNMP Agent才會(huì)向管理進(jìn)程報(bào)告。這種方法的好處是僅在嚴(yán)重事件發(fā)生時(shí)才發(fā)送Trap信息,減少報(bào)文交互產(chǎn)生的流量。
Inform操作工作原理
Inform操作也是被管理設(shè)備向NMS主動(dòng)發(fā)送告警。與Trap告警不同的是,被管理設(shè)備發(fā)送Inform告警后,需要NMS進(jìn)行接收確認(rèn)。如果被管理設(shè)備沒有收到確認(rèn)信息則:
將告警或事件暫時(shí)保存在Inform緩存中。
重復(fù)發(fā)送該告警或事件,直到NMS確認(rèn)收到該告警或者發(fā)送次數(shù)達(dá)到最大重傳次數(shù)。
被管設(shè)備上會(huì)生成相應(yīng)的告警或事件日志。
由此可知,使用Inform操作會(huì)占用較多的系統(tǒng)資源。

SNMP 端口號(hào)

SNMP報(bào)文是普通的UDP報(bào)文,協(xié)議中規(guī)定有兩個(gè)默認(rèn)端口號(hào):
端口號(hào)161:NMS發(fā)送Get、GetNext、GetBulk和Set操作請(qǐng)求以及SNMP Agent響應(yīng)這些請(qǐng)求操作時(shí),使用該端口號(hào)。
該端口號(hào)支持用戶配置,但是需要保證NMS發(fā)送請(qǐng)求報(bào)文使用的端口號(hào)與SNMP Agent響應(yīng)請(qǐng)求報(bào)文使用的端口號(hào)要一致。
端口號(hào)162:SNMP Agent向NMS發(fā)送Trap或Inform時(shí),使用該端口號(hào)。
該端口號(hào)支持用戶配置,但是需要保證SNMP Agent發(fā)送Trap或Inform的端口號(hào)與NMS監(jiān)聽Trap或Inform的端口號(hào)要一致。
來源:公眾號(hào) 網(wǎng)絡(luò)工程師阿龍
關(guān)注「開源Linux」加星標(biāo),提升IT技能

