2016-01-22--:snmpV3移植 1:Ubuntu-PC环境 调试过程
1.1 snmp编译环境
为了实现v3安全功能,必须得需要openssl库的支持。网络上可以下载openssl源代码,我在此下载了openssl-1.0.0e.tar.gz. 该源代码可以编译成动态库,也可以编译成静态库。
在 PC环境下的snmpV3测试步骤: 1:编译openssl( 先进入源代码根目录) (1)config (配置编译环境) (2)make
(3)make install
经过以上缺省步骤后, openssl编译结果就安装在了这个目录/usr/local/ssl 2: 编译snmp(先进入源代码根目录) (1)./configure –with-opensll=/usr/local/ssl (2)make clean (3)make
(4)make install
经过以上步骤后,snmp编译结果进入了各自缺省目录(snmp工具命令进入了/usr/local/bin,snmp代理主程序snmpd进入了/usr/local/sbin, snmp各项配置文件进入了/usr/local/share/snmp)。
按照此方法编译出来的snmpd里面就含有动态库openssl 的连接,因此,运行前还要配置好动态库的搜索路径。
可以编辑/etc/ld.so.conf配置文件增加搜索路径:
include /etc/ld.so.conf.d/*.conf /usr/local/ssl/lib/ 1.2 snmp运行环境
编译成功后,还得配置好以下文件snmpd.conf,首先须得按照前面的移植开发步骤来完成 snmpd.conf的基本配置(./EXAMPLE.conf):
#### # First, map the community name (COMMUNITY) into a security name # (local and mynetwork, depending on where the request is coming # from): # sec.name source community
com2sec local localhost public com2sec mynetwork 192.168.23.0/24 public 要实现snmpv3功能,须得增加以下设置
(1)/var/net-snmp/snmpd.conf createUser luoxin MD5 12345678 DES 12345678 (2)/data/snmp/snmpd.conf rwuser luoxin priv
1.3 调试
经过以上的编译配置后就可使用 工具命令进行调试了:
Snmpwalk –v3 –u luoxin –a MD5 -A 12345678 –x DES –X 12345678 –l priv 192.168.23.76 system
备注:在PC环境下不添加特别的openssl库也snmp可支持V3, 可能是因为在pc下我们编译的是动态库的原因。
2:718终端环境 调试过程
首先,我们也不添加特别的openssl库,我们来按照以前开发的过程开发的snmpd来测试一下是否在718终端环境可直接支持V3,调试结果是不支持。
经过多番调试最后,终于找到了成功的方法,现把成功的方法步骤记录如下:
2.1 openssl的编译过程
现在编译的openssl是为了在718终端上使用,因此需要交叉编译。不能象pc环境那样编译了。编译步骤如下:( 先进入openssl源代码根目录./openssl-1.0.0e)
(1):设置交叉编译环境如下: a: #export PATH=/home/softSource/arm-2009q3/bin:$PATH b: #export CC=arm-none-linux-gnueabi-gcc (2): #./config no-asm shared --prefix=/home/armssl (3): Modify Makefile as follows: CC= arm-none-linux-gnueabi-gcc CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall DEPFLAG= -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_STORE PEX_LIBS= EX_LIBS= -ldl EXE_EXT= ARFLAGS=
AR= arm-none-linux-gnueabi-ar $(ARFLAGS) r RANLIB= arm-none-linux-gnueabi-ranlib NM= arm-none-linux-gnueabi-nm PERL= /usr/bin/perl TAR= tar TARFLAGS= --no-recursion MAKEDEPPROG=makedepend LIBDIR=lib (4):#make (5):#make install
经此步骤,openssl交叉编译的库就会存放在/home/armssl/lib目录下了。在lib目录下会同时生成相应的动态库和静态库。
2.2 snmp的编译过程
先进入snmp的源代码根目录./net-snmp-5.2.4 (1):设置交叉编译环境如下: a:# export PATH=/home/softSource/arm-2009q3/bin:$PATH b:#export CC=arm-none-linux-gnueabi-gcc (2):./configure 如下: #./configure --prefix=/home/zhou/arm_netsnmp --exec_prefix=/home/zhou/arm_netsnmp --build=x86_64-linux --host=arm-linux --disable-shared --enable-mini-agent --disable-ipv6 --with-endianness=little --disable-manuals --disable-ucd-snmp-compatibility --enable-as-needed --disable-embedded-perl --without-perl-modules --disable-snmptrapd-subagent --disable-applications --disable-scripts --with-default-snmp-version=\--with-sys-contact=\--with-sys-location=\--with-logfile=\--with-persistent-directory=\ --with-openssl=/home/armssl
(3)#make LDFLAGS=--static //==编译成静态库文件
在这一步的编译过程中最后会失败退出,失败的原因可在给出的信息中找到:
/bin/sh ../libtool --mode=link arm-none-linux-gnueabi-gcc -g -O2 -Dlinux -Wall -Winline -Wstrict-prototypes -Wwrite-strings -Wcast-qual -Wno-char-subscripts -o snmpd snmpd.lo --static libnetsnmpmibs.la libnetsnmpagent.la helpers/libnetsnmphelpers.la ../snmplib/libnetsnmp.la -ldl -lcrypto -lm arm-none-linux-gnueabi-gcc -g -O2 -Dlinux -Wall -Winline -Wstrict-prototypes -Wwrite-strings -Wcast-qual -Wno-char-subscripts -o snmpd snmpd.o --static ./.libs/libnetsnmpmibs.a ./.libs/libnetsnmpagent.a helpers/.libs/libnetsnmphelpers.a ../snmplib/.libs/libnetsnmp.a -ldl -lcrypto -lm /home/softSource/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lcrypto
collect2: ld returned 1 exit status Makefile:238: recipe for target 'snmpd' failed make[1]: *** [snmpd] Error 1 这一步出错,实际上这一步基本上到了最后一步了,这一步成功就可生成 主代理程序snmpd。那么如何来纠正这个错误生成程序呢。到了这一步后,我们可以先进入agent目录,然后执行下面的命令如下:
#/bin/sh ../libtool --mode=link arm-none-linux-gnueabi-gcc -g -O2 -Dlinux -Wall -Winline -Wstrict-prototypes -Wwrite-strings -Wcast-qual -Wno-char-subscripts -o snmpd snmpd.lo --static libnetsnmpmibs.la libnetsnmpagent.la helpers/libnetsnmphelpers.la ../snmplib/libnetsnmp.la /home/armssl/lib/libcrypto.a
-ldl -lm
经过这个命令运行后,就可以在 agent目录下生成主代理程序snmpd了。该程序大约有3.5Mb左右大小。
其实“/home/armssl/lib/libcrypto.a -ldl -lm”这个选项经过了多少个周折才匹配出来。系统最开始自动生成的选项是这样的“-ldl -lcrypto –lm”,最开始想到的色这样的
“-L/home/armssl/lib -ldl -lcrypto –lm”,目的是添加-lcrypto的搜索路径,但是编译无法成功。中途无意之中又该成了这样的选项“/home/armssl/lib/libcrypto.a -Wl -dy -ldl -lm”这样编译成功了,欣喜一场,以为大功告成(程序大小只有2.7Mb左右),结果拷贝到终端上,出现“/system/bin/sh: ./snmpd: No such file or directory”,这个结果让我茫然了几天,都不知道是怎么回事,循着这个思路去分析以为是编译器格式不对,终端认不到,又以为是动态库没有添加完善。个中滋味真的无法诉说。最后翻来覆去的对比来对比去,几乎绝望了,才想到了这个选项试一试。
只要把这个主程序替换掉原来的组成序,再按照前面讲的配置环境配置好就可以了。
2.2 snmpV3的调试过程
其实在调试过程中我遇到了很多很难的问题,现把这些经验记录如下:
(1):首先需要清楚地理解snmp V3的安全模型,才能懂得如何使用snmp工具命令,否则会不知道错在哪里。sec.name(local,luoxin): 安全用户名 / community(public):共同体(v1/v2使用;sec.model安全模型:v1/v2c/usm ; sec.level 安全级别:noauth/priv/authpriv ; group 组;access 访问列表。
(2):交叉编译openssl 生成动态库和静态库,在网上找了好几个版本,虽然能编译出库来,但是到了编译snmp的时候确总是说找不到ssl库。
(3):带openssl的snmp编译折腾了多少个来回都记不清楚了,曾经一度怀疑是编译器的问题无法合成openssl。曾经请教另一位同事(比较熟悉编译器)来一起分析仍然没有解决问题。归根结底还是对编译器编译过程特别是make configure有畏难情绪,不愿意过多地去摸索有关系,看来以后还的加强对编译环境、脚本等加强熟悉过程。
经过以上的编译配置后就可使用 工具命令进行调试了:
Snmpwalk –v3 –u luoxin –a MD5 -A 12345678 –x DES –X 12345678 –l priv 192.168.23.76 system

