如何在自有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
如果仍显示纯数字OID,可以强制加载所有MIB重试:MY-MIB::myDeviceTemp.0 = INTEGER: 25 MY-MIB::myDeviceName.0 = STRING: "Raspberry Pi 4"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




