首页 > 应用开发 > IT综合 > SNMP协议在设备监控中的使用
随着网络技术的飞速发展,网络管理变得日益重要。网络管理员需要一种高效、可靠的方式来监控网络设备、收集状态信息并对其进行配置。简单网络管理协议(SNMP)正是为此目的而设计的。本文将对SNMP进行详细介绍,并提供使用SNMP进行网络管理的基本指南。
SNMP(Simple Network Management Protocol)是一个基于互联网协议族(IP)的网络管理标准,用于在IP网络中的管理节点与被管理节点之间进行通信,以实现对网络设备的远程监控和管理。SNMP具有简单、高效、易于实现和扩展性强等优点,因此在网络管理领域得到了广泛应用。
SNMP协议架构主要包括以下几个部分:

目前SNMP协议有三个版本,分别是:V1、V2和V3

SNMP报文包含三个部分
MIB以树状结构进行存储,树的叶子节点表示管理对象,它可以通过从根节点开始的一条惟一路径来识别,这也就是OID(Object Identifier)。
OID是由一些系列非负整数组成,用于唯一标识管理对象在MIB树中的位置。由SMI来保证OID不会冲突。
MIB文件一旦发布,OID就和被定义的对象绑定,不能修改。MIB节点不能被删除,只能将它的状态置为“obsolete”,表明该节点已经被废除。
在上图的树形结构中,mgmt对象可以标识为:{ iso(1) org(3) dod(6) internet(1) mgmt(2) },简单标记为:1.3.6.1.2,这种标识就叫做OID。
NMS通过OID引用Agent中的对象。
MIB可以分为公有MIB和私有MIB两种。
网络设备的很多数据都以MIB的树结构存储,根据数据对应的OID,我们便可以获取到网络设备的各种统计数据和配置数据,实现网络设备的监控。
用于获取 SNMP 设备上的数据,它遍历设备的 SNMP 树,并返回特定对象标识符(OID)的值,通常用于查询设备的信息和状态。使用 snmpwalk 可以获取有关设备的详细信息,例如接口、系统信息、传感器状态等。以下是 snmpwalk 的一般用法:
snmpwalk -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID SNMP_VERSION:SNMP 版本,通常是 "1"(SNMPv1)或 "2c"(SNMPv2c)。 COMMUNITY_STRING:SNMP 社区字符串,用于身份验证。 TARGET_HOST:目标设备的主机名或 IP 地址。 OID:要查询的对象标识符。
snmptrap 用于生成和发送 SNMP 陷阱(trap)到 SNMP 管理器,这些陷阱通常表示设备上发生的重要事件或告警。snmptrap 常用于监控设备状态变化和异常事件。以下是 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 社区字符串,用于身份验证。 TARGET_HOST:目标 SNMP 管理器的主机名或 IP 地址。 TRAP_OID:陷阱的对象标识符,表示事件类型。 OID_VALUE:可选,与陷阱相关的 OID 值。 OPTIONS:可选,包括发送陷阱的其他选项,如 -p(指定陷阱端口)等。
用于获取单个 SNMP 对象的值。你可以指定要查询的 OID,它将返回相应的值。
snmpget -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
snmpget -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
用于设置 SNMP 对象的值。它允许你修改设备上的特定 OID 的值。
snmpset -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID TYPE VALUE
类似于 snmpwalk,但它使用了 SNMP Bulk Protocol(SNMPv2c)来提高效率,特别对于大型数据集。
snmpbulkwalk -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
用于向 SNMP 管理器发送 SNMP INFORM 消息,这是一种更可靠的通知机制,它需要管理器进行确认。
snmpinform -v SNMP_VERSION -c COMMUNITY_STRING TARGET_HOST OID
在网络设备信息采集中,我们通常会通过snmpget和snmpwalk命令获取网络设备的各种运行和配置数据。
基于以上知识,我们考虑通过代码的方式执行snmp命令,获取设备的基本信息,实现设备的自动化监控。本文所有案例都基于Java语言,其余语言类似。
5.2.1.引入依赖
如下所示,我们引入snmp的依赖:
<dependency> <groupId>org.snmp4j</groupId> <artifactId>snmp4j</artifactId> <version>2.7.0</version></dependency>
5.2.1.代码实现
public class SnmpUtils {
/**
* 根据oid获取数据
* @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()); // 构造一个UDP
snmp.listen(); // 开始监听snmp消息
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(community));// snmpv2的团体名
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();
}
}
}
/**
* 根据oids获取数据
* @param ip
* @param community
* @return
*/
@SneakyThrows
public static void getTable(String ip, String community, List<String> oidList)
{
Snmp snmp = null;
LinkedHashMap<String, List<String>> resMap = new LinkedHashMap<>();
try {
snmp = new Snmp(new DefaultUdpTransportMapping()); // 构造一个UDP
snmp.listen(); // 开始监听snmp消息
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(community));// snmpv2的团体名
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<TableEvent> table = utils.getTable(target, oids, null, null);
table.forEach(item ->{
for (VariableBinding column : item.getColumns()) {
System.out.println(String.format("当前的oid为:%s,结果为:%s", column.getOid().toDottedString(), column.getVariable().getSyntaxString()));
}
});
}finally {
if (snmp != null) {
snmp.close();
}
}
}}
其中snmpGet方法对应snmpget命令,snmpWalk方法对应snmpwalk命令。
本文开篇即对SNMP(简单网络管理协议)的基本概念与核心构成进行了全面阐述,紧接着深入剖析了SNMP命令在实际网络管理场景中的具体应用。在文章的最后部分,通过Java编程语言的实践应用,本文成功展示了SNMP命令的实现过程。对SNMP协议的深入理解与掌握,无疑将为网络设备的数据监控及多元化自动化管理提供有力支持,进而显著提升网络运维的工作效率。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70037994/viewspace-3089217/ ,如需转载,请注明出处,否则将追究法律责任。