You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在自有PEN下构建OID树而非扩展Net-SNMP?

在自有PEN下构建SNMP OID树并让snmpwalk识别(Raspbian/Linux)

刚拿到自己的PEN,想要从Net-SNMP默认的8072分支转到专属自己的OID树下,对吧?我来一步步教你在Raspbian上搞定这件事:

1. 编写自定义MIB文件(核心步骤)

SNMP工具靠MIB文件把冰冷的数字OID翻译成可读的名称,所以首先得定义属于你自己的OID结构。创建一个名为MY-MIB.txt的文件,内容示例如下(把<MyPEN>替换成IANA分配给你的实际PEN数值,比如假设你的PEN是12345):

MY-MIB DEFINITIONS ::= BEGIN
IMPORTS
    enterprises FROM SNMPv2-SMI
    DisplayString, Integer32 FROM SNMPv2-TC;

-- 定义你的PEN节点
myPen OBJECT IDENTIFIER ::= { enterprises 12345 }
-- 定义你自己的OID根分支
myOIDTree OBJECT IDENTIFIER ::= { myPen 1 }
-- 扩展子分支,比如系统信息分类
mySystemInfo OBJECT IDENTIFIER ::= { myOIDTree 1 }

-- 定义具体的叶子节点(示例:设备温度)
myDeviceTemp OBJECT-TYPE
    SYNTAX Integer32
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION "Device temperature in Celsius degrees"
    ::= { mySystemInfo 1 }

-- 再添加一个示例叶子(设备名称)
myDeviceName OBJECT-TYPE
    SYNTAX DisplayString
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION "Name of the target device"
    ::= { mySystemInfo 2 }
END

这个MIB里,我们把.1.3.6.1.4.1.12345作为自己的PEN根节点,下面扩展了自定义分支和具体监控项。

2. 部署MIB并配置Net-SNMP加载它

  • 把编写好的MY-MIB.txt放到Net-SNMP的默认MIB目录:
    sudo cp MY-MIB.txt /usr/share/snmp/mibs/
    
  • 编辑Net-SNMP配置文件,让工具自动加载你的自定义MIB:
    打开/etc/snmp/snmp.conf(如果没有就创建用户目录下的~/.snmp/snmp.conf),添加一行:
    mibs +MY-MIB
    

3. 配置snmpd,把自定义OID映射到扩展逻辑

之前用extend是绑定在Net-SNMP的8072分支下的,现在要换成自己的OID,得用pass或者pass_persist指令(后者更适合多OID场景,性能更优):

方法一:用pass映射单个OID

比如把.1.3.6.1.4.1.12345.1.1.1(对应MIB里的myDeviceTemp)映射到温度采集脚本,在/etc/snmp/snmpd.conf里添加:

pass .1.3.6.1.4.1.12345.1.1.1 /usr/local/bin/get_temp.sh

示例脚本get_temp.sh内容(记得给脚本加执行权限:sudo chmod +x /usr/local/bin/get_temp.sh):

#!/bin/bash
case $1 in
    get)
        echo "Integer32"
        # 替换成你的实际采集逻辑,比如读取树莓派CPU温度
        cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}'
        ;;
    *)
        exit 0
        ;;
esac

方法二:用pass_persist处理多个OID

如果有多个自定义OID,用pass_persist更高效。写一个支持持续运行的脚本(比如/usr/local/bin/my_snmp_extend.sh),处理不同OID的get/getnext请求,然后在snmpd.conf里添加:

pass_persist .1.3.6.1.4.1.12345 /usr/local/bin/my_snmp_extend.sh

这类脚本的核心逻辑是根据输入的指令和OID,返回对应的数据类型和值,网上有很多现成的模板可以参考。

4. 重启服务并测试

  • 重启snmpd服务:
    sudo systemctl restart snmpd
    
  • 测试snmpwalk:
    snmpwalk -v2c -c public localhost .1.3.6.1.4.1.12345
    
    配置正确的话,你会看到带可读名称的输出,类似:
    MY-MIB::myDeviceTemp.0 = INTEGER: 25
    MY-MIB::myDeviceName.0 = STRING: "Raspberry Pi 4"
    
    如果仍显示纯数字OID,可以强制加载所有MIB重试:
    snmpwalk -v2c -c public -m ALL localhost .1.3.6.1.4.1.12345
    

注意事项

  • 必须使用IANA分配给你的真实PEN,不要随意使用他人的PEN数值
  • MIB文件的模块名(如MY-MIB)要和文件名一致,否则可能加载失败
  • 遇到问题可以查看snmpd日志排查:sudo journalctl -u snmpd

内容的提问来源于stack exchange,提问作者Ctrl S

火山引擎 最新活动