首页 > 其他分享 >使用 snmp4j 开发 SnmpTrap V3 版本服务端

使用 snmp4j 开发 SnmpTrap V3 版本服务端

时间:2023-04-17 14:22:55浏览次数:36  
标签:String snmp4j import snmp SnmpTrap V3 new org

SnmpTrap 

snmp,是简单网络协议,snmpTrap是硬件设备遇到异常时主动推送给服务端的消息

安装好snmptrap依赖后,执行snmptrap -h,查看帮助

可以看到有3个版本,1、2c 和 3

其中1和2c使用的团体名,而3版本添加了新的认证机制

常规参数 -r 重试次数 和 -t 超时时间

指令格式

常用第二种格式

v1 和 v2c 版本

snmptrap -v 1 -c public 127.0.0.1:9162 "222" .0.1.2.3.4.5 1.3.6.1.4.1.2345 s "just here"
snmptrap -v 2c -c public 127.0.0.1:9162 "111" .0.1.2.3.4.5 1.3.6.1.4.1.2345 s "just here“
  snmptrap
  -v 1/2c

   -c public

  "222"
  .0.1.2.3.4.5
     1.3.6.1.4.1.2345 s "just here"
        指令头       版本         团体名      运行时间     trapOid oid   type   value

 

 

 

v3 版本,由于该版本使用了 User Security Model,参数较多

snmptrap -v 3 -u username -l authPriv -a MD5 -A mypassword -x AES -X mypassword 127.0.0.1:9162 "111" .0.1.2.3.4.5 1.3.6.1.4.1.2345 s "just here"
   snmptrap -v
 -v 3
 -u user
 -l authPriv
-a MD5
 -A mypassword
  -x AES   -X mypassword    "111"  .0.1.2.3.4.5
1.3.6.1.4.1.2345 s "just here"
 指令头  版本    安全用户名         安全等级    认证协议   认证协议密码     隐私协议 隐私协议密码   运行时间        trapOid oid     type     value

安全等级 security level 有三个

  • noAuthNoPriv

  • authNoPriv

  • authPriv

也就是说参数 -a -A -x -X 都是可选的

Snmp4j的使用

GenericAddress,其中的 parse 方法是根据冒号分割字符串,得到对应的 Address ((char)58 就是 :)

 

Snmp

这个是snmp对象,可以添加tcp、udp、ssh监听服务,可以单线程也可配置线程池使用多线程

DefaultUdpTransportMapping

这个是服务端监听功能

  • udp 使用 java.net.DatagramSocket
  • tcp 使用 java.nio.channels.ServerSocketChannel

CommandResponder

这是个接口,实现之后可以直接获取设备推送过来的 Pdu 包

单线程不配置协议

private int port = 9162;

public void startup() {
    try {
        String address = String.format("udp:0.0.0.0/%d", port);
        UdpAddress udpAddress = (UdpAddress) GenericAddress.parse(address);
        snmp = new Snmp(new DefaultUdpTransportMapping(udpAddress));                    
        snmp.addCommandResponder(new SnmptrapResponder());
        System.out.println("Snmptrap receiver startup, listening : " + address); 
        snmp.listen();
    } catch (IOException e) {
        System.out.printf("Create snmpTrap receiver port[%d] failed%n", port);
    }
}
private class SnmptrapResponder implements CommandResponder {
    @Override
    public void processPdu(CommandResponderEvent event) {
        System.out.println(event.toString());
    }
}

多线程且配置协议

package com.example.raw_spring.server;

import org.snmp4j.*;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.MPv3;
import org.snmp4j.security.*;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * Powered By liu_bin On 2022-11-30 14:21:56
 *
 * @author liu_bin
 * @version 1.0
 * @since 1.8
 */
@Component
public class SnmpTrapServerV3 implements CommandResponder, InitializingBean {

    @Value("${snmptrap.enable:true}")
    private boolean enable;
    @Value("${snmptrap.port:9162}")
    private int port = 9162;
    @Value("${snmptrap.v3.user:appuser,1qaz)OKM2wsx(IJN,1qaz)OKM2wsx(IJN}")
    private String user = "appuser,1qaz)OKM2wsx(IJN,1qaz)OKM2wsx(IJN";

    private Snmp snmp;
    private MultiThreadedMessageDispatcher dispatcher;
    private ThreadPool threadPool;

    private void init() throws Exception {

        // create thread pool for receiving snmp trap v3 message
        threadPool = ThreadPool.create("trap_v3", 4);
        dispatcher = new MultiThreadedMessageDispatcher(threadPool,
                new MessageDispatcherImpl());

        // create snmp server
        String strAddr = String.format("udp:0.0.0.0/%d", port);
        UdpAddress address = (UdpAddress) GenericAddress.parse(strAddr);
        snmp = new Snmp(dispatcher, new DefaultUdpTransportMapping(address));

        // set User-based SecurityModel
        USM usm = new USM(SecurityProtocols.getInstance(),
                new OctetString(MPv3.createLocalEngineID()), 0);

        // add security protocols
        SecurityProtocols.getInstance().addDefaultProtocols();
        SecurityProtocols.getInstance().addAuthenticationProtocol(new AuthSHA());
        SecurityProtocols.getInstance().addPrivacyProtocol(new PrivAES128());

        // create & convert usm user
        String[] rawUsers = user.split(";");
        String[] rawUser;

        for (String s : rawUsers) {
            rawUser = s.split(",");
            usm.addUser(new OctetString(rawUser[0]), new UsmUser(new OctetString(rawUser[0]), AuthSHA.ID, new OctetString(rawUser[1]), PrivAES128.ID, new OctetString(rawUser[2])));
        }

        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3(usm));

