snmp协议移植

SNMP协议在高通9607平台移植

主要介绍了net_snmp开源库在高通9607平台的移植,之前帮朋友公司做了一下,当时在网上找资料感觉都不全,自己整理一下

SNMP简介

SNMP(Simple Network Management Protocol)简单网络管理协议,是一个基于C/S模型的应用层协议,SNMP协议实现了一种功能当管理端需要获取被管理端的一个状态信息时,管理端就发送一个获取指令给被管理端,被管理端收到此指令后把管理端要获取的信息封装成报文后返回给管理端;当管理端需要修改被管理端上的一些配置参数时,管理端就发送一个修改指令给被管理端,被管理端收到后修改相应的配置,如果修改成功,则返回修改成功的信息给管理端,如果未修改成功,则返回相应的错误信息给管理端;如果被管理端自己知道自己发生了故障,那它就主动发生一个消息给管理端,说明自己哪里出现了故障。
目前有3个协议版本分别是SNMPv1,SNMPv2c,SNMPv3,SNMPv1版是最始的版本,实现简单,存在较多安全缺陷,SNMPv2c版本质上与SNMPv1相同,只是在前一版上在功能上做了加强,并增加了getbulk操作等,还增加了一些更直观的错误响应,SNMPv3版解决了前两个版本在安全上的问题,采用了USM和VACM技术,增加了更强的认证机制。
SNMP默认采用UDP的方式进行传输,默认端口分别是UDP的161号端口和162号端口,161端口用于接收和发送SNMP的请求和响应,162号端口用于接收SNMP的主动上报也就是trap

SNMP协议内容

SNMP架构

SNMP为管理员提供了一个网管平台(NMS),又称为管理站,负责网管命令的发出、数据存储、及数据分析。被监管的设备上运行SNMP代理(Agent),代理实现设备与管理站的SNMP通信。
snmp协议移植_第1张图片

SNMP操作命令

SNMP提供了四种基本命令分别是get,set,getnext,trap

  • Get:管理站读取代理者处对象的值。它是SNMP协议中使用率最高的一个命令,因为该命令是从网络设备中获得管理信息的基本方式。
  • Set:管理站设置代理者处对象的值。它是一个特权命令,因为可以通过它来改动设备的配置或控制设备的运转状态。它可以设置设备的名称,关掉一个端口或清除一个地址解析表中的项等。
  • Getnext:
  • Trap:
    代理者主动向管理站通报重要事件。它的功能就是在网络管理系统没有明确要求的前提下,由管理代理通知网络管理系统有一些特别的情况或问题
    发生了。如果发生意外情况,客户会向服务器的162端口发送一个消息,告知服务器指定的变量值发生了变化。通常由服务器请求而获得的数据由服务器的161
    端口接收。Trap 消息可以用来通知管理站线路的故障、连接的终端和恢复、认证失败等消息。管理站可相应的作出处理。

SNMP协议结构

SNMP协议定义了数据包的格式,及网络管理员和管理代理之间的信息交换,它还控制着管理代理的MIB数据对象。因此,可用于处理管理代理定义的各种任务。
一条SNMP消息由"版本号"、"SNMP共同体名"和"协议数据单元(PDU)"构成,数据包的长度不是固定的。

在这里插入图片描述
• 版本识别符(version identifier):用于说明现在使用的是哪个版本的SNMP协议,确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。
• 团体名(Community Name):团体(community)是基本的安全机制,用于实现SNMP网络管理员访问SNMP管理代理时的身份验证。类似于密码,默认值为 public。团体名(Community name)是管理代理的口令,管理员被允许访问数据对象的前提就是网络管理员知道网络代理的口令。如果把配置管理代理成可以执行Trap命令,当网络管理 员用一个错误的分区名查询管理代理时,系统就发送一个autenticationFailure trap报文。
• 协议数据单元(PDU):PDU (协议数据单元)是SNMP消息中的数据区, 即Snmp通信时报文数据的载体。PDU指明了SNMP的消息类型及其相关参数

MIB(管理信息库)

