SNMP(Simple Network Management Protocol)的学习

本文深入介绍了SNMP(简单网络管理协议)的基础知识,包括SNMP的版本、主要操作(Get、GetNext、Set等)、消息格式及MIB(管理信息库)的概念。同时,文章还详细解析了SNMPv1的消息格式,并通过实例展示了如何分析SNMP的消息。

SNMP概要

SNMP(Simple Network Management Protocol)CCITT制订的网络管理协议,总共有三个版本:SNMPv1,SNMPv2,SNMPv3).目前, SNMPv1已经被广泛使用了,几乎所有的网络产品都提供对SNMPv1的支持, SNMPv2完全兼容SNMPv1,具有远程管理能力,它使管理人员可以将整个子网进行管理,而不是对整个子网内的设备进行管理,此外安全性方面也有重大提高。下面基于SNMPv1,介绍一下SNMP的基本知识.

首先,郑重声明:下面的介绍都是基于我的理解,如有错误和不妥之处请指正.

  一些基本概念

SNMPSimple Network Management Protocol:简单网络管理协议

它是一个标准的用于管理IP网络上结点的协议。此协议包括了监视和控制变量集以及用于监视设备的两个数据格式:SMIMIB

MIBManagement Information Base:管理信息库

由网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。

SMIStructure of Management Information:管理信息结构

用于定义通过网络管理协议可访问的对象的规则。SMI定义在MIB中使用的数据类型及网络资源在MIB中的名称或表示。

ASN.1Abstract Syntax Notation One:抽象语法定义

用于定义语法的正式语言,在SNMP中它用于定义SNMP协议数据单元和对象的格式。

PDUProtocol Data Unit:协议数据单元

在网络中传送的数据包。

BERbasic encoding rules:基本编码规则

CCITT (X.209)ISO (ISO 8825)指定的编码规则,它描述了如何ASN.1类型表示为字符串。

1.1    MIB介绍

简单的说.MIB就是一个按照SMI定义的一个树型结构.如下所示:

 

SMI就是告诉你这颗树怎么定义的一个规范.大家都用adventNet Web NMS,在代理端和管理站端可以加载很多MIB文件.那么这么多MIB文件和这个树结构是如何对应的呢?这些MIB文件之间主要有两种关系:一种是扩展关系;一种是添加子树.比如说,RFC 1213-MIBRFC 1158-MIB的扩展,也就是说RFC 1213-MIB定义的树包含了RFC 1158-MIB.一般来讲,你加载了RFC 1213-MIB,就不用加载RFC 1158-MIB.可以认为RFC XXXX-MIB定义了一棵基本树.而其他的MIB就是在基本树的某个节点下定义的一颗子树,比如在adventNet Web NMS加载Print-MIB就是在节点mib-2下添加了一棵子树.

 

 

1.2 SNMPv1的格式.

SNMP有五种操作:Get,GetNext,Set,GetResoponse,Trap. SNMP是一个简单的请求-响应协议。管理站发出请求,网元返回应答。其中:Get,GetNext,Set是管理站发给代理的请求, GetResoponse是代理发给管理站的. Get操作用于NMS从一个代理检索一个或多个MIB变量。GetNext操作用于管理站在一个代理中检索表中下一个变量的值。Set操作用于管理站在一个代理中设置MIB变量的值。如果代理可以提供一个GetGetNext操作中所有变量的值,或者可以设置Set操作中所有变量的值,它就返回一个GetResonse,通报管理站所有请求变量的值;否则, GetResonse返回请求变量的值为NULL,也就是说不返回值。此外代理可以通过Trap操作向管理站异步地通知发生的重要事件。

SNMPv1 PDU格式如下:

(a)    SNMP消息

 

(b)Get PDU,GetNext PDU,Set PDU,Response PDU

 

 

(c)Get PDU

 

 

(d) GetNext PDU

 

 

(e)Get Response PDU

 

 

(f)Set PDU

 

 

(g)Trap PDU

(h)variable-bindings

