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) {
...
}
}
}
消息流C -- NMS算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.