NET-SNMP 配置与MIB 自定义

来源:互联网 发布:中文翻译拼音拍摄软件 编辑:程序博客网 时间:2024/06/08 08:31
配置文件对于net-snmp的运行十分重要,net-snmp中提供了一个EXAMPLE.conf。
可以在EXAMPLE.conf的基础上进行修改,需要修改的地方主要包括:
1) com2sec 设置可访问的IP地址,访问的口令以及分组
     sec.name                source                  community
 com2sec local              localhost                  private
 com2sec mynetwork    10.8.0.0/16              private
 2)group   设置安全用户名的组
              sec.model          sec.name
group         MyRWGroup v1         local
group         MyRWGroup v2c        local
group         MyRWGroup usm        local
group         MyROGroup v1         mynetwork
group         MyROGroup v2c        mynetwork
group         MyROGroup usm        mynetwork
 3)view  可以对哪些MIB子树进行访问
              incl/excl                subtree                          mask
view all          included              .1
4)access   指定各个组对MIB子数的读写权限
      context sec.model  sec.level  match             read  write  notif
access MyROGroup ""      any       noauth    exact  all    none    none
access MyRWGroup ""      any       noauth    exact  all    all    none
3、命令行
在./configure ; make; make install之后在net-snmp/agent目录下会生成一系列的可执行文件。可以用命令行调用这些执行文件,主要用于测试。主要的命令包括:
先在一个窗口中执行./snmpd
1、snmptable
再打开另一个窗口执行snmptable –v 1 –c demopublic -Os localhost  sysORTable,会显示sysORTable的详细信息。(获得table的信息)
2、snmpget
可以执行 snmpget –v 1 –c public localhost SNMPv2-MIB::sysUpTime.0,会得到sysUpTime变量的值。(获得普通变量的信息)。
3、......
自己查吧 :http://net-snmp.sourceforge.net/wiki/index.php/Tutorials
4、创建私有MIB文件
想要扩展agent吗?先学写MIB文件。
MIB文件的格式比较简单,参照标准MIB文件写就OK了,之后可以用MG-soft编译。在archlinux上MIB文件库是放在/usr/share/snmp/mibs/下面。
几点注意的问题:
1、注意IMPORTS 私有mib的上级节点
2、注意IMPORTS 变量的类型名,如DisplayString,直接使用的话是不能识别的。
3、注意大小写。
4、注意编译的时候一定把error和warning全都消灭掉。
5、扩展 agent
到这里你已经应该正确的写出了一个私有的MIB文件,你需要把它放置到系统的MIB文件库中。我的系统的MIB库路径是/usr/share/snmp/mibs/。
然后开始学习使用MIB2C这个强大的工具,它的作用是把你写好的一个MIB文件,转化成一个或多个在net-snmp下可以使用的.c/.h文件。
一个简单的例子:当你写成了一个叫做ucdDemoPublic的私有MIB文件。
mib2c -c mib2c.scalar.conf  ucdDemoPublic就可以生成ucdDemoPublic.c和ucdDemoPublic.h
MIB2C有很多版本,也有很多参数可供选择,可以在netsnmp的官网上查到:http://net-snmp.sourceforge.net/docs/man/mib2c.html
重要的参数是 –c 后面的那个.conf值:
mib2c.mfd.conf
mib2c.scalar.conf
mib2c.int_watch.conf
mib2c.iterate.conf
mib2c.create-dataset.conf
mib2c.array-user.conf
mib2c.column_defines.conf
mib2c.column_enums.conf
一个重要的问题:
在使用mib2c时,需要配置一个mib2c的配置文件:snmp.conf
我的配置文件路径是:/var/net-snmp/snmp.conf
在配置文件中要加入类似下面的语句,表示我要把XXX-MIB.txt这个mib文件转化成c文件。
mibfile /usr/share/snmp/mibs/XXX-MIB.txt
简单变量的代码生成
用mib2c.scalar.conf生成简单MIB变量的XXX.c和XXX.h,如上例。生成MIB之后需要自己根据具体参数的含义,修改get或set时的动作。在XXX.c中包含两个重要的函数:init_XXX()和handle_XXX(),需要在init_XXX中修改oid,在handle_XXX中的case MODE_GET和case MODE_SET_ACTION中设置GTE和SET的函数。
Table变量的代码生成
用mib2c.mfd.conf生成table类型的MIB文件,生成的文件比较多,包括:XXX.c/.h;XXX_data_access.c/.h; XXX_data_get.c/.h; XXX_data_set.c/.h; XXX_enums.h; XXX_interface.c/.h; XXX_oids.h;
Snmpget的修改:需要修改的是XXX_data_access.c中的XXX__container_load函数,修改XXXTable中的变量值。
Snmpset的修改:需要修改的是:
 XXX_data_set.c:XXXTable_commit中设置rowreq_ctx->column_set_flags的值,表示已经修改了XXXTable中的某一项。