:以上的SNMP PDU格式为SNMPv1 PDU格式.

    

如上所示,SNMPv1消息分为头部和PDU单元.

SNMP头部包括两个字段:版本号和团体名.

  Version:标识使用的SNMP版本(0表示SNMPv1,1表示SNMPv2,2表示SNMPv3),代理直接抛弃与自己版本不同的SNMP消息.

  Community:使用的团体名.

团体名用于代理认证管理站是否具有相应的操作权限.一个代理上保存有多个团体名,每个团体对应着不同的操作权限.比如, 可能团体althy只允许对该代理进行GetGetNext操作,不允许进行Set操作,而团体tangtiboy既允许进行GetGetNext操作, 也允许进行Set操作.此外,不同的团体的MIB视域也可能不同,团体的MIB视域是代理本地MIB视域的一个子集,每个团体只允许对该团体的MIB视域内的对象进行操作.代理存储每个团体对应的所有管理站的IP地址,代理收到管理站的请求,判断团体名是否合法,如果合法,接下来核对发送请求的管理站的IP地址是否属于该团体..不同的管理站可以属于不同的团体.

PDU只有两种格式. Get PDU, GetNext PDU, Set PDU, GetResponse PDU的格式相同,只是Get PDU, GetNext PDU, Set PDUerror-status字段和error-index字段固定为零,这样做也体现了SNMPsimple.又是另外一种格式.

PDU type:标识PDU类型,0代表Get PDU,1代表GetNext PDU,2代表Set PDU,3代表GetResponse PDU,4代表Trap PDU.

error-status: GetResponse消息中指示在处理一个请求时发生了一个意外情况.其值可取:noError(0),tooBig(1),noSuchNane(2),badValue(3),readonly(4),genErro(5). Get PDU, GetNext PDU, Set PDU中此字段固定为零.

error-index:GetResponse消息中, error-status非零时,error-index指出是variable-bindings列表的哪个变量引起的错误,error-status为零时, error-index也为零. Get PDU, GetNext PDU, Set PDU中此字段固定为零.

variable-bindings:一列变量名(即请求的对象实例)和相应的值.Get 消息和GetNext 消息中,变量值应该设为NULL(事实上代理收到Get 消息和GetNext 消息时,会忽略值). Set消息中,变量值填入管理站设定的值. GetResponse消息中,error-status为零的情况下,返回所有请求变量的值,如果error-status不为零,返回变量值为空.

这里要说明的是Get,GetNext,Set操作都是原子的.对于Get,GetNext操作,如果variable-bindings列表中的一个变量的值无法成功获取,则代理返回的GetResponse消息variable-bindings列表中所有的值返回为NULL. .对于Set操作,如果variable-bindings列表中的一个变量的值无法成功设置, 则代理中所有相应的值都不改变,并且代理回应的GetResponse消息variable-bindings列表中所有的值返回为NULL.也就是说代理要么返回variable-bindings列表中所有的值,要么一个值也不返回.我最开始对这里有个疑问,就是要是Get,GetNext,Set操作有多个变量值不能成功获取或设置怎么办,那么GetResponse消息中error-index返回哪个变量的索引呢?这种情况是不会出现的,因为Get,GetNext,Set操作在遇到变量值不能成功获取或设置时就会停止,根本不会再去读取或设置variable-bindings列表中在它之后的变量值.

这里说明Trap PDU.

Enterprise:一个与网管系统有关的一个对象实例的值,指出产生陷阱的子系统.(???)

Agent-addr:产生陷阱的代理的IP地址.

Generic-Trap:预定义的陷阱类型.可能取值有如下7:

coldStart(0):异常重启,代理的配置和协议实体的实现改变(恢复默认值?).

warmStart(1):正常重启, 代理的配置和协议实体的实现不改变.

LinkDown(2):告知代理的一个通信连接失败.variable-bindings列表中第一个元素是接口的ifIndex实例的名字和值.

Linkup(3): 告知代理的一个通信连接已经正常.variable-bindings列表中第一个元素是接口的ifIndex实例的名字和值.