管理信息(MIB)库可以理解成为agent维护的管理对象数据库,MIB中定义的大部分管理对象的状态和统计信息都可以被NMS访问。MIB是一个按照层次结构组织的树状结构,每个被管对象对应树形结构的一个叶子节点,称为一个object,拥有唯一的数字标识符
MIB数据对象以一种树状分层结构进行组织,这个树状结构中的每个分枝都有一个专用的名字和一个数字形式的标识符。结构树的分枝实际表示的是数据对象的逻 辑分组。而树叶,有时候也叫节点(node),代表了各个数据对象。在结构树中使用子树表示增加的中间分枝和增加的树叶。
使用这个树状分层结构,MIB浏览器能够以一种方便而且简洁的方式访问整个MIB数据库。MIB浏览器是这样一种工具,它可以遍历整棵MIB结构树,通常 以图形显示的形式来表示各个分枝和树叶对象。可以通过其数字标识符来查找MIB中的数据对象,这个数字标识符号从结构树的顶部(或根部)开始,直到各个叶 子节点(即数据对象)为止。这种访问方式和文件系统的组织方式一致。两者的主要区别在于文件系统中的路径名可以以绝对也可以以相对方式表示,而MIB数据 对象只能以绝对方式表示,不能使用相对方式。每一个节点都有一个对象标识符(OID)来唯一的标识,每个节点用数字和字符两种方式显示,其中对象标识符OID是由句点隔开的一组整数,也就是从根节点 通向它的路径。一个带标号节点可以拥有包含其它带标号节点为它的子树,如果没有子树它就是叶子节点,它包含一个值并被称为对象。比如网络设备名的oid 是.1.3.6.1.2.1.1.5.0,其值为设备名称的字符串。
网络资源被抽象为对象进行管理。但SNMP中的对象是表示被管资源某一方面的数据变量。对象被标准化为跨系统的类,对象的集合被组织为管理信息库 (MIB)。MIB作为设在代理者处的管理站访问点的集合,管理站通过读取MIB中对象的值来进行网络监控。管理站可以在代理者处产生动作,也可以通过修改变量值改变代理者处的配置。
snmp协议移植_第2张图片
由上图可见,MIB是以树状结构来组织数据的,每一个节点表示一个被管理的对象,每一个对象都可以从根开始找出一条唯一的路径,这个路径就是OID,如图中的system的OID就是(.1.3.6.1.2.1.1)。

OID(Object Identifier)

每个管理对象都有自己的OID(Object Identifier),管理对象通过树状结构进行组织,OID由树上的一系列整数组成,整数之间用点(.)分隔开,树的叶子节点才是真正能够被管理的对象。

SNMP开发

Net_SNMP简介

Net-SNMP是一个免费的、开放源码的SNMP实现,它包括agent和多个管理工具的源代码,支持多种扩展方式。不仅扩展了获取方式,而且对于数据类型也有一定的扩展。
Net-SNMP不仅提供了管理工具,还提供了一些开发配置工具,这些工具一般使用perl语言的脚本提供:主要包括mib2c、net-snmp-config等。上面所说的两个工具方便开发者进行开发。用户可到https://sourceforge.net/projects/net-snmp 网站下载最新的SNMP源码。

Net_SNMP在高通9x07平台的移植

高通9x07平台分为两部分AP侧和MODEM侧,AP侧为一个嵌入式Linux操作系统,Net_SNMP的移植主要在AP的Linux操作系统上进行,步骤如下

  1. 搭建9x07平台交叉编译链,这里我们采用中兴ME3630模块提供的OpenLinux SDK用来搭建交叉编译链(Ubuntu 16.04)
    snmp协议移植_第3张图片
    snmp协议移植_第4张图片将SDK中mdm9607 和 x86_64-linux这两个路径增加到环境变量中
    在这里插入图片描述
    增加完成后重启虚拟机,打开终端输入arm-oe-linux-gnueabi-后按Tab键,如图
    在这里插入图片描述

