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.编译
- ./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc/
–libdir=/usr/lib64/–disable-embedded-perl–with-default-snmp-version=2
–with-sys-c - make -f Makefile.proxy clean
- make -f Makefile.proxy
- mkdir -p $PWD/release
- rm -rf $PWD/release/*
- 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中定义的数据类型:
对象标识符:
对象标识是一个整数序列,以点(“.”)分隔。这些整数构成一个树型结构
MIB管理信息库:
在RFC1213中详细描述,就是所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合。当对MIB变量进行操作,如查询和设置变量的值时,必须对MIB的每个变量进行标识。只有叶子结点是可操作的。SNMP没法处理表格的一整行或一整列,在MIB中所有实例标识都是按照字典序进行排序的。在编写私有MIB文件时,要遵循ASN.1语法规则
- 符号定义:ASN.1中符号的定义没有先后次序,只要能够找到该符号的定义即可,不必担心在使用它之前是否被定义过。
- 标识符、关键字、参考:标识符、关键字、参考都要以一个字母开头,后接字母、数字或者连字符‘-’,不能以连字符结尾,也不能连续出现两个连字符。关键字全部大写在标识符中,只有类型和模块名字是以大写字母开头的,其他标识符都是以小写字母开头。
- 字符串形式:字符串有三种形式,具体可参考类型。带小数点的小数形式不能在ASN.1中直接使用,ASN.1中实数的实际定义为:尾数、基数和指数。
- 注释:注释以两个连字符“–”开始,结束于行的末尾或者该行中另一个双连字符。
--定义一个类型为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
总结:
- 先下载snmp服务,安装snmp
- 验证snmp能否正常使用
- 自定义节点开发,先按照规范定义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上验证我们的生成的节点信息是否正确