AuthenticationFailure(4):告知管理站收到一个认证失败的请求.

EgpNeighborLoss(5):告知管理站一个EGP邻居被标志为down.

EnterpriseSpecific(6):告知管理站发生了厂商自定义的特定陷阱,指出陷阱类型.

Specific-trap:更具体的指出厂商自定义的特定陷阱性质的代码.

Time-stamp:sysUptime

下面的流程图说明了代理收到管理站发送的请求消息后采取的相关操作.

   下面用etheralGetNextRequest消息为例来分析SNMP PDU的格式(可以参考ASN.1):

1.3 SNMP消息的协议分析

:红色字体为SNMP 消息,黑体是etheral的分析结果,下面是我给出的进一步分析.

其中,30 Identifier octets,表示SNMP 消息是ASN.1SEQUENCE类型;

26Length octets,表示SNMP 消息的长度是0X26;

020100表示版本号为SNMPv1(0):

02Identifier octets,表示version字段是ASN.1INTEGER类型;

01 Length octets,表示version字段的长度是1octet;

00Content octets,表示version字段的内容是0.

04067075626c 6963表示团体名为public:

04Identifier octets,表示community字段是ASN.1OCTET STRING类型;

06 Length octets,表示community字段的长度是6octet;

7075626c 6963 Content octets,”public”.ASCII.

a119表示PDU typeGetNextRequest(1):

a1Identifier octets,表示SNMP PDU的标签类型是Contect-specific,标签值为1(这里用标签值代表PDU type);

19 Length octets,表示SNMP PDU的长度是0X19octet;

02020099表示Request id0x00000099:

    02Identifier octets,表示Request id字段是ASN.1INTEGER类型;

02 Length octets,表示Request id字段的长度是2octet;

0099Content octets,表示Request id字段的内容是0x00000099.

020100表示error-statue0:

02Identifier octets,表示error-statue字段是ASN.1INTEGER类型;

01 Length octets,表示error-statue字段的长度是1octet;

00Content octets,表示error-statue字段的内容是0.

020100表示error-index0:

02Identifier octets,表示error-index字段是ASN.1INTEGER类型;

01 Length octets,表示error-index字段的长度是1octet;

00Content octets,表示error-index字段的内容是0.

30 0d 30 0b 06 07 2b 06 01 02 01 01 01表示variable-bindings的第一个变量的object identifier 1: 1.3.6 .1.2.1.1.1:

30 Identifier octets,表示variable-bindings列表是ASN.1SEQUENCE类型;

0dLength octets,表示variable-bindings列表的长度是0X0d;

30 Identifier octets,表示variable-name1 |variable-value1对是ASN.1SEQUENCE类型;

0bLength octets,表示variable-name1 |variable-value1对的长度是0X0b;

06Identifier octets,表示variable-name1字段是ASN.1OBJECT IDENTIFIER类型;

07 Length octets,表示variable-name1字段的长度是7octet;

2b 06 01 02 01 01 01代表 1.3.6 .1.2.1.1.1:

   2b代表1+3:1*40+3=0X2b;

   06 01 02 01 01 01对应关系很明显.

0500 表示variable-value1的值为NULL:

    05Identifier octets,表示variable-value1ASN.1NULL类型;

 00 Length octets,表示v variable-value1字段的长度是0octet;

 

0000   50 78 4c 70 c 3 e3 00 0d 87 cb d9 d8 08 00 45 00  PxLp..........E.

0010   00 44 a 7 4a 00 00 80 11 5e 8d 0a 0a 10 0f 0a 0a   .D.J....^.......

0020   10 af 0a ed 00 a 1 00 30 5c 8c 30 26 02 01 00 04  .......0/.0&....

0030   06 70 75 62 6c 69 63 a 1 19 02 02 00 99 02 01 00  .public.........

0040   02 01 00 30 0d 30 0b 06 07 2b 06 01 02 01 01 01  ...0.0...+......

