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
下载MG-SOFT+MIB+Browser+v10b破解版工具进行编辑。该工具有build、compile、browser功能。
exampleObject1,exampleObject2:为定义的标量参数
simpleTable:为Table
simpleEntry:为row
simpleTbColum1,simpleTbColum2,simpleTbColum3:为columner参数。
在table中一般定义第一个参数为index参数,用于处理table表的深度。
当在2.1中编辑好MIB文件后,将编译生成编译文件,供Browser浏览。在MIB Builder中有按钮启动Compile进行编译,编译完成后将保存在C:\Program Files (x86)\MG-SOFT\MIB Browser\MIB\SMIDB目录下。
打开MIB Browser,导入同步导入MIB***.smidb文件,进行操作。具体操作有Contact,Get,Set,Walk,Table View等。
在此,所有的环境都已经建立,测试环境下,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
ucd-snmp style code
Net-SNMP style code
选择2
If you’re writing code for some generic scalars
(by hand use: “mib2c -c mib2c.scalar.conf aoboApMgnt”)
If you want to magically “tie” integer variables to integer
scalars
(by hand use: “mib2c -c mib2c.int_watch.conf aoboApMgnt”)
Don’t generate any code for the scalars
选择1
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.
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.
Do not generate code for the tables.
可以选择3(看需求)
将生成C文件。
接下来就是编辑C文件的实现接口。
SNMP操作中主要有标量参数(普通的叶子节点)与table(表格)参数(定义在表中的一行行);table(表)参数还可能是二重(二维)。
这个模板主要生成标量参数的处理。
命令:mib2c -c mib2c.scalar.conf AP2-MIB:ApMgmt
这个模板主要生成table参数的处理。
命令:mib2c -c mib2c.iterate.conf AP2-MIB:ApMgmt
这个模板即生成标量,又生成table参数的处理。
命令:mib2c -c mib2c.old-api.conf AP2-MIB:ApMgmt
1.当使用old-api实现的时候可以用以上命令完成C函数的生成,即完成标量参数与表格参数的处理。
2.当使用scalar+iterate实现的时候,需要分别执行以上命令生成函数,并将两者的生成文件整合成一起。
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
在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中。
当成功运行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
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文件函数功能,及补全代码。当编译完成后,跟第一章节描述的一样运行调试。
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的实现情况
嵌入式编译移植,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。
SNMP使用BER(Basic Encoding Rule)传输编码,对信息的编码主要解决以下问题:
1.内容的定位,内容的起始和结束标记;
2.内容的解释,解释内容的具体含义。
BER通过TLV(Type,Length,Value)的三元组实现了上述要求。T、L均为一个字节表示。
在Object对象标识符(OID)后面即为TLV数据。具体的Type定义如下:
上下文类型主要为SNMP中的PDU的data的命令请求。通过对报文的简单分析,便于调试中网络抓包分析传输数据。