SNMP协议开发心得

SNMP

基本概念

agent:设备

manager:网管系统

数据交互方式:

manager 轮询 agent (传统轮询模式)

agent 推送 manager(trap告警模式)

版本

目前有v1、v2c和v3这3个版本,使用Lextm.SharpSnmpLib库的MessageFactory.ParseMessages能自动识别不同的版本,得到统一的ISnmpMessage结构。

常用请求类型

GET请求:一次可以请求多个oid,但受到网络包大小的限制,没法请求太多oid。

GET BUIK请求:可以多次查询全部的oid,等价于分页查询或流式查询,对内存也比较友好

GET NEXT请求:请求下一个oid,GET BULK的基础版

SET请求:修改一个或多个oid的值

上述请求对应linux上snmp工具套件的snmpget、snmpbulkget、snmpgetnext、snmpset这几个命令行,样例如下:

复制代码
snmpget -v 1 -c public localhost:10161 1.3.6.1.4.1.99999.3.1.1
snmpgetnext -v 1 -c public localhost:10161 1.3.6.1.4.1.99999.3.1.1
snmpbulkget -v 2c -c public localhost:10161 1.3.6.1.4.1.99999.3.1.1 
snmpset -v 2c -c public -t 5 localhost:10161 1.3.6.1.4.1.99999.3.4.6 i 30

安全

V1和V2仅支持community string来作为明文密码。

v3支持基于用户安全协议的认证。

v3的安全级别为:noAuthNoPriv、authNoPriv、authPriv。noAuthNoPriv是只靠用户名识别,基本上等同于v1和v2里的community string了,属于裸奔;authNoPriv是身份验证+防篡改,但报文中的oid和值还是明文,可以抓包偷看;authPriv则是在authNoPriv的基础上,对oid和值也做了加密,别人无法抓包偷看。可见,三个安全级别是逐层递增的。

顺带说一下,v3版本下的manager和agent交互也跟v1/v2不一样,因为它有专门的用户安全协议,所以在发送正式的GET/GETNEXT请求前,manager和agent会有一个发现握手(discovery handshake)阶段,该阶段下,manager会先用noAuthNoPriv安全级别获得agent的EngineID和时钟信息,然后manager才用更高的安全级别发送加密请求给agent。

C#的Lextm.SharpSnmpLib库

该库提供了SNMP报文的解析,但没有提供UDP server机制(开发SNMP Agent需要),可自己开发一个简单的udp server做到及时响应,过程不难,udp因为是无连接的,所以不用像tcp server那样listen,同时因为是面向报文的,也无需像tcp那样考虑分包、粘包等繁琐细节,编程时,主线程recvFrom之后起单独的线程处理报文并sendTo结果即可。

顺带说一下,网上资料说Lextm.SharpSnmpLib库有一个SnmpEngine类实现了UDP server机制,并处理了v3版本的发现握手。仔细研究下来发现,早期版本确实有这么一个类,但开发团队不愿持续维护SnmpEngine,就把它移到sample仓了,可以到github上拿这个sample仓的代码参考使用。

相关推荐
明月_清风1 天前
开发者网络概念全扫盲:一篇搞定
后端·网络协议
刘马想放假1 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
雨落倾城夏未凉2 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
王二端茶倒水2 天前
一套可落地的无线运营方案,不能只管 AP,还要管用户、计费和运维
网络协议
162723816082 天前
EtherCAT 分布式时钟(DC)原理与配置实战:把多轴真正"对齐到同一时刻"
网络协议
王二端茶倒水3 天前
宽带无线项目,怎么从一次性交付变成长期运营收入?
网络协议
唐青枫3 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
用户2530171996274 天前
第6篇:从技术到产品 — Ghost Proxifier 的设计哲学
网络协议
用户2530171996274 天前
第3篇:注入的艺术 — Ghost Proxifier 核心架构拆解
网络协议