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

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

snmp協(xié)議詳解

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

評論