        /**
         * new MPv3(usm) 这段
         * 通过观察MPv3的构造函数发现其中的
         * SecurityModels.getCollection(new SecurityModel[]{usm})
         * 等同于下面两句
         * SecurityModels.getInstance().addSecurityModel(usm);
         * snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
         */

        // start listening...
        snmp.listen();
        System.out.println("SnmpTrap sever v3 start listening:" + strAddr);
    }

    @Override
    public void processPdu(CommandResponderEvent event) {
        String community = null;
        if (event.getPDU().getType() == PDU.V1TRAP || event.getPDU().getType() == PDU.TRAP)  {
            community = new String(event.getSecurityName());
            System.out.println("团体名: " + community);
        }
        System.out.println(event);
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        if(enable) {
            try {
                init();
                snmp.addCommandResponder(this);
            } catch (Exception ex) {
                System.out.println("SnmpTrapSever v3 启动失败:" + ex.getMessage());
            }
        }
    }
}

注意 processPdu 方法里的 event.getSecurityName 在 v1 和 v2c 获取到的就是团体名

标签:String,snmp4j,import,snmp,SnmpTrap,V3,new,org
From: https://www.cnblogs.com/BigBender/p/17324736.html

相关文章

  • 关于CodeSys V3.5 SPX如何使用高版本打包低版本环境静态编译库说明
    之所以需要使用高版本对低版本库进行打包,是因为在实际的使用中发现CodeSysV3.5的低版本虽然支持导入*.compiled-library库,但打包并不方便。以SP5为例,在实际使用过程中发现SP5的文件保存类型不支持.library; 这里在另存时可将文件后缀手动改为.library 在保存为.library后使......
  • WeOpsV3.16持续拓展云平台能力,监管华为ManageOne云平台
    本次WeOpsV3.16版本更新主题总结为:1)新增ManageOne平台自动发现能力,发现/更新平台相关配置信息和关联信息2)新增ManageOne平台监控告警能力,覆盖常用监控指标3)监控告警/服务台等模块持续更新,简化操作步骤优化信息展示▲本次更新优化模块ManageOne云平台自动发现和自动采集云平台的相......
  • Cisco RV32X系列路由器 从1day分析到0day挖掘
    前言拿到一个iot设备,笔者比较喜欢先去看一下它的历史漏洞,也许可以从中得到一些启发。发现Cisco之前修补过这个系列设备的命令注入漏洞。https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-rv-command-inject-BY4c5zd1day分析因为漏洞......
  • Codeforces Round 642 (Div3)
    K-periodicGarland给定一个长度位\(n\)的\(01\)串,每次操作可以将\(1\)变为\(0\)或者将\(0\)变为\(1\),现在你需要通过操作使得所有\(1\)之间的距离为\(k\),求最少的操作次数,注意全为\(0\)也算\(1<=n<=1e6,1<=k<=n\)\(dp\)/贪心:最大子段和思想方法一:\(dp\)\(O(n)\)状......
  • Huananzhi X99-AD3 Intel E5-2696v3黑苹果efi引导文件
    原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔)硬件型号驱动情况主板HuananzhiX99-AD3处理器IntelE5-2696v3已驱动内存64GB(2*32)DDR3ECC1866Samsung已驱动硬盘SamsungPM961512GBNVMe已驱动显卡GigabyteRadeonRX5600XTWindForceOC6GB已驱动声卡......
  • IWDG-CH32FV2x_V3x--低功耗模式的看门狗处理
    芯片睡眠模式下看门狗的使用:     由于独立看门狗的特殊性,一旦开启就不能再被关闭,除非发生复位。而睡眠时程序又是停止运行的,这样就无法及时喂狗,从而导致看门狗复位。那么就需要软件上做些特殊   处理     方法1:在低功耗模式下进行RTC定时唤醒CPU进行......
  • AFIO-CH32FV2x_V3x--重映射功能的使用以及常见问题
    重映射功能    外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。    简单的讲就是把管脚的外设功能映射到另一个管脚,但不是可以随便映射的。部分重映射&完全重映射部分重映......
  • V3.0(R2_2302) 前端上下文改造, 定位修改文件
    --iuap_yonbuilder_service库--查询包含'AppContext'关键字的函数文件SELECTe.description,e.source_flag,e.file_name,c.file_content,LOC......
  • 003-Cruehead-CrackMeV3
    第二个需要写注册机首先查看文件,打开文件,什么也没有,help->about,弹出下面的弹窗看来是没有什么线索,直接放进OD里面这里有一个函数CreatFileA,这个函数目的是访问一个文......
  • JUDDIV3 部署
    JUDDIV3部署了2天了,不用脑子的集成版就下了,用脑子的dist版怎么都不知道。哪个朋友知道一定要告诉我啊!09的那家伙算是网络传人了,写了一片就NND百度疯......