net-snmp开发

net-snmp开发笔记

  • 1 net-snmp源码下载安装
  • 2 MIB文件编辑
    • 2.1 MIB Builder
      • 2.1.1 实例
    • 2.2 MIB Compile
    • 2.3 MIB Browser
  • 3 SNMP 私有MIB实现C函数
    • 3.1 MIB文件导出对应C文件
    • 3.2 SNMP 私有MIB实现模板处理
      • mib2c.scalar.conf
      • mib2c.iterate.conf
      • mib2c.old-api.conf
      • 注释:
  • 4.C文件实现及编译安装
    • 4.1openWRT移植
      • 4.1.1 静态编译进snmpd及lib库
      • 4.1.2 以动态库方式加载SNMP MIB节点的实现
      • 4.1.3配置文件
    • 4.2Linux下添加自有MIB编译
    • 4.2.1静态编译到snmpd
      • 4.2.2 动态库编译
      • 4.2.3 嵌入式configure配置
      • Linux下的配置如第一节描述。
  • 5. 模板生成文件及实现
  • 6.调试SNMP
    • SNMP报文传输格式

1 net-snmp源码下载安装

1.到net-snmp官方网站下载源码(http://www.net-snmp.org/download.html),本文下载版本为5.4.4。建议下载最新版本。
#tar -zxf net-snmp.5.4.4.tar.gz
#./configure
#make
#make install (需要root权限)
不出意外,编译可以顺利完成,如果遇到缺少依赖库,根据提示安装对应的依赖。
默认情况下,将执行文件安装到/usr/local/bin/目录下;相关的conf文件安装在/usr/local/share/snmp/目录下;及mib文件存储路径为:/usr/local/share/snmp/mibs/。

2.接下来试图运行snmpd代理,看能否成功运行。
#./snmpd -Lo -f -d 带参数的意思为log输出在控制台,非后台运行及debug收发报文打印。
不出意味的话,此时运行会出错,提示未找到对应的configure文件,主要是snmpd需要的snmpd.conf文件未安装。
接下来配置snmpd.conf文件,使用#snmpconf -g basic_setup命令配置,该配置为问答形式的安装,配置完成后会已snmpd.conf在当前目录下,将其复制到/usr/local/share/snmp/或/usr/local/etc/snmp/目录下。再次运行,查看执行结果。
snmpd.conf文件内容如下:
syslocation hangzhou zhejiang
syscontact chenchao03@
sysservices 76
proc init 1 1
proc httpd
disk / 30%
load 7 6 5
file /var/log/snmpd.log 1024
file /home/chenchao/file_size 2
trapsink 192.168.1.1
trap2sink 10.10.10.10
informsink 192.168.1.1
informsink localhost
trapcommunity public
autoTrapenable 1
rwuser chenchao
iquerySecName chenchao
rouser chenchao auth .1
rocommunity public
rwcommunity private 127.0.0.1
rwcommunity privateHigh

以上为一个基本的snmpd.conf配置文件信息,具体的可以根据自身需求增删内容。
3.测试下其他的snmp相关工具:(具体命令含义另述)
snmpwalk -c public -v 1 10.10.10.99 .1.3.6.1.2.1.4.20
snmpset -v 2c -c public 10.10.10.99 .1.3.6.1.2.1.1.4.0 s test

2 MIB文件编辑

下载MG-SOFT+MIB+Browser+v10b破解版工具进行编辑。该工具有build、compile、browser功能。

2.1 MIB Builder

net-snmp开发_第1张图片
exampleObject1,exampleObject2:为定义的标量参数
simpleTable:为Table
simpleEntry:为row
simpleTbColum1,simpleTbColum2,simpleTbColum3:为columner参数。
在table中一般定义第一个参数为index参数,用于处理table表的深度。

2.1.1 实例

创建实例mib文件,AP2-MIB.my。
net-snmp开发_第2张图片

2.2 MIB Compile

当在2.1中编辑好MIB文件后,将编译生成编译文件,供Browser浏览。在MIB Builder中有按钮启动Compile进行编译,编译完成后将保存在C:\Program Files (x86)\MG-SOFT\MIB Browser\MIB\SMIDB目录下。

2.3 MIB Browser

打开MIB Browser,导入同步导入MIB***.smidb文件,进行操作。具体操作有Contact,Get,Set,Walk,Table View等。
net-snmp开发_第3张图片

3 SNMP 私有MIB实现C函数

3.1 MIB文件导出对应C文件

在此,所有的环境都已经建立,测试环境下,MIB存放路径为/usr/local/share/snmp/mibs,将要转换的MIB文件XXX-MIB.txt(对应MIB文件,如实例:AP2-MIB.my)存放在该目录下。
查看MIB文件中的“ApMgnt MODULE-IDENTITY”,将要生成的C文件名为APMgnt.c及APMgnt.h。
使用mib2c工具生成,命令为:mib2c XXX-MIB::ApMgnt

  1. ucd-snmp style code

  2. Net-SNMP style code
    选择2

  3. If you’re writing code for some generic scalars
    (by hand use: “mib2c -c mib2c.scalar.conf aoboApMgnt”)

  4. If you want to magically “tie” integer variables to integer
    scalars
    (by hand use: “mib2c -c mib2c.int_watch.conf aoboApMgnt”)

  5. Don’t generate any code for the scalars
    选择1

  6. tables where the list of rows is external to the agent.
    This is suited to MIBs which monitor or manipulate external
    data (perhaps extracted from the operating system kernel
    or other system interfaces), and where rows are typically
    created or destroyed independently of the SNMP agent.

  7. tables where the list of rows is held by the agent itself.
    This is particularly suited to tables that are primarily
    manipulated via SNMP, or where the rows of the table are
    relatively static.

  8. Do not generate code for the tables.
    可以选择3(看需求)
    将生成C文件。
    接下来就是编辑C文件的实现接口。

3.2 SNMP 私有MIB实现模板处理

SNMP操作中主要有标量参数(普通的叶子节点)与table(表格)参数(定义在表中的一行行);table(表)参数还可能是二重(二维)。

mib2c.scalar.conf

这个模板主要生成标量参数的处理。
命令:mib2c -c mib2c.scalar.conf AP2-MIB:ApMgmt

mib2c.iterate.conf

这个模板主要生成table参数的处理。
命令:mib2c -c mib2c.iterate.conf AP2-MIB:ApMgmt

mib2c.old-api.conf

这个模板即生成标量,又生成table参数的处理。
命令:mib2c -c mib2c.old-api.conf AP2-MIB:ApMgmt

注释:

1.当使用old-api实现的时候可以用以上命令完成C函数的生成,即完成标量参数与表格参数的处理。
2.当使用scalar+iterate实现的时候,需要分别执行以上命令生成函数,并将两者的生成文件整合成一起。

4.C文件实现及编译安装

4.1openWRT移植

4.1.1 静态编译进snmpd及lib库

openWRT默认使用的是net-snmp-5.4.4版本,其中的Makefile在feeds/packages/net/net-snmp/Makefile。如需添加自己的私有MIB,先重这里的Makefile修改开始。
同样从MODULE-IDENTITY 前面的字符串参数描述开始,为模块ID。一切都是从这个关联开始。
打开Makefile,添加模块信息:如下
SNMP_MIB_MODULES_EXCLUDED =
ApMgnt

SNMP_MIB_MODULES_INCLUDED =
privatemib/ApMgnt \ //一般为存放在agent/mibgroup目录下,为MIB的实现接口

添加相关的lib库到Makefile中,如下:
CONFIGURE_ARGS +=
–with-libs="-luci" \ //uci为需要添加的lib文件,为了给私有MIB库实现的ApMgnt所需。

MIB的实现接口C文件的编译,会自动同步修改Makefile在agent/mibgroup/Makefile下,修改如下:
mib_module_list_o=
privatemib/ApMgnt.o

mib_module_list_lo=
privatemib/ApMgnt.lo

mib_module_list_c=
privatemib/ApMgnt.c

这样可以回到openwrt编译路径进行编译。
make package/feeds/packages/net-snmp/compile V=s

4.1.2 以动态库方式加载SNMP MIB节点的实现

在qca/feeds/packages/net/net-snmp/Makefile中,增加相应的动态库依赖配置。
define Package/libnetsnmp
$(call Package/net-snmp/Default)
SECTION:=libs
CATEGORY:=Libraries
DEPENDS:=+libuci +libsnmpapi
TITLE:=Open source SNMP implementation (libraries)
endef

define Package/snmpd
$(call Package/net-snmp/Default)
DEPENDS:=+libnetsnmp +libuci +libsnmpapi
TITLE:=Open source SNMP implementation (daemon)
endef

CONFIGURE_ARGS +=
–with-libs="-luci -lsnmpapi"
以上配置将snmpapi的接口库依赖添加到snmp中,以此来调用snmpapi中的实现函数。
注:另可能存在snmpapi库在打包ipk过程中无法自动识别查找到已经安装的snmpapi库。需要手动指定snmpapi库来安装到snmp下。
cp $(PKG_BUILD_DIR)/…/snmplib/libsnmpapi.so $(1)/usr/lib
将以上添加到Makefile中。

4.1.3配置文件

当成功运行snmpd(调试下:snmpd -Lo -d -f)时,可能存在无法set操作,返回No Access。那是没有开放写权限,需要在/etc/config/snmpd配置文件下配置写权限。配置参数如下:

config agent
        option agentaddress UDP:161

config com2sec public
        option secname rw
        option source default
        option community public

config com2sec private
        option secname rw
        option source localhost
        option community private

config group public_v1
        option group public
        option version v1
        option secname rw

config group public_v2c
        option group public
        option version v2c
        option secname rw

config group public_usm
        option group public
        option version usm
        option secname rw

config group private_v1
        option group private
        option version v1
        option secname rw

config group private_v2c
        option group private
        option version v2c
        option secname rw

config group private_usm
        option group private
        option version usm
        option secname rw

config view all
        option viewname all
        option type included
        option oid .1

config access public_access
        option group public
        option context none
        option version any
        option level noauth
        option prefix exact
        option read all
        option write all
        option notify none

4.2Linux下添加自有MIB编译

4.2.1静态编译到snmpd

1.首先拿到一个标准的SNMP MIB文件,使用mib2c生成MIB相对应的C文件,具体方式很多,下面先描述一种实现。
#mib2c -c mib2c.old-api.conf XXX-MIB:ApMgnt
将生成ApMgnt.h及ApMgnt.c文件在当前目录下;将这两个文件拷贝到agnet/miggroup/apmib/目录下。
2.重新配置configure进行编译:
./configure --with-mib-modules=“apmib/ApMgnt”
其他的配置参数同Linux下其他编译的参数选择。
3.编译源码:make;此时使用mib2c生成的代码还未修改实现,肯定会编译出错。这里需要根据MIB的需求来实现C文件函数功能,及补全代码。当编译完成后,跟第一章节描述的一样运行调试。

4.2.2 动态库编译

1.编译net-snmp源码,注意动态加载不能配置–disable-shared。

#./configure --prefix=/usr/local/snmp --disable-embedded-perl  --without-perl-modules --disable-applications --disable-scripts
#make & make install

2.编译4.1.1中的源码MIB生成编辑文件,编写Makefile

chenchao@ubuntu-snmp:~/snmplib$ cat Makefile
CC=gcc
FLAGS=-I. `net-snmp-config --cflags` -g
DLFLAGS=-shared -fPIC -g

aoboAcMgmt.so: aoboAcMgmt.c
        $(CC) $(CFLAGS) $(DLFLAGS) -c ApMgmt.c Accfg.c
        $(CC) $(CFLAGS) $(DLFLAGS) -o libApMgmt.so ApMgmt.o Accfg.o

.PHONY : clean
clean :
        rm -f *.so *.o
  
 #make
 #cp libApMgmt.so /usr/local/snmp/lib/      

3.配置snmpd.conf,并运行snmpd

chenchao@ubuntu-snmp:~/snmplib$ cat /usr/local/snmp/share/snmp/snmpd.conf

//在最后增加私有MIB的配置及对应动态库的加载。
dlmod ApMgmt /usr/local/snmp/lib/libApMgmt.so

运行snmpd,以调试方式运行,可以查看打印信息。
#sudo /usr/local/snmp/sbin/snmpd -f -Lo -d -c /usr/local/snmp/share/snmp/snmpd.conf

4.客户端调试私有MIB的实现情况

4.2.3 嵌入式configure配置

嵌入式编译移植,configure配置示例:

./configure --host=arm-linux-gnueabi --build=i686-linux --with-cc=arm-linux-gnueabi-gcc --with-ar=arm-linux-gnueabi-ar --prefix=/usr/local/net-snmp --with-endianness=little --disable-shared --enable-mini-agent --disable-manuals --disable-ucd-snmp-compatibility --enable-as-needed --disable-embedded-perl --without-perl-modules --disable-applications --disable-scripts --disable-ipv6 --sysconfdir="/etc/snmp” --with-ldflags=-L/usr/local/arm-linux-gnueabi/libc/usr/lib --with-libs="-lsqlite3 -llua -lm" --disable-mib-loading --with-transports=UDP --disable-mibs --with-openssl=/usr/local/openssl --with-mib-modules="xxx,xxx"

xxx为自己添加的私有MIB。

Linux下的配置如第一节描述。

5. 模板生成文件及实现

6.调试SNMP

SNMP报文传输格式

SNMP使用BER(Basic Encoding Rule)传输编码,对信息的编码主要解决以下问题:
1.内容的定位,内容的起始和结束标记;
2.内容的解释,解释内容的具体含义。
BER通过TLV(Type,Length,Value)的三元组实现了上述要求。T、L均为一个字节表示。
net-snmp开发_第4张图片
在Object对象标识符(OID)后面即为TLV数据。具体的Type定义如下:
net-snmp开发_第5张图片
上下文类型主要为SNMP中的PDU的data的命令请求。通过对报文的简单分析,便于调试中网络抓包分析传输数据。

你可能感兴趣的:(net-snmp开发)