XXX_data_set.c:中所有的XXX_set.c中指定自己想要的值。
代码集成     
生成了正确的.c/.h文件之后,需要把代码继承到snmpd中,有两种比较靠谱的方法:
1、  把所扩展的agent MIB,静态的集成到snmpd中。方法:把所生成的.c/.h文件拷贝到/net-snmp/agent/mibgroup下面,然后重新 ./configure --with-mib-modules="XXX"; make; make install, 好了你的私有MIB已经被静态集成到snmpd里面了,最后用命令行snmpget;snmpset试验一下。
2、  是动态加载的方式,自己写一个makefile,把所有生成的.c/.h编译成为一个.so,把这个.so放到一个特定的路径下面,并在snmpd.conf文件中指明.so的位置。
1)编译的时候除指定-fPIC -shared -O0参数之外,还需要指定= -I. `net-snmp-config --cflags`,在最后链接成.so的时候还需要指定`net-snmp-config --libs`参数
2)在需要在snmpd.conf文件中指定.so的位置:如
dlmod exampleTable /usr/lib/exampleTable.so
3)在运行./snmpd的时候需要指定所需的.so如:
./snmpd –f –L –Dexample,DLmod,
这样也可以实现对agent的动态扩展。
6、扩展trap
net-snmp的trap也是可以扩展的,我用的方法是把写好的trap代码(.c)放到snmp/snmplib下面,修改一下snmplib的Makefile,make;make install,即可
其代码的样例如下:
 
view plaincopy to clipboardprint?
1.    #include  
2.    #include  
3.    config_require(util_funcs)          
4.    int  TrapSendTest()  
5.    {  
6.        netsnmp_session session,*ss;  
7.        netsnmp_pdu *pdu;  
8.        long sysuptime;  
9.        char csysuptime[20];  
10.        int status = 0;  
11.        oid oid_sysuptime[] = { 1,3,6,1,2,1,1,3,0 };  
12.        char *cp1 = "10.8.72.1", *cp2 = "public";   
13.      
14.        snmp_sess_init(&session);  
15.        session.version = SNMP_VERSION_2c;  
16.        session.peername = cp1;  
17.        session.remote_port = 162;  
18.        session.community = (unsigned char*)cp2;  
19.        session.community_len = strlen((char *)session.community);  
20.        session.retries = 3;  
21.        session.timeout = 2000;  
22.        session.sessid = 0;  
23.      
24.        SOCK_STARTUP;  
25.        ss = snmp_add(&session,netsnmp_transport_open_client("snmptrap",   
26.            session.peername),  
27.            NULL,   
28.            NULL);  
29.        if (ss == NULL)   
30.        {  
31.            snmp_sess_perror("snmptable", &session);  
32.            SOCK_CLEANUP;  
33.        }  
34.        pdu = snmp_pdu_create(SNMP_MSG_TRAP2);    
35.        sysuptime = get_uptime();  
36.        sprintf(csysuptime, "%ld", sysuptime);   
37.        status = snmp_add_var(pdu, oid_sysuptime, OID_LENGTH(oid_sysuptime), 't', csysuptime);  
38.        if(status != 0)  
39.        {   
40.            snmp_sess_perror("snmptrap add sysuptime error!", &session);  
41.            return -1;  
42.        }  
43.        status = snmp_send(ss, pdu);  
44.        if (status == 0)  
45.        {   
46.            snmp_sess_perror("snmptrap send info error!", &session);  
47.            snmp_free_pdu(pdu);  
48.            return -2;  
49.        }   
50.        snmp_close(ss);  
51.        snmp_shutdown("snmptrap");  
52.        return 0;  
53.    }  
在实际用的时候,改一改参数就OK了。
Makefile的修改:
在.o和.lo编译目标列表尾部加入你所加入的文件名即可:XXX.o和XXX.lo, 这样你扩展的trap就静态加入snmpd中了
Snmpd的调用:snmpd的监听程序和你所扩展的trap程序是不能顺序运行的,否则会互相影响。所以要fork一下,父子进程分别运行。
7、调试方法
1、可以使用strace  -f  -L ./snmpd的方法跟踪snmpd调用的系统调用,来猜测snmpd的运行流程          
2、由于snmpd是后台运行的,可以用syslog.
8、总结
net-snmp很好很强大,但是总是有BUG,当你实在找不到错误原因时,不妨找找它的BUG

好运!


http://blog.sina.com.cn/s/blog_9e7fb3070101ihfl.html


0 0
原创粉丝点击