SNMP 自定义节点开发

1.snmp 协议

简单网络管理协议(SNMP),由一组网络管理的标准组成,是基于TCP/IP协议的网络管理的一部分,TCP/Ip的网络管理包含3个部分组成: 1、管理信息库MIB 2、一套关于MIB的公用结构和表示符号,管理信息结构SMI 3、管理进程和代理进程的通信协议SNMP。
SNMPv1:SNMPv1使用基于团体名进行报文认证
SNMPv2:SNMPv2在第一版SMI资料型态上进行了增加和强化。位元串、网络地址、计数器 并加入了getbulk-request 和inform
SNMPv3:SNMPv3主要在安全性和远端配置上进行了强化,引入了信息认证,校验。
SNMPv1种定义的5种报文: get-request get-next-request set-request get-response trap
在这里插入图片描述

SNMP报文一般是采用udp传输的:
在这里插入图片描述

2.snmp代理开发流程图

在这里插入图片描述

3.snmp 安装(ubuntu环境)

3.1在线安装

1.安装

apt-get install snmpd snmp snmp-mibs-downloader

2.配置snmp
找到并打开snmpd的配置文件

cp /etc/snmp/snmpd.conf  /etc/snmp/snmpd.conf.bak
vim /etc/snmp/snmpd.con

将下面两行注释掉

view   systemonly  included   .1.3.6.1.2.1.1
view   systemonly  included   .1.3.6.1.2.1.25.1

然后在其下面添加

view   systemonly  included   .1

将下面的行注释掉

 agentAddress udp:127.0.0.1:161 

并取消下面行的注释

#agentAddress udp:161,udp6:[::1]:161

3.重启snmp

  service snmpd restart

4.验证snmp

snmpwalk -c public -v 2c localhost  .1.3.6.1.2.1.1

或者通过IReasoning MIB Browser进行验证
在这里插入图片描述

3.2离线安装

1.设备上传软件包

https://sourceforge.net/projects/net-snmp/files/net-snmp/5.7.3/

2. 解压文件

tar -xvf net-snmp-5.7.3.tgr.gz