0050   05 00                                            ..

其他4种消息的协议分析类似,不再细述.

 

 
<think>好的,用户遇到了SNMP服务启动时检测到重复IPv4地址的问题,需要排查。首先,我需要理解这个错误的具体含义。NET-SNMP的daemon在启动时检测到重复的IPv4地址,可能是因为配置文件中存在重复的监听地址,或者系统中其他服务占用了相同的IP和端口。用户使用的版本是5.9,可能需要查看该版本的特定配置方式。 接下来,我需要回忆NET-SNMP的常见配置文件和日志位置。通常,主配置文件是snmpd.conf,可能在/etc/snmp/目录下。用户需要检查其中的agentAddress配置项,是否有重复的IP地址或端口设置。例如,是否同时监听了0.0.0.0和特定IP,或者多次指定了同一个地址。 然后,系统日志/var/log/messages或syslog可能记录更详细的错误信息,这有助于确认问题。此外,使用netstat或ss命令检查是否有其他进程已经在监听相同的UDP 161端口,这也是导致冲突的常见原因。 另外,NET-SNMPsnmpd服务可能配置了多个监听地址,比如IPv4和IPv6,但用户的问题仅涉及IPv4。需要确保配置中没有无意中重复的IPv4地址。如果用户有多个网络接口,也需要确认每个接口的IP是否唯一,避免冲突。 如果用户已经修改了配置文件,可能需要重启snmpd服务并观察是否还有错误。此外,启动时使用调试模式,如snmpd -f -Le,可以输出更详细的日志,帮助定位问题。 最后,考虑NET-SNMP版本5.9是否存在已知的相关问题,可能需要升级到更新的版本。同时,查看官方文档或社区讨论是否有类似问题的解决方案。 在生成相关问题时,需要覆盖配置检查、端口冲突、日志分析、调试方法以及版本升级等方面,帮助用户全面排查问题。</think>### SNMP服务检测到重复IPv4地址排查步骤 #### 1. 检查配置文件 NET-SNMP主配置文件路径通常为$ /etc/snmp/snmpd.conf $,重点检查以下配置项: ```bash # 查看监听地址配置 grep "agentAddress" /etc/snmp/snmpd.conf ``` 可能出现的问题形式: - 同时配置了多个UDP监听地址 - 重复定义$ agentAddress udp:161,udp:161 $ - IPv4与IPv6混合配置冲突 #### 2. 端口占用检测 使用命令检查161端口占用情况: ```bash netstat -anup | grep :161 # 或 ss -ulnp | grep :161 ``` 若输出包含多个snmpd进程或其他服务进程,例如: ```bash udp 0 0 0.0.0.0:161 0.0.0.0:* 1234/snmpd udp 0 0 192.168.1.10:161 0.0.0.0:* 5678/other_service ``` 说明存在端口冲突[^1] #### 3. 日志分析 查看系统日志定位错误时间点: ```bash journalctl -u snmpd --since "10 minutes ago" # 或 tail -50 /var/log/messages | grep snmpd ``` 典型错误日志特征: ```log snmpd[1234]: duplicate IPv4 address detected on interface eth0 (192.168.1.10) ``` #### 4. 接口配置验证 通过ip命令检查网络接口配置: ```bash ip -4 addr show ``` 特别注意: - 是否存在多个接口分配相同IP - 虚拟接口或docker容器导致的地址冲突 - VIP漂移场景下的地址重叠 #### 5. 调试模式启动 临时使用调试模式获取详细日志: ```bash snmpd -f -Le -Ducd_snmp ``` 关键调试参数说明: - $ -f $:保持前台运行 - $ -Le $:输出到标准错误 - $ -Ducd_snmp $:启用详细调试 #### 6. 版本特性验证 针对NET-SNMP 5.9的特殊注意事项: - 检查配置文件兼容性(旧版本迁移可能导致格式问题) - 验证$ dontFork $配置项是否与systemd服务配置冲突 - 确认SNMPTRAPD与SNMPD的协同配置
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值