输入arm-oe-linux-gnueabi-gcc -v 如下图
snmp协议移植_第5张图片
到此交叉编译链搭建成功
2. 将下载好的net_snmp源码解压这里用的是net-snmp-5.7.2,解压后进入解压后的目录
snmp协议移植_第6张图片
开始编译NET_SNMP源码,先用configure命令进行配置
在这里插入图片描述
需要注意几个地方,–prefix 用于指定编译后的生成文件的路径 --with-cc=arm-oe-linux-gnueabi-gcc --with-ar=arm-oe-linux-gnueabi-ar 指定交叉编译工具–disable-embedded-perl --disable-perl-cc-check --enable-shared=no --enable-static 禁用嵌入式的perl 脚本防止报错,编译使用静态链接方式 --with-sysroot=/home/hjs/program/sdk/mdm9607 指定编译过程中的包含的路径和链接路径,编译过程中有时会包CFLAGS路径错误,这是由于交叉编译器过程中找不到包含路径导致,这时需要动态修改CFLAGS的值如下export CFLAGS=/home/hjs/program/sdk/mdm9607 具体的配置可通过输入./configure –h 来查看说明,输入配置命令后,直接按Enter 采用默认选择向下进行即可。
3. 配置完成后输入sudo make 和 sudo make install 两条命令即可,最终会在配置的生成路径中生成交叉编译后的可执行文件
snmp协议移植_第7张图片
sbin 目录中分别是snmpd 和snmptrapd 两个进程,用于接收snmp请求和snmptrap上报,bin目录下为snmpget snmpset snmpgetnext以及snmptrap请求和上报程序,还有一些用于生成配置文件的脚本,这里ME3630模块用于接收snmp请求和上报trap,因此我们需要的是snmpd 和 snmptrap两个进程

SNMPD.CONF配置

模块用于接收snmp的请求,因此需要启动snmpd 进程用于接收snmp请求以及返回响应,snmpd的启动方式为./snmpd -c …/share/snmpd.conf 需要指定snmpd.conf 配置文件,配置文件说明

snmp协议移植_第8张图片

针对v1 和 v2c版本只需要配置community即可,rocommunity表示只读用户为public
rwcommunity表示读写用户为private
针对v3 相对复杂一点
createUser admin MD5 “12345678” DES 87654321
表示创建用户admin 密码为12345678 采用MD5方式加密,认证密钥为87654321采用DES方式认证
rwuser admin
表示该用户为读写用户
createUser user1 MD5 “12345678” DES 87654321
同上
rouser user1
表示为只读用户
在这里插入图片描述
表示将以.1.3.6.1.4.1.42777.10.1 和.1.3.6.1.4.1.42777.10.2,.1.3.6.1.4.1.42777.10.3开头的oid请求作为参数传递给/usr/bin/mSnmpAgent进程,mSnmpAgent这个进程需要我们自己实现。
例如当上位机请求.1.3.6.1.4.1.42777.10.2.1.0 时,snmpd收到请求解析完成后,会启动mSnmpAgent进程,启动方式为/usr/bin/mSnmpAgent -g .1.3.6.1.4.1.42777.10.2.1.0 表示上位机请求.1.3.6.1.4.1.42777.10.2.1.0这个节点的值,如果是设置则为/usr/bin/mSnmpAgent -g .1.3.6.1.4.1.42777.10.2.1.0 i 100 表示上位机设置.1.3.6.1.4.1.42777.10.2.1.0这个节点的值为一个整数100,mSnmpAgent 由我们自己经行编码实现例如
通过pass配置将printf重定向,mSnmpAgent应用通过printf即可将具体的值传递给snmpd进程用于请求的响应发送

SNMPTRAPD.CONF

Snmptrapd.conf 为snmptrapd 进程的启动配置文件,用于接收snmptrap上报,与snmpd.conf配置文件类似,需要创建用户以及赋予用户权限
snmp协议移植_第9张图片
接收到的trap上报可通过traphandle 的方式将上报传递给一个应用,类似于snmpd.conf的pass配置。

SNMPTRAP使用

Snmptrap是运行在终端中的应用,用户上报终端的一些异常信息,这里我们单独创建了一个进程用于执行snmptrap命令主动上报一些信息
在这里插入图片描述
分别是v2c 和 v3版本下的snmptrap命令格式,具体命令格式也可通过执行snmptrap –h的方式获取
snmp协议移植_第10张图片
相关的类型枚举值,值类型,鉴权和加密方式,安全等级
snmp协议移植_第11张图片
v2c和v3的结构体,执行上报的结构体
snmp协议移植_第12张图片
生成v2c 版本snmptrap命令
snmp协议移植_第13张图片
生成v3版本的snmptrap命令
在这里插入图片描述
打印并执行命令
测试代码如下
snmp协议移植_第14张图片
原始C文件和朋友公司有关,这里就不上传了 有疑问可以具体问题咨询 下文在介绍如何测试snmp是否正常启动

你可能感兴趣的:(网络协议移植,snmp,网络协议,linux,嵌入式)