3.编译
  1. ./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc/
    –libdir=/usr/lib64/–disable-embedded-perl–with-default-snmp-version=2
    –with-sys-c
  2. make -f Makefile.proxy clean
  3. make -f Makefile.proxy
  4. mkdir -p $PWD/release
  5. rm -rf $PWD/release/*
  6. make INSTALL_PREFIX=$PWD/release install
4.安装

cd release/ && tar -zcvf netsnmp5.7.3.tar.gz usr

5.开启snmp服务

service snmpd start

6.验证snmp

snmpwalk -c public -v 2c localhost .1.3.6.1.2.1.1

4.snmp配置

###############################################################################
#
#  ACCESS CONTROL
#
#  view only Asterfusion specified
 view   default  included   .1.3.6.1.4.1.12345
 view   default  included   .1.3.6.1.4.1.12345.1
 view   default  included   .1.3.6.1.4.1.12345.2

# Traps

###############################################################################
#
#  ACTIVE MONITORING
#
#
#  Event MIB - automatically generate alerts
#
 iquerySecName   internalUser
 rouser          internalUser
#
#  AgentX Sub-agents
#
                                           #  Run as an AgentX master agent
 master          agentx
                                           #  Listen for network connections (from localhost)

###############################################################################
#
# USER DEFINED
#
rwcommunity public 127.0.0.1 -V specified_all
informsink 127.0.0.1:11 public #informs id 1 v2c
trap2sink 127.0.0.1:111 public #traps id 1 v2c

1.agentAddress 需要监听的网络 (Snmp默认的端口号为161)
2.访问控制:View GROUP included + 所需节点
3.rocommunity/rwcommunity 社区名 
4.Master agentx 作为代理运行
5.sysObjectID 设备oid
6.trap2sink 127.0.0.1:162 warning_trap 告警发送设置

5.MIB文件

1.MSI管理信息结构:在RFC1155中定义

2.MSI中定义的数据类型:

Integer: 整数类型,用于表示整数值。在SNMP中,整数类型用于表示各种不同的状态、计数器、阈值等。
Counter: 计数器类型,用于表示只增不减的计数器。通常用于统计事件发生次数或流量统计。
Gauge: 量表类型,用于表示可以任意变化的量。通常用于表示内存使用情况、进程状态等。
TimeTicks: 时间标记类型,用于表示自系统启动以来的时间(以1/100秒为单位)。
IPAddress: IP地址类型,用于表示网络设备的IP地址。
MACAddress: MAC地址类型,用于表示网络设备的MAC地址。
NetworkAddress: 网络地址类型,用于表示网络设备的网络地址(如IPv6地址)。
OctetString: 字节字符串类型,用于表示任意字节序列。通常用于存储设备配置信息或数据包内容。
ObjectIdentifier: 对象标识符类型,用于唯一标识管理对象。对象标识符由一系列数字组成,每个数字代表一个层次结构中的节点。
NULL: 空类型,用于表示没有值的变量。在某些情况下,空变量可能表示未知值或未设置的值。

对象标识符:
对象标识是一个整数序列,以点(“.”)分隔。这些整数构成一个树型结构
在这里插入图片描述

MIB管理信息库:
在RFC1213中详细描述,就是所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合。当对MIB变量进行操作,如查询和设置变量的值时,必须对MIB的每个变量进行标识。只有叶子结点是可操作的。SNMP没法处理表格的一整行或一整列,在MIB中所有实例标识都是按照字典序进行排序的。在编写私有MIB文件时,要遵循ASN.1语法规则

  1. 符号定义:ASN.1中符号的定义没有先后次序,只要能够找到该符号的定义即可,不必担心在使用它之前是否被定义过。
  2. 标识符、关键字、参考:标识符、关键字、参考都要以一个字母开头,后接字母、数字或者连字符‘-’,不能以连字符结尾,也不能连续出现两个连字符。关键字全部大写在标识符中,只有类型和模块名字是以大写字母开头的,其他标识符都是以小写字母开头。
  3. 字符串形式:字符串有三种形式,具体可参考类型。带小数点的小数形式不能在ASN.1中直接使用,ASN.1中实数的实际定义为:尾数、基数和指数。
  4. 注释:注释以两个连字符“–”开始,结束于行的末尾或者该行中另一个双连字符。
--定义一个类型为INTEGER的实例Age
Age ::= INTEGER {age(18), vehicleType(20)}

--定义一个类型为INTEGER的实例VehicleType
VehicleType ::= INTEGER {car(0), bus(1), taxi(2)}
 IPV6-MIB DEFINITIONS ::= BEGIN
 ipv6MIBObjects OBJECT IDENTIFIER   ::= { ipv6MIB 1 }
 ipv6Forwarding OBJECT-TYPE
     SYNTAX      INTEGER {
                  forwarding(1),    -- acting as a router

                                    -- NOT acting as
                  notForwarding(2)  -- a router
                 }
      MAX-ACCESS read-write
      STATUS     current
      DESCRIPTION
        "The indication of whether this entity is acting
        as an IPv6 router in respect to the forwarding of
        datagrams received by, but not addressed to, this
        entity.  IPv6 routers forward datagrams.  IPv6
        hosts do not (except those source-routed via the
        host).

        Note that for some managed nodes, this object may
        take on only a subset of the values possible.
        Accordingly, it is appropriate for an agent to
        return a `wrongValue' response if a management
        station attempts to change this object to an
        inappropriate value."
      ::= { ipv6MIBObjects 1 }

DEFINITIONS ::= BEGIN SNMP标识一个MIB文件开始
AbnormalLink MODULE-IDENTITY 该定义添加了一个公共的标示段来对整个信息描述块进行顶层的文字描述,以加强对管理MIB描述块的文档管理和控制
OBJECT-IDENTIFIFIER 表示是哪一个树枝下的子分支
OBJECT-TYPE 表示子叶节点
SYNTAX (syntax) 表示对象的类型关键字
ACCESS (access) 被管对象的访问方式的关键字
STATUS (status) 被管对象的状态的关键字

6.节点信息脚本

自开发

7.agent代理开发

1、编写MIB文件
2、将MIB文件放入snmp对应的MIBs文件路径下,重启snmp服务
输入命令snmptranslate –Tp –IR MIB标识名::公共模块标识名 查看是否可以出现节点树型结构
3、使用mib2c 可根据MIBs 文件自动生成对应的代理发开源代码 env MIBS=“+/usr/local/share/snmp/mibs/mmeAbnormalLinkTable.MIB” mib2c AbnormalLink
之后会有提示选择,根据提升选择对应的生成风格。这里推荐使用2,2,1,1
4、成功后会生成AbnormalLink.c 和 AbnormalLink.h 文件
5、c文件介绍
xxxx_entry 子叶节点组成的数据结构,即SEQUENCE定义的结构体
Xxxx_head 表结构头指针
Init_xxxx 初始化函数入口
Initialize_table_xxxx 初始化函数(一般情况下不需要修改)
Xxxx_createEntry 创建节点函数(一般情况下不需要修改)
Xxxx_removeEntry 删除节点函数(需更具实际情况修改)
Xxxx_load 给节点赋值的函数(需要自己编写具体内容)
Xxxx_free 释放整个xxxx_head
Xxxx_get_first_data_point 获取节点值,返回下一个节点索引
Xxxx_get_next_data_point 返回下一个节点索引,无返回NULL
Xxxx_handler 处理程序,具体接收request时的处理动作。
具体情况下可以适当重写这两个函数或者不用这两个函数,一般情况下,当文件内容处理很麻烦时,写自己的处理赋值函数是可以的。好处是灵活度高,坏处是需要在处理函数中添加赋值。
去掉:
Xxxx_load 给节点赋值的函数(需要自己编写具体内容)
Xxxx_free 释放整个xxxx_head
Init函数中也要去掉对应的调用
6、添加私有代码
根据需求添加代码,用于完成代理程序信息获取
7、生成守护程序
当编写完毕之后:需要将生成的.c文件编译,之后生成守护进程。
生成守护进程的方法:需要根据具体实际情况修改makefile文件,执行make

总结:

  1. 先下载snmp服务,安装snmp
  2. 验证snmp能否正常使用
  3. 自定义节点开发,先按照规范定义mibs文件,然后根据工具生成代码,主要是.c和.h文件,生成的代码会提示你需要修改的地方,这里可能需要安装一些依赖
apt-get install libsnmp-dev
apt-get install libsnmp-base
apt install net-snmp
env MIBS=“+/usr/local/share/snmp/mibs/mmeAbnormalLinkTable.MIB” mib2c   AbnormalLink

4.完善节点信息,主要是编写C代码,然后打包运行
5.在IReasoning MIB Browser上验证我们的生成的节点信息是否正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老虎爱代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值