SNMP简介及java实现

目录

SNMP介绍

为什么要用SNMP

应用

java实现


SNMP介绍

SNMP是一种用于管理网络设备的协议。它是一种标准化的协议,被用于监控和管理网络设备,包括路由器、交换机、服务器、打印机和其他设备。
SNMP协议的基本组成部分包括:
管理站(Management Station):通常是一个PC或服务器,用于监控和管理网络设备。
管理代理(Management Agent):运行在网络设备上的软件,负责管理和监控网络设备,并提供信息给管理站。
MIB(Management Information Base):一个层次结构的数据库,包含了网络设备的信息。MIB的每个节点都对应着网络设备的一个属性或状态。
SNMP协议:用在管理站和管理代理之间传输信息的协议。SNMP消息包含了操作类型、对象标识符和值。SNMP协议定义了一系列操作,可以通过这些操作获取、设置和监控网络设备的属性和状态。这些操作包括:
1、GET:获取一个属性或状态的值。
2、SET:设置一个属性或状态的值。
3、GETNEXT:获取下一个节点的值。
4、GETBULK:获取一组节点的值。
5、TRAP:向管理站发送一个警告或通知。

SNMP协议的最新版本是SNMPv3,它提供了安全性和访问控制机制,以保护网络设备的安全性和保密性。

为什么要用SNMP

随着网络技术的飞速发展,在网络不断普及的同时也给网络管理带来了一些问题:网络设备数量成几何级数增加,使得网络管理员对设备的管理变得越来越困难;同时,网络作为一个复杂的分布式系统,其覆盖地域不断扩大,也使得对这些设备进行实时监控和故障排查变得极为困难。
网络设备种类多种多样,不同设备厂商提供的管理接口(如命令行接口)各不相同,这使得网络管理变得愈发复杂。
在这种背景下,SNMP应运而生,SNMP是广泛应用于TCP/IP网络的网络管理标准协议,该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。通过"利用网络管理网络"的方式:网络管理员可以利用SNMP平台在网络上的任意节点完成信息查询、信息修改和故障排查等工作,工作效率得以提高。
屏蔽了设备间的物理差异,SNMP仅提供最基本的功能集,使得管理任务与被管理设备的物理特性、网络类型相互独立,因而可以实现对不同设备的统一管理,管理成本低。
设计简单、运行代价低,SNMP采用"尽可能简单"的设计思想,其在设备上添加的软件/硬件、报文的种类和报文的格式都力求简单,因而运行SNMP给设备造成的影响和代价都被最小化。
SNMP的基本组件
SNMP基本组件包括网络管理系统NMS(Network Management System)、代理进程(Agent)、被管对象(Managed Object)和管理信息库(Management Information Base)。
优势
1、简单易用:SNMP协议是一种简单易用的协议,使用方便、易于管理。
2、标准化:SNMP协议是一种标准化的协议,被广泛应用于网络管理领域。
3、实时监控:SNMP协议可以实时监控网络设备的性能和状态,及时发现和解决问题。
4、集中管理:SNMP协议可以通过集中管理工具对网络设备进行统一管理,提高管理效率和管理水平。
5、可扩展性:SNMP协议具有良好的可扩展性,可以适应不同的网络管理需求和应用场景。

应用

网络设备管理:SNMP协议是一种常用的网络设备管理协议,用于监控和管理路由器、交换机、服务器和打印机等网络设备。
网络性能监控:SNMP协议可以实时监控网络设备的性能指标,如CPU利用率、内存使用率、网络流量等,帮助管理员及时发现和解决性能问题。
安全管理:SNMP协议可以用于监控和管理操作系统、数据库、应用程序等系统和软件,保证系统正常运行和高效管理。
云计算管理:SNMP协议可以用于云计算环境中的网络管理和监控,帮助管理员及时发现和解决云环境中的问题。

java实现

maven依赖

<dependency>
      <groupId>org.snmp4j</groupId>
	  <artifactId>snmp4j</artifactId>
	  <version>2.8.5</version>
 </dependency>

服务端代码

package com.learn.test;

import java.io.IOException;

import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.MessageDispatcherImpl;
import org.snmp4j.MessageException;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.StateReference;
import org.snmp4j.mp.StatusInformation;
import org.snmp4j.security.AuthHMAC192SHA256;
import org.snmp4j.security.AuthHMAC256SHA384;
import org.snmp4j.security.AuthHMAC384SHA512;
import org.snmp4j.security.AuthSHA;
import org.snmp4j.security.PrivAES128;
import org.snmp4j.security.PrivAES192;
import org.snmp4j.security.PrivAES256;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TcpAddress;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;

public class SnmpServer {
	
	private String address;
	
	private String securityName;
	
	private String authProtocol;
	
	private String authPassPhrase;
	
	private String privProtocol;
	
	private String privPassPhrase;
	
	public SnmpServer(String address, String securityName, String authProtocol, String authPassPhrase, String privProtocol, String privPassPhrase) throws IOException {
		this.address = address;
		this.securityName = securityName;
		this.authProtocol = authProtocol;
		this.authPassPhrase = authPassPhrase;
		this.privProtocol = privProtocol;
		this.privPassPhrase = privPassPhrase;
		this.init();
	}
	
