使用NetStudio做SNMP实验

实验前准备

编译SNMP相关固件到NetStudio中

在make menuconfig中选择Network –> mini_snmpd,进行编译
其他包,如snmptrapd等,在make menuconfig中输入‘/’,进行搜索,查看具体路径并勾选

安装SNMP相关工具

Linux中安装

确保客户端安装了 snmp 工具集(如 Linux 上的 net-snmp 包):

1
2
sudo apt install snmp  # Debian/Ubuntu
sudo yum install net-snmp-utils # CentOS

Windows中安装

使用Net-SNMP官方预编译好的安装包进行安装。传送门

开始实验

基本实验

查看系统描述信息(sysDescr)

1
snmpget -v2c -c public 192.168.1.1 SNMPv2-MIB::sysDescr.0
  • -v2c:使用 SNMP v2c 协议
  • -c public:社区字符串,默认为 public
  • 192.168.1.1:OpenWrt 设备的 IP 地址
  • sysDescr.0:获取系统描述

使用 snmpwalk 获取一整类信息(例如系统信息)

1
snmpwalk -v2c -c public 192.168.1.1 system
  • 会返回设备名称、联系人、运行时间、位置等信息。

获取接口状态(ifTable)

1
snmpwalk -v2c -c public 192.168.1.1 ifTable

可以查看:

  • 接口索引(ifIndex)
  • 接口名称(ifDescr)
  • 接口状态(ifOperStatus)
  • 接口流量(ifInOctets、ifOutOctets)

路由器性能监控

获取系统运行时间

1
snmpget -v2c -c public 192.168.10.1 .1.3.6.1.2.1.1.3.0

获取内存使用情况

1
snmpwalk -v2c -c public 192.168.10.1 .1.3.6.1.4.1.2021.4

会返回:

  • memTotalReal:总内存
  • memAvailReal:可用内存
  • memBuffermemCached

获取接口流量
列出所有接口:

1
snmpwalk -v2c -c public 192.168.10.1 .1.3.6.1.2.1.2.2.1.2

显示如:

1
IF-MIB::ifDescr.1 = STRING: bridge-lan

查询接口流量(以 bridge-lan 为例,如果是第1个接口):

1
2
snmpget -v2c -c public 192.168.10.1 .1.3.6.1.2.1.2.2.1.10.1  # 接收字节
snmpget -v2c -c public 192.168.10.1 .1.3.6.1.2.1.2.2.1.16.1 # 发送字节

SNMP Trap实验

SNMP Trap 是由设备(如 OpenWrt 路由器)主动发送给管理端(如你的电脑)的 通知消息,通常用于:

  • 接口断开或连接
  • 高温、过载等告警
  • 自定义脚本事件(比如用户连接WiFi时触发)

实验步骤:

修改snmpd配置

编辑 /etc/snmp/snmpd.conf,添加以下内容:

1
trap2sink 192.168.10.5 public

说明:

  • 192.168.10.100 是你运行 snmptrapd 的电脑的 IP 地址
  • public 是社区字符串
    保存并重启服务
    1
    /etc/init.d/snmpd restart

在PC上运行Trap接收器

首先创建配置文件snmptrapd.conf
在任意路径下创建文件,写入如下内容:

1
authCommunity log,execute,net public

说明:允许社区字符串为 public 的 Trap 被接受、记录和执行动作。

启动监听

1
snmptrapd.exe -f -Lo -c "C:\Users\hasong\Desktop\snmp\snmptrapd.conf"
  • -f:前台运行
  • -Lo:日志输出到控制台
  • -c:指定配置文件路径(视安装而定)
    此时 Windows 正在监听默认 Trap 端口 UDP 162

从NetStudio发送Trap

1
snmptrap -m "" -v 2c -c public 192.168.10.5 '' .1.3.6.1.6.3.1.1.5.1

会在windows上看到输出:

1
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (216751) 0:36:07.51      SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-MIB::coldStart

表示设备冷启动。

也可以用更多的Trap命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
snmptrap -m "" -v 2c -c public 192.168.10.114 '' .1.3.6.1.6.3.1.1.5.2 # 设备热重启

snmptrap -m "" -v 2c -c public 192.168.10.114 '' .1.3.6.1.6.3.1.1.5.3 \
.1.3.6.1.2.1.2.2.1.1 i 3 # 接口断开

snmptrap -m "" -v 2c -c public 192.168.10.114 '' .1.3.6.1.6.3.1.1.5.4 \
.1.3.6.1.2.1.2.2.1.1 i 3 # 接口恢复连接

snmptrap -m "" -v 2c -c public 192.168.10.114 '' .1.3.6.1.6.3.1.1.5.5 # SNMP被非法访问

snmptrap -m "" -v 2c -c public 192.168.10.114 '' .1.3.6.1.4.1.9999.1.1 \
.1.3.6.1.4.1.9999.1.1.1 s "NetStudio CPU too high" # 自定义Trap发送消息

snmptrap -m "" -v 2c -c public 192.168.10.5 '' .1.3.6.1.4.1.9999.2.1 \
.1.3.6.1.4.1.9999.2.1.1 s "High temp alert" \
.1.3.6.1.4.1.9999.2.1.2 i 78 # 自定义Trap & 多变量(第一个变量是消息,第二个是温度值78℃)

编写自定义脚本,达到特定条件时触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh

# === 配置部分 ===
TRAP_TARGET="192.168.10.114" # SNMP Trap 接收器 IP
COMMUNITY="public"
ENTERPRISE_OID=".1.3.6.1.4.1.9999"

# === 1. 检查可用内存(单位:kB)===
MEM_FREE=$(grep MemFree /proc/meminfo | awk '{print $2}')
if [ "$MEM_FREE" -lt 20480 ]; then
snmptrap -m "" -v 2c -c "$COMMUNITY" $TRAP_TARGET '' "$ENTERPRISE_OID.1.1" \
"$ENTERPRISE_OID.1.1.1" s "Low Memory Alert" \
"$ENTERPRISE_OID.1.1.2" i "$MEM_FREE"
fi

# === 2. 检查接口状态(br-lan)===
IF_STATUS=$(cat /sys/class/net/br-lan/operstate 2>/dev/null)
if [ "$IF_STATUS" != "up" ]; then
snmptrap -m "" -v 2c -c "$COMMUNITY" $TRAP_TARGET '' "$ENTERPRISE_OID.2.1" \
"$ENTERPRISE_OID.2.1.1" s "Interface br-lan is down"
fi

示例脚本,当 内存可用小于 20MB接口 br-lan down 时,发送 SNMP Trap 到服务器。
你可以扩展这个脚本来做:

  • 检查系统负载(uptime 的 1 分钟平均值)
  • 检测 Ping 网关失败时报警
  • 检测登录用户数量、连接设备等

使用NetStudio做SNMP实验
https://blog.hasong.top/2025/05/07/使用NetStudio做SNMP实验/
Author
hasong
Posted on
May 7, 2025
Licensed under