隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)管理變得日益重要。網(wǎng)絡(luò)管理員需要一種高效、可靠的方式來(lái)監(jiān)控網(wǎng)絡(luò)設(shè)備、收集狀態(tài)信息并對(duì)其進(jìn)行配置。簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)正是為此目的而設(shè)計(jì)的。本文將對(duì)SNMP進(jìn)行詳細(xì)介紹,并提供使用SNMP進(jìn)行網(wǎng)絡(luò)管理的基本指南。
1.簡(jiǎn)介
SNMP(Simple Network Management Protocol)是一個(gè)基于互聯(lián)網(wǎng)協(xié)議族(IP)的網(wǎng)絡(luò)管理標(biāo)準(zhǔn),用于在IP網(wǎng)絡(luò)中的管理節(jié)點(diǎn)與被管理節(jié)點(diǎn)之間進(jìn)行通信,以實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)設(shè)備的遠(yuǎn)程監(jiān)控和管理。SNMP具有簡(jiǎn)單、高效、易于實(shí)現(xiàn)和擴(kuò)展性強(qiáng)等優(yōu)點(diǎn),因此在網(wǎng)絡(luò)管理領(lǐng)域得到了廣泛應(yīng)用。
2.SNMP的組成和版本
2.1.SNMP協(xié)議的組成
SNMP協(xié)議架構(gòu)主要包括以下幾個(gè)部分:
??
1.管理信息庫(kù)(MIB):MIB是一個(gè)信息數(shù)據(jù)庫(kù),用于存儲(chǔ)被管理設(shè)備的信息,如設(shè)備類型、接口狀態(tài)、路由表等。MIB是SNMP的核心,管理站通過(guò)SNMP協(xié)議獲取MIB中的信息,以實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)設(shè)備的監(jiān)控和管理。
2.管理站(NMS):NMS是網(wǎng)絡(luò)管理系統(tǒng)中的核心組件,負(fù)責(zé)收集、處理和存儲(chǔ)來(lái)自被管理設(shè)備的信息。NMS通常運(yùn)行在網(wǎng)絡(luò)管理中心的服務(wù)器上,通過(guò)網(wǎng)絡(luò)管理軟件實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)設(shè)備的遠(yuǎn)程監(jiān)控和管理。
3.代理(Agent):Agent是被管理設(shè)備上的軟件模塊,負(fù)責(zé)接收NMS的查詢請(qǐng)求,并返回MIB中的相關(guān)信息。同時(shí),Agent還可以將設(shè)備的狀態(tài)變化通知給NMS。
2.2.SNMP協(xié)議版本
目前SNMP協(xié)議有三個(gè)版本,分別是:V1、V2和V3
?V1:SNMP協(xié)議的最初版本
?V2:在V1的基礎(chǔ)上增加community(團(tuán)體名),這里的團(tuán)體名可以理解為密碼
?V3:增加認(rèn)證和對(duì)密文的傳輸?shù)闹С郑@種方式安全等級(jí)最高
3.SNMP報(bào)文
??
SNMP報(bào)文包含三個(gè)部分
?版本號(hào):表明當(dāng)前使用的版本,管理站和代理之間的版本號(hào)必須相同才能通信
?團(tuán)體名:團(tuán)體(community)是基本的安全機(jī)制,用于實(shí)現(xiàn)SNMP網(wǎng)絡(luò)管理員訪問(wèn)SNMP管理代理時(shí)的身份驗(yàn)證,類似于密碼,默認(rèn)值為 public。團(tuán)體名(Community name)是管理代理的口令,管理員被允許訪問(wèn)數(shù)據(jù)對(duì)象的前提就是網(wǎng)絡(luò)管理員知道網(wǎng)絡(luò)代理的口令。
?PDU:snmp的數(shù)據(jù)結(jié)構(gòu)
3.1.PDU詳細(xì)報(bào)文
??
3.2.PDU類型
?get-request:從代理(本質(zhì)上是設(shè)備)獲取一個(gè)或多個(gè)參數(shù)值
?get-next-request:從代理緊接著取出下一個(gè)參數(shù)值
?set-request:設(shè)置代理一個(gè)或多個(gè)參數(shù)值
?get-response:對(duì)上述三種請(qǐng)求的響應(yīng)
?trap:設(shè)備主動(dòng)上報(bào)的數(shù)據(jù)
3.3.差錯(cuò)狀態(tài)
?noError:無(wú)錯(cuò)誤
?tooBig:代理無(wú)法將回答裝入到一個(gè)SNMP報(bào)文中
?noSuchName:操作指明了一個(gè)不存在的變量
?badValue:一個(gè)set操作指明了一個(gè)無(wú)效值或無(wú)效語(yǔ)法
?readOnly:管理進(jìn)程試圖修改一個(gè)只讀變量
?genErr:某些其他差錯(cuò)
3.4.trap類型
?coldStart:代理進(jìn)行了初始化
?warmStart:代理進(jìn)行了重新初始化
?linkDown:一個(gè)接口從工作狀態(tài)變?yōu)楣收蠣顟B(tài)
?linkUp:一個(gè)接口從故障狀態(tài)變?yōu)楣ぷ鳡顟B(tài)
?authenticationFailure:從SNMP管理進(jìn)程接收到具有一個(gè)無(wú)效共同體的報(bào)文
?egpNeighborLoss:一個(gè)EGP相鄰路由器變?yōu)楣收蠣顟B(tài)
?enterpriseSpecific:代理自定義事件,需要用后面的“特定代碼”來(lái)指明
4.MIB詳解
4.1.MIB樹結(jié)構(gòu)
MIB以樹狀結(jié)構(gòu)進(jìn)行存儲(chǔ),樹的葉子節(jié)點(diǎn)表示管理對(duì)象,它可以通過(guò)從根節(jié)點(diǎn)開始的一條惟一路徑來(lái)識(shí)別,這也就是OID(Object Identifier)。
OID是由一些系列非負(fù)整數(shù)組成,用于唯一標(biāo)識(shí)管理對(duì)象在MIB樹中的位置。由SMI來(lái)保證OID不會(huì)沖突。
MIB文件一旦發(fā)布,OID就和被定義的對(duì)象綁定,不能修改。MIB節(jié)點(diǎn)不能被刪除,只能將它的狀態(tài)置為“obsolete”,表明該節(jié)點(diǎn)已經(jīng)被廢除。
在上圖的樹形結(jié)構(gòu)中,mgmt對(duì)象可以標(biāo)識(shí)為:{ iso(1) org(3) dod(6) internet(1) mgmt(2) },簡(jiǎn)單標(biāo)記為:1.3.6.1.2,這種標(biāo)識(shí)就叫做OID。
NMS通過(guò)OID引用Agent中的對(duì)象。
4.2.MIB分類
MIB可以分為公有MIB和私有MIB兩種。
?公有MIB:一般由RFC定義,主要用來(lái)對(duì)各種公有協(xié)議進(jìn)行結(jié)構(gòu)化設(shè)計(jì)和接口標(biāo)準(zhǔn)化處理。大多數(shù)的設(shè)備制造商都需要按照RFC的定義來(lái)提供SNMP接口。
?私有MIB:是公有MIB的必要補(bǔ)充,當(dāng)公司自行開發(fā)私有協(xié)議或者特有功能時(shí),可以利用私有MIB來(lái)完善SNMP接口的管理功能,同時(shí)對(duì)第三方網(wǎng)管軟件管理存在私有協(xié)議或特有功能的設(shè)備提供支持。
網(wǎng)絡(luò)設(shè)備的很多數(shù)據(jù)都以MIB的樹結(jié)構(gòu)存儲(chǔ),根據(jù)數(shù)據(jù)對(duì)應(yīng)的OID,我們便可以獲取到網(wǎng)絡(luò)設(shè)備的各種統(tǒng)計(jì)數(shù)據(jù)和配置數(shù)據(jù),實(shí)現(xiàn)網(wǎng)絡(luò)設(shè)備的監(jiān)控。
5.SNMP實(shí)踐
5.1.snmp命令
5.1.1.snmpwalk
用于獲取 SNMP 設(shè)備上的數(shù)據(jù),它遍歷設(shè)備的 SNMP 樹,并返回特定對(duì)象標(biāo)識(shí)符(OID)的值,通常用于查詢?cè)O(shè)備的信息和狀態(tài)。使用 snmpwalk 可以獲取有關(guān)設(shè)備的詳細(xì)信息,例如接口、系統(tǒng)信息、傳感器狀態(tài)等。以下是 snmpwalk 的一般用法:
snmpwalk -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID SNMP_VERSION:SNMP 版本,通常是 "1"(SNMPv1)或 "2c"(SNMPv2c)。 COMMUNITY_STRING:SNMP 社區(qū)字符串,用于身份驗(yàn)證。 TARGET_HOST:目標(biāo)設(shè)備的主機(jī)名或 IP 地址。 OID:要查詢的對(duì)象標(biāo)識(shí)符。
5.1.2.snmptrap
snmptrap 用于生成和發(fā)送 SNMP 陷阱(trap)到 SNMP 管理器,這些陷阱通常表示設(shè)備上發(fā)生的重要事件或告警。snmptrap 常用于監(jiān)控設(shè)備狀態(tài)變化和異常事件。以下是 snmptrap 的一般用法:
snmptrap -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST TRAP_OID [OID_VALUE] [OPTIONS] SNMP_VERSION:SNMP 版本,通常是 "1"(SNMPv1)或 "2c"(SNMPv2c)。 COMMUNITY_STRING:SNMP 社區(qū)字符串,用于身份驗(yàn)證。 TARGET_HOST:目標(biāo) SNMP 管理器的主機(jī)名或 IP 地址。 TRAP_OID:陷阱的對(duì)象標(biāo)識(shí)符,表示事件類型。 OID_VALUE:可選,與陷阱相關(guān)的 OID 值。 OPTIONS:可選,包括發(fā)送陷阱的其他選項(xiàng),如 -p(指定陷阱端口)等。
5.1.3.snmpget
用于獲取單個(gè) SNMP 對(duì)象的值。你可以指定要查詢的 OID,它將返回相應(yīng)的值。
snmpget -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
snmpget -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
5.1.4.snmpset
用于設(shè)置 SNMP 對(duì)象的值。它允許你修改設(shè)備上的特定 OID 的值。
snmpset -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID TYPE VALUE
5.1.5.snmpbulkwalk
類似于 snmpwalk,但它使用了 SNMP Bulk Protocol(SNMPv2c)來(lái)提高效率,特別對(duì)于大型數(shù)據(jù)集。
snmpbulkwalk -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
5.1.6.snmpinform
用于向 SNMP 管理器發(fā)送 SNMP INFORM 消息,這是一種更可靠的通知機(jī)制,它需要管理器進(jìn)行確認(rèn)。
snmpinform -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
在網(wǎng)絡(luò)設(shè)備信息采集中,我們通常會(huì)通過(guò)snmpget和snmpwalk命令獲取網(wǎng)絡(luò)設(shè)備的各種運(yùn)行和配置數(shù)據(jù)。
5.2.代碼實(shí)現(xiàn)
基于以上知識(shí),我們考慮通過(guò)代碼的方式執(zhí)行snmp命令,獲取設(shè)備的基本信息,實(shí)現(xiàn)設(shè)備的自動(dòng)化監(jiān)控。本文所有案例都基于Java語(yǔ)言,其余語(yǔ)言類似。
5.2.1.引入依賴
如下所示,我們引入snmp的依賴:
org.snmp4j/groupId?> snmp4j/artifactId?> 2.7.0/version?> /dependency?>
5.2.1.代碼實(shí)現(xiàn)
public class SnmpUtils { /** * 根據(jù)oid獲取數(shù)據(jù) * @param ip * @param community * @param oid * @return */ @SneakyThrows public static void snmpGet(String ip, String community, String oid) { Snmp snmp = null; try { snmp = new Snmp(new DefaultUdpTransportMapping()); // 構(gòu)造一個(gè)UDP snmp.listen(); // 開始監(jiān)聽(tīng)snmp消息 CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString(community));// snmpv2的團(tuán)體名 target.setVersion(SnmpConstants.version2c); // snmp版本 target.setAddress(new UdpAddress(ip)); target.setTimeout(1000); // 時(shí)延 target.setRetries(2); // 重傳 PDU pdu = new PDU(); pdu.setType(PDU.GET); pdu.addOID(new VariableBinding(new OID(oid))); ResponseEvent responseEvent = snmp.get(pdu, target); PDU response = responseEvent.getResponse(); Vector? extends VariableBinding?> bindings = response.getVariableBindings(); bindings.forEach(item ->{ System.out.println(String.format("OID為:%s的值為:%s", item.getOid().toDottedString(), item.getVariable().getSyntaxString())); }); }finally { if (snmp != null) { snmp.close(); } } } /** * 根據(jù)oids獲取數(shù)據(jù) * @param ip * @param community * @return */ @SneakyThrows public static void getTable(String ip, String community, List oidList) { Snmp snmp = null; LinkedHashMap> resMap = new LinkedHashMap?>(); try { snmp = new Snmp(new DefaultUdpTransportMapping()); // 構(gòu)造一個(gè)UDP snmp.listen(); // 開始監(jiān)聽(tīng)snmp消息 CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString(community));// snmpv2的團(tuán)體名 target.setVersion(SnmpConstants.version2c); // snmp版本 target.setAddress(new UdpAddress(ip)); target.setTimeout(1000); // 時(shí)延 target.setRetries(2); // 重傳 TableUtils utils = new TableUtils(snmp, new DefaultPDUFactory( PDU.GETNEXT));// GETNEXT or GETBULK utils.setMaxNumRowsPerPDU(109); // only for GETBULK, set max-repetitions, default is 10 utils.setCheckLexicographicOrdering(false); OID[] oids = oidList.stream().filter(StringUtils::isNotBlank).map(OID::new).toArray(OID[]::new); List table = utils.getTable(target, oids, null, null); table.forEach(item ->{ for (VariableBinding column : item.getColumns()) { System.out.println(String.format("當(dāng)前的oid為:%s,結(jié)果為:%s", column.getOid().toDottedString(), column.getVariable().getSyntaxString())); } }); }finally { if (snmp != null) { snmp.close(); } } } }
其中snmpGet方法對(duì)應(yīng)snmpget命令,snmpWalk方法對(duì)應(yīng)snmpwalk命令。
6.總結(jié)
本文開篇即對(duì)SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)的基本概念與核心構(gòu)成進(jìn)行了全面闡述,緊接著深入剖析了SNMP命令在實(shí)際網(wǎng)絡(luò)管理場(chǎng)景中的具體應(yīng)用。在文章的最后部分,通過(guò)Java編程語(yǔ)言的實(shí)踐應(yīng)用,本文成功展示了SNMP命令的實(shí)現(xiàn)過(guò)程。對(duì)SNMP協(xié)議的深入理解與掌握,無(wú)疑將為網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)監(jiān)控及多元化自動(dòng)化管理提供有力支持,進(jìn)而顯著提升網(wǎng)絡(luò)運(yùn)維的工作效率。
審核編輯 黃宇
-
SNMP
+關(guān)注
關(guān)注
0文章
90瀏覽量
30241 -
設(shè)備監(jiān)控
+關(guān)注
關(guān)注
0文章
16瀏覽量
6317 -
京東云
+關(guān)注
關(guān)注
0文章
176瀏覽量
128
發(fā)布評(píng)論請(qǐng)先 登錄

snmp協(xié)議抓包分析
Labview監(jiān)控帶有snmp網(wǎng)卡設(shè)備有沒(méi)有問(wèn)題?
用LWIP的SNMP監(jiān)控嵌入式設(shè)備
SNMP協(xié)議在WAGO工業(yè)以太網(wǎng)系統(tǒng)中的應(yīng)用是什么?
AN_基于FreeRTOS+LwIP的SNMP實(shí)現(xiàn)方案
多協(xié)議轉(zhuǎn)換網(wǎng)關(guān)支持OPC UA及SNMP協(xié)議
什么是簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)
基于SNMP協(xié)議的電網(wǎng)實(shí)時(shí)視頻監(jiān)控系統(tǒng)設(shè)計(jì)

snmp協(xié)議詳解

SNMP五種協(xié)議數(shù)據(jù)單元以及SNMP框架組成
使用 ntopng 和 SNMP 監(jiān)視網(wǎng)絡(luò)設(shè)備

評(píng)論