	private void init() throws IOException {
		ThreadPool threadPool = ThreadPool.create("Trap", 10);
		MultiThreadedMessageDispatcher dispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());
		//监听地址
		Address listenAddress = GenericAddress.parse(address);
		TransportMapping transport;
		if(listenAddress instanceof UdpAddress) {
			transport = new DefaultUdpTransportMapping((UdpAddress)listenAddress);
		} else {
			transport = new DefaultTcpTransportMapping((TcpAddress)listenAddress);
		}
		dispatcher.addMessageProcessingModel(new MPv1());
		dispatcher.addMessageProcessingModel(new MPv2c());
		dispatcher.addMessageProcessingModel(new MPv3());
		SecurityProtocols.getInstance().addDefaultProtocols();
		Snmp snmp = new Snmp(dispatcher, transport);
		
		//smmpV3 认证且加密模式
		OID authProtocolOID = null;
		if(authProtocol!=null) {
			if(authProtocol.equals("SHA")) {
				authProtocolOID = AuthSHA.ID;
			} else if(authProtocol.endsWith("256")) {
				authProtocolOID = AuthHMAC192SHA256.ID;
			} else if(authProtocol.endsWith("384")) {
				authProtocolOID = AuthHMAC256SHA384.ID;
			} else if(authProtocol.endsWith("512")) {
				authProtocolOID = AuthHMAC384SHA512.ID;
			}
		}
		OID privProtocolOID = null;
		if(privProtocol!=null) {
			if(privProtocol.equals("AES-128")) {
				privProtocolOID = PrivAES128.ID;
			} else if(privProtocol.equals("AES-192")) {
				privProtocolOID = PrivAES192.ID;
			} else if(privProtocol.equals("AES-256")) {
				privProtocolOID = PrivAES256.ID;
			}
		}
		USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
		SecurityModels.getInstance().addSecurityModel(usm);
		snmp.getUSM().addUser(new OctetString(securityName), new UsmUser(new OctetString(securityName), authProtocolOID, new OctetString(authPassPhrase), privProtocolOID, new OctetString(privPassPhrase)));
		
		//消息监听器
		snmp.addCommandResponder(new CommandResponder() {

			@Override
			public void processPdu(CommandResponderEvent event) {
				PDU pdu = event.getPDU();
				if(pdu==null) {
					System.out.println("pdu null");
					return;
				}
				OID oid = pdu.get(0).getOid();
				String value = pdu.get(0).getVariable().toString();
				System.out.println(String.format("oid:%s, value:%s, type:%s", oid, value, pdu.getType()));
				StatusInformation statusInformation = new StatusInformation();
				StateReference stateRef = event.getStateReference();
				pdu.setType(PDU.RESPONSE);
				pdu.set(0, new VariableBinding(oid, new OctetString("result")));
				try {
					event.getMessageDispatcher().returnResponsePdu(event.getMessageProcessingModel(), 
							event.getSecurityModel(), event.getSecurityName(), 
							event.getSecurityLevel(), pdu, 
							event.getMaxSizeResponsePDU(), stateRef, statusInformation);
				} catch (MessageException e) {
					e.printStackTrace();
				}
			}
			
		});
		transport.listen();
	}
	
	public static void main(String[] args) throws IOException {
		new SnmpServer("udp:192.168.1.4/4700", "test", "SHA", "testauth", "AES-128", "testpriv");
	}

}

客户端代码
 

package com.learn.test;

