消息流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) {
			...
		}
		
	}
	
}

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