消息流C -- NMS算法

package jijian.test;

import java.io.IOException;

import org.snmp4j.TransportMapping;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.transport.DefaultUdpTransportMapping;

/**
 * NMS与Agent通过以太网相连。
 * NMS通过SNMPv3只能对Agent的接口状态进行监控管理,Agent在故障或者出错时
 * 能够主动向NMS报告情况NMS接收Trap的端口号为#{listenPort}。
 * NMS与Agent建立SNMP连接时,需要认证,认证协议为#{authProtocol},认证密码短语为
 * #{authPassphrase}。
 * NMS与Agent之间传输的SNMP报文需要加密,使用的加密协议为#{priProtocol},
 * 加密密码短语为#{priPassphrase}。
 * 
 * @author jijian
 *
 */
public class SnmpTrapCollecter {

	private String listenPort;
	
//	TransportMapping接口是SNMP4J最终要的接口之一:该接口代表了SNMP4J
//	所使用的传输层协议。按照RFC的规定,SNMP只使用UDP作为传输层协议,而SNMP4J
//	支持管理端和代理端使用UDP或者TCP进行传输。该接口有两个子接口:
	
//	一般情况下,都使用UDP协议作为SNMP的传输层协议,所以需要实例化一个
//	DefaultUdpTransportMapping接口对象。
	private TransportMapping transport;
	
//	权威的SNMP协议引擎
//	为了防御重放、延迟等攻击,在参与通信的SNMP协议引擎中应有一方被指定为
//	权威的SNMP协议引擎。当一个SNMP消息需要应答时,消息接收方的SNMP协议引擎
//	就是权威的SNMP协议引擎。当SNMP消息不需要应答时,则消息发送方的SNMP协议
//	引擎是权威的SNMP协议引擎。相应的,通信中另一方的SNMP协议引擎被称为
//	非权威的SNMP协议引擎。
	private String authoritativeEngineID; 
	
//	USM采用HMAC(Keyed-Hashing for Message Authentication)
//	来实现消息的数据完整性和数据源身份认证。它使用一个安全的HASH函数和一个认证
//	密钥来生成消息的身份鉴别码。标准协议使用MD5和SHA1作为HASH函数,并截取
//	HASH值的前96比特作为有效认证码,因此被相应地称为HMAC-MD5-96认证协议
//	和HMAC-SHA-96认证协议。
	
//	通信的两个SNMP实体共享一个认证密钥。发送方在发送SNMP消息之前,利用认证密钥
//	和HASH函数为SNMP消息计算认证码,并将认证码插入到消息中一起传输。接收方收到
//	该消息后,使用同样的方法计算该消息的认证码。得到的认证码如果与消息附带的认证码
//	相同,即说明该消息在传输过程中未被修改。
	private String authProtocol;
	private String authPassphrase;
	
//	为了防止信息泄露,USM对SNMPv3报文负载进行加密保护。报文负载是指由上下文
//	引擎ID(contextEngineID)、上下文名( contextName)和SNMP协议
//	协议数据单元(PDU)组成的范围协议数据单元(scopedPDU)。
//	
//	加密功能可以有效地防止信息泄露。经过加密处理的SNMPv3消息即使被非法获取,攻击
//	方因为不知道密钥也不能提取其中的网管信息。SNMPv3规定,如果使用加密功能,则
//	必须同时使用认证功能。
	private String privProtocol;
	private String privPassphrase;
	
//	SNMPv3的安全机制包括:认证、加密、访问控制。
//	SNMPv3采用了基于用户的安全模型(USM)。
//	
//	SNMPv3用户是一个发出SNMP操作的实体,可以是一个或一些管理员,或是执行网管操作
//	的应用程序等。用户的身份和目标代理的相关配置一起决定了将要调用的安全机制。
	private String user;
	
//	Agent负责与NMS的通信,它接收SNMP请求并返回SNMP响应。
//	子代理实现MIB对象的访问,它向Agent注册并维护一张MIB视图。
//	Agent维护所有已注册的子代理信息,并将其保存到全局注册表中。
//	Agent接收到请求后,根据请求的OID在注册表中查找已经连接并注册的subAgent,
//	然后将请求发送给subAgent处理。
	private SnmpV3Agent agent;
	
	public SnmpTrapCollecter(SNMPTarget target) {
		
		/* 从SNMPTarget获取参数值。 */	
		
	}
	
	public boolean activate() {
		
		String string = "0.0.0.0/" + listenPort;		
		
		try {
			agent = SnmpV3Agent.getSnmpAgent(new TrapCommondResponder(), "SnmpTrap");
			/* 向agent添加用户 */
			transport = new DefaultUdpTransportMapping(new UdpAddress(str_transport));
			transport.listen();			
			agent.addTransportMapping(transport, this);			
			return true;			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			destroy();			
			return false;
		}		
		
	}
	
	public boolean destroy() {
//		关闭监听
	}
	
//	SNMP4J提供了一个抽象类CommondResponder类用于接收Trap,这个类里面有一个
//	必须实现的方法processPdu(),当接收到trap,会自动进入这个方法,因此可以将对
//	Trap的处理写在这里。
	class TrapCommandResponder implements CommondResponder {
		
		@Override
		public void processPdu(CommandResponderEvent e) {
			...
		}
		
	}
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章