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