我想创建自己的 MIB。我为此苦苦挣扎了几个星期。我遵循了这一点教程并使用网络管理控制台 5.7.3。我正在做的是:
我的设置:我有两台虚拟机
Ubuntu 16
,一台是snmp 服务器IP 地址为:192.168.5.20,其他snmp-代理IP 地址为:192.168.5.21。我编写了一个 MIB,编译成功,没有任何错误(此编译仅在代理系统上完成,而不是在服务器上完成)我已经这样做了:
root@snmp-agent:# MIBS=+MAJOR-MIB
root@snmp-agent:# MIBS=+DEPENDENT-MIB
root@snmp-agent:# export MIBS
root@snmp-agent:# MIBS=ALL
我的 MIB 文件位于此路径:/usr/share/snmp/mibs
这是默认搜索路径。我已经使用以下命令成功编译了它并生成了 .c 和 .h 文件:mib2c -c mib2c.int_watch.conf objectName
。然后像这样配置 snmp:
root@snmp-agent:# ./configure --with-mib-modules="objectName"
root@snmp-agent:# make
root@snmp-agent:# make install
一切正常。之后当我(在代理上)执行此操作时,snmptranslate
我得到的输出如下:
root@snmp-agent:snmptranslate -IR objectName.0
MAJOR-MIB::objectName.0
使用该命令snmptranslate -On objectName.0
我得到如下输出:
root@snmp-agent:# snmptranslate -On MAJOR-MIB::objectName.0
.1.3.6.1.4.1.4331.2.1.0
因此,我在代理系统上获得了预期的输出。现在我的问题是我不知道如何从我的服务器获取相同的值!
当我snmpget
从服务器运行时,出现此错误:
root@snmp-server:# snmpget -v2c -c public 192.168.5.21 MAJOR-MIB::objectName.0
MAJOR-MIB::objectName.0 = No Such Instance currently exists at this OID
指定OID时的输出:
root@snmp-server:# snmpget -v2c -c public 192.168.5.21 .1.3.6.1.4.1.4331.2.1
SNMPv2-SMI::enterprises.4331.2.1 = No Such Instance currently exists at this OID
当我执行这些操作时输出:
root@snmp-server:# snmpget -v2c -c public 192.168.5.21 sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux snmp-agent 4.10.0-33-generic #37~16.04.1-Ubuntu SMP Fri Aug 11 14:07:24 UTC 2017 x86_64
root@snmp-server:# snmpwalk -v2c -c public 192.168.5.21 .1.3.6.1.4.1.4331.2.1
SNMPv2-SMI::enterprises.4331.2.1 = No more variables left in this MIB View (It is past the end of the MIB tree)
我已经搜索过了,但仍然没有找到。我该怎么办?我应该如何snmpget
在我的服务器上使用我自己的 MIB?我指的是像我sysDescr.0
在服务器上所做的事情。
我想这样做:snmpget 192.168.5.21 myObjectName.0
并获取价值观。
编辑:我已经看到了这些答案,但是没有用。snmp 扩展不工作和snmp 没有这样的对象...
更新2:
当我snmpwalk
在服务器上执行时:
snmp-server:# snmpwalk -v 2c -c ncs -m DISMAN-PING-MIB 192.168.5.21 .1.3.6.1.2.1.80
DISMAN-PING-MIB::pingObjects.0 = INTEGER: 1
DISMAN-PING-MIB::pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = STRING: "/bin/echo"
DISMAN-PING-MIB::pingMinimumCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingCompliances.4.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingCompliances.5.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 5
DISMAN-PING-MIB::pingCompliances.6.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingCompliances.7.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingCompliances.20.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 4
DISMAN-PING-MIB::pingCompliances.21.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingIcmpEcho.1.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingIcmpEcho.2.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = ""
DISMAN-PING-MIB::pingIcmpEcho.3.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 1
DISMAN-PING-MIB::pingIcmpEcho.4.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = INTEGER: 0
DISMAN-PING-MIB::pingMIB.4.1.2.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48.1 = ""
当我使用 snmpget 执行以下语句时pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48
:
root@snmp-server:# snmpget 192.168.5.21 DISMAN-PING-MIB::pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48
DISMAN-PING-MIB::pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 = Wrong Type (should be INTEGER): STRING: "/bin/echo"
那么我错在哪里了?pingFullCompliance.15.46.49.46.51.46.54.46.49.46.50.46.49.46.56.48 是什么 ? 为什么 OID 这么长?
我哪里做错了?有人能给我指出正确的方向吗?任何建议都非常感谢。
答案1
我遇到了完全相同的问题,它不适用于 5.6.2。
我如何解决这个问题:
我已经升级到 5.7.3 ,然后它开始工作。您需要注意以下事项:
配置包(在构建时)以支持 agentx) 使用 --with-mib-modules=agentx 这是我的配置:
./configure --prefix=/usr --build=i386-linux --host=arm-linux --target=arm-linux --with-ar=arm-arago-linux-gnueabi-ar --with-cc=arm-arago-linux-gnueabi-gcc --with-ld=arm-arago-linux-gnueabi-ld --with-cflags="-O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp" --with-endianness=big --with-ldflags=-Bstatic --enable-mini-agent --with-mib-modules="mibII ip-mib if-mib tcp-mib udp-mib ucd_snmp target agent_mibs notification-log-mib snmpv3mibs notification agentx" --without-openssl --without-perl-modules --disable-embedded-perl --disable-shared --with-default-snmp-version="2" --with-sys-contact="root" --with-sys-location="unknown" --with-logfile="/var/log/snmpd.log" --with-persistent-directory="/var/net-snmp" --disable-manuals
将 agentx 添加到 snmpd.conf 这是我的 snmpd.config
master agentx rocommunity public rwcommunity private com2sec readonly default public com2sec readwrite default private
启动 snmpd 并进行调试,以提供更多详细信息:
snmpd -f -Lo: -Dagentx
然后启动agentx应用程序
以下教程也有帮助:
http://net-snmp.sourceforge.net/wiki/index.php/TUT:Writing_a_Subagent
答案2
MIB 中的名称查找工作正常,查询工作正常,但代理响应说不存在这样的对象。所以问题出在代理端。
正如@ransh 在另一个答案中所建议的那样,这可能是 agentx 配置错误的问题——主代理需要向您的子代理查询所请求的对象,而要做到这一点,它需要从子树 OID 到子代理的映射。
对于像这样的标量值sysDescr.0
,表只有一行和一列,并且键是虚拟的0
,但对于其他对象,您需要处理特定的列和行。列号是固定的,因为它是在 MIB 中定义的,但行没有编号,因为这些行不是持久的,而是使用唯一的主键。
例如,IPv4 路由表可以包含任意数量的条目,但没有两个条目可以具有相同的目标地址和网络掩码,因此这被用作表查找的唯一索引(和主键),并且从这些索引生成行地址,例如
.0.0.0.0.0.0.0.0 the default route (destination 0.0.0.0/0)
.192.168.0.0.255.255.255.0 the internal network (destination 192.168.0.0/24)
这里使用DISMAN-PING-MIB
字符串作为索引,该字符串被编码为长度和值——长度优先,这样较短的字符串就不会意外地成为较长字符串的前缀。您可能会注意到第一个元素是 15,后面还有 15 个元素。
要将表视为表,请使用命令snmptable
。