import java.io.IOException;
import java.util.Vector;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.AuthHMAC192SHA256;
import org.snmp4j.security.AuthHMAC256SHA384;
import org.snmp4j.security.AuthHMAC384SHA512;
import org.snmp4j.security.AuthSHA;
import org.snmp4j.security.PrivAES128;
import org.snmp4j.security.PrivAES192;
import org.snmp4j.security.PrivAES256;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class SnmpClient {
	
	private String address;
	
	private String securityName;
	
	private String authProtocol;
	
	private String authPassPhrase;
	
	private String privProtocol;
	
	private String privPassPhrase;
	
	private int version;
	
	private Snmp snmp = null;
	
	private Target target;
	
	public SnmpClient(String address, String securityName, String authProtocol, String authPassPhrase, String privProtocol, String privPassPhrase, int version) throws IOException {
		this.address = address;
		this.securityName = securityName;
		this.authProtocol = authProtocol;
		this.authPassPhrase = authPassPhrase;
		this.privProtocol = privProtocol;
		this.privPassPhrase = privPassPhrase;
		this.version = version;
		this.init();
	}
	
	private void init() throws IOException {
		//定义发送端snmp
		Address targetAddress = GenericAddress.parse(address);
		TransportMapping transport;
		if(targetAddress instanceof UdpAddress) {
			transport = new DefaultUdpTransportMapping();
		} else {
			transport = new DefaultTcpTransportMapping();
		}
		snmp = new Snmp(transport);
		
		if(version == SnmpConstants.version3) {
			//smmpV3的安全机制
			OID authProtocolOID = null;
			if(authProtocol!=null) {
				if(authProtocol.equals("SHA")) {
					authProtocolOID = AuthSHA.ID;
				} else if(authProtocol.endsWith("256")) {
					authProtocolOID = AuthHMAC192SHA256.ID;
				} else if(authProtocol.endsWith("384")) {
					authProtocolOID = AuthHMAC256SHA384.ID;
				} else if(authProtocol.endsWith("512")) {
					authProtocolOID = AuthHMAC384SHA512.ID;
				}
			}
			OID privProtocolOID = null;
			if(privProtocol!=null) {
				if(privProtocol.equals("AES-128")) {
					privProtocolOID = PrivAES128.ID;
				} else if(privProtocol.equals("AES-192")) {
					privProtocolOID = PrivAES192.ID;
				} else if(privProtocol.equals("AES-256")) {
					privProtocolOID = PrivAES256.ID;
				}
			}
			USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
			SecurityModels.getInstance().addSecurityModel(usm);
			snmp.getUSM().addUser(new OctetString(securityName), new UsmUser(new OctetString(securityName), authProtocolOID, new OctetString(authPassPhrase), privProtocolOID, new OctetString(privPassPhrase)));
			
//			UserTarget userTarget = new UserTarget();
//			if(authProtocol!=null) {
//				if(privProtocol!=null) {
//					target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
//				} else {
//					target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);
//				}
//			} else {
//				target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);
//			}
//			target.setSecurityName(new OctetString(securityName));
			//发送目标
			target = new UserTarget();
			if(authProtocol!=null) {
				if(privProtocol!=null) {
					target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
				} else {
					target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);
				}
			} else {
				target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);
			}
			target.setSecurityName(new OctetString(securityName));
		} else {
			//snmpV2的安全机制
			target = new CommunityTarget();
			((CommunityTarget)target).setCommunity(new OctetString("public"));
		}
		target.setVersion(version);
		target.setAddress(targetAddress);
//		target.setRetries(2);
		target.setTimeout(1500);
		transport.listen();
	}
	
	public void send(String oid) throws IOException {
		//数据单元
		PDU pdu = null;
		if(version == SnmpConstants.version3) {
			pdu = new ScopedPDU();
		} else {
			pdu = new PDU();
		}
		pdu.setType(PDU.GET);
		pdu.add(new VariableBinding(new OID(oid)));
		
		//返回结果
		ResponseEvent event = snmp.send(pdu, target);
		System.out.println("sent");
		if(event!=null && event.getResponse()!=null) {
			Vector<? extends VariableBinding> bindings = event.getResponse().getVariableBindings();
			for(VariableBinding binding:bindings) {
				System.out.println(binding.getOid() + ":" + binding.getVariable());
			}
		}
	}
	
	public void close() throws IOException {
		snmp.close();
	}
	
	public static void main(String[] args) throws IOException {
		SnmpClient client = new SnmpClient("udp:192.168.1.4/4700", "test", "SHA", "testauth", "AES-128", "testpriv", SnmpConstants.version3);
		client.send("1.0.3");
		client.close();
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SNMP是一种管理网络设备的协议,Java提供了SNMP管理API,可以使用这个API实现SNMP操作。实现SNMP操作需要以下步骤: 1. 导入SNMP管理API包:javax.management.remote.*,com.sun.jdmk.comm.*,com.sun.management.snmp.*。 2. 创建SNMP管理对象:SnmpManager。 3. 创建SNMP管理对象的参数:SnmpParameters。 4. 创建SNMP管理对象的目标:SnmpTarget。 5. 创建SNMP PDU:SnmpPDU。 6. 发送SNMP PDU:SnmpManager.send(SnmpPDU, SnmpTarget)。 以下是一个使用Java实现SNMP操作的例子: ``` import javax.management.remote.*; import com.sun.jdmk.comm.*; import com.sun.management.snmp.*; public class SnmpDemo { public static void main(String[] args) { try { // 创建SNMP管理对象 SnmpManager manager = new SnmpManager(); // 创建SNMP管理对象的参数 SnmpParameters params = new SnmpParameters(); // 设置SNMP管理对象的参数 params.setVersion(SnmpDefinitions.snmpVersionTwo); params.setReadCommunity("public"); // 创建SNMP管理对象的目标 SnmpTarget target = new SnmpTarget(); target.setTargetHost("192.168.1.1"); target.setTargetPort(161); target.setParams(params); // 创建SNMP PDU SnmpPDU pdu = new SnmpPDU(); pdu.setCommand(SnmpDefinitions.snmpGetRequestPdu); pdu.addNull(new SnmpOID("1.3.6.1.2.1.1.1")); // 发送SNMP PDU SnmpPDU response = manager.send(pdu, target); // 处理SNMP响应 if (response == null) { System.out.println("Error: Response is null"); } else if (response.getErrorStatus() != 0) { System.out.println("Error: " + response.getErrorStatusText()); } else { System.out.println("Response: " + response.getVariable(0)); } } catch (Exception e) { e.printStackTrace(); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值