首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Prometheus 监控网络设备最佳实践!

Prometheus 监控网络设备最佳实践!

作者头像
民工哥
发布2026-03-24 14:59:21
发布2026-03-24 14:59:21
1060
举报

特色专栏

MySQL/PostgreSQL/MongoDB

ElasticSearch/Hadoop/Redis

Kubernetes/Docker/DevOps

Kafka/RabbitMQ/Zookeeper

监控平台/应用与服务/集群管理

Nginx/Git/Tools/OpenStack

大家好,我是民工哥!

今天,我们来聊一聊如何使用 Prometheus 监控网络等硬件设备(snmp-exporter)。

前言

SNMP监控原理是通过SNMP协议查询网络设备上的MIB(管理信息库),设备运行SNMP代理,Prometheus通过SNMP Exporter轮询这些设备,SNMP Exporter会翻译SNMP协议的数据为Prometheus的时间序列格式,供Prometheus采集和存储。

下列就以群晖 NAS、QNAS、华为防火墙设备为例子,开启 SNMP 服务并部署 Exporter 进行监控,其中包括 MIB文档解读、Exporter 镜像制作 + 部署、数据抓取测试等。

群晖 NAS

开启 SNMP 服务

浏览器登录 群晖管理后台,点击 “控制面板” → “终端机和 SNMP” → “SNMP” → 勾选“启用 SNMP 服务” + 勾选 “SNMPv1、SNMPv2c 服务” )+ 填写 “社群” 信息(可理解为密码)→ 点击“应用”生效

测试

在另一台设备(Linux)可访问该群晖 NAS (UDP:161端口),使用 snmpwalk 命令测试,若没有这通过命令安装:

Centos/Redhat:

代码语言:javascript
复制
sudo yum update
sudo yum install net-snmp-utils

Ubuntu/Debian:

代码语言:javascript
复制
sudo apt update
sudo apt install snmp

测试命令:

代码语言:javascript
复制
snmpwalk -v 2c -c 社群密码 群晖IP

若返回一大串iso.开头的信息,则表示正常,否则请检查网络、社群密码、群晖IP。

MIB 文档

群晖管理后台SNMP 配置页面,点击最下方访问 Synology 网站 访问Synology MIB 文档 或 Google 搜索 群晖 SNMP MIB 文档

文档访问链接如下:群晖 SNMP MIB Guide 文档https://global.download.synology.com/download/Document/Software/DeveloperGuide/Firmware/DSM/All/enu/Synology_DiskStation_MIB_Guide.pdf

查阅文档,找到自己所监控信息的每一项值所对应的 OID 和 返回值。

比如说,我要监控这台 NAS 的硬盘,在文档的p8-9页 OID: .1.3.6.1.4.1.6574.2 中有说明:.13为硬盘健康状态,.1为硬盘索引号,.9为硬盘坏道数

代码语言:javascript
复制
snmpwalk -v 2c -c 社群密码 群晖IP 1.3.6.1.4.1.6574.2.13

返回报错

代码语言:javascript
复制
iso.3.6.1.4.1.6574.2.13 = No Such Object available on this agent at this OID

通过查阅 .1.3.6.1.4.1.6574.2 的返回值,才知道其实它是 .1.3.6.1.4.1.6574.2.1.1.13,命令:

代码语言:javascript
复制
snmpwalk -v 2c -c 社群密码 群晖IP 1.3.6.1.4.1.6574.2
编写 snmp.yml

知道自己抓取的 OID 后,就可编写 snmp.yml 了(snmp-exporter 用于过滤 snmp 信息),内容如下:

代码语言:javascript
复制
syno_mib:
  version:2
walk:
    -1.3.6.1.4.1.6574.2.1.1
metrics:
    -name:disk_health
      oid:1.3.6.1.4.1.6574.2.1.1.13
      type:gauge
      help:"Disk health status"
      indexes:
        -labelname:ifIndex
          type:gauge
      lookups:
        -labels:
            -ifIndex
          labelname:disk_name
          oid:1.3.6.1.4.1.6574.2.1.1.1
          type:DisplayString
    -name:disk_smart
      oid:1.3.6.1.4.1.6574.2.1.1.9
      type:gauge
      help:"Disk smart status"
      indexes:
        -labelname:ifIndex
          type:gauge
      lookups:
        -labels:
            -ifIndex
          labelname:disk_name
          oid:1.3.6.1.4.1.6574.2.1.1.1
          type:DisplayString
auth:
    community:社群

命令解释:

代码语言:javascript
复制
syno_mib: 定义了一个 SNMP 采集的配置项,名字为 syno_mib。 

version: 2 指定了 SNMP 的版本为 2,表示这个配置使用 SNMP v2 协议。   
walk: walk 是用来遍历指定的 OID 子树并抓取所有相关的 SNMP 数据。(这个get用不上)1.3.6.1.4.1.6574.2.1.1 这是需要遍历的 OID,代表这个 OID 及其子节点的数据将会被抓取。1.3.6.1.4.1.6574.2.1.1 通常与磁盘信息相关。

metrics: 定义了要采集的 SNMP 指标。

- name: disk_health 定义了一个名为 disk_health 的指标,用来表示磁盘的健康状态。

oid: 1.3.6.1.4.1.6574.2.1.1.13 指定了获取 disk_health 指标的 OID,1.3.6.1.4.1.6574.2.1.1.13 是这个健康状态的具体 OID。
   
type: gauge 指定了指标类型为 gauge,表示这个值是一个可以上下浮动的数值类型。
   
help: “Disk health status” 这是一段帮助信息,说明了这个指标的用途,表示它用于显示磁盘的健康状态。
   
indexes: 指定了该指标需要哪些索引值来标识。(这里开始往下的目的都是按 **1.3.6.1.4.1.6574.2.1.1.1** 即**硬盘索引号**划分返回的状态值)

- labelname: ifIndex 定义了一个标签名 ifIndex,通常是 SNMP 的接口索引,用于区分不同的磁盘。 type: gauge 说明这个索引值是一个 gauge 类型的值。

1lookups: 定义了一个映射关系,用于将索引值转换为可读的名称。

- labels: 定义了映射时需要使用的标签。
- ifIndex 指定使用 ifIndex 标签。

labelname: disk_name 定义了一个新的标签 disk_name,用于标识磁盘的名称。
    
oid: 1.3.6.1.4.1.6574.2.1.1.1 指定了用于获取磁盘名称的 OID,1.3.6.1.4.1.6574.2.1.1.1 用于查找磁盘的显示名称。
    
type: DisplayString 指定了该 OID 返回的值是一个 DisplayString 类型,即可显示的文本字符串。

5、运行snmp-exporter

dockerhub 上 Prometheus 官方做了个 snmp-exporter 镜像,就叫 prom/snmp-exporter,直接 docker pull 拉下来运行即可。

代码语言:javascript
复制
# 拉取
docker pull prom/snmp-exporter:v0.26.0
# 在台能访问群晖 NAS 的设备上运行
docker run -d \
  -v /path/to/snmp.yml:/etc/snmp_exporter/snmp.yml \
  -p 9116:9116 \
  prom/snmp-exporter:v0.26.0

PS:最好使用固定版本,否则每次拉取都是最新版本的

IP + 端口号 在浏览器访问,Target 栏 输入群晖 NAS 的 IPModule 栏 输入自定义的采集项名,如,上面用的是 syno_mib,若能返回数据,则成功,否则检查IP地址、网络、采集项名等。

PS:snmp-exporter抓取数据通俗点来说,就是在snmp-exporter自身配好过滤规则,通过输入对方ip再去获取对方snmp的数据。

加入Prometheus监控

修改普罗米修斯的 /etc/prometheus/prometheus.rules 文件,追加如下内容并重启服务。

代码语言:javascript
复制
  - job_name:'snmp-syno-nas'
    scrape_interval:5m
    scrape_timeout:3m
    static_configs:
      -targets:
        -群晖NASIP1
        -群晖NASIP2
        -群晖NASIP3
        -群晖NASIP......
    metrics_path:/snmp
    params:
      module:[syno_mib]
    relabel_configs:
      -source_labels:[__address__]
        target_label:__param_target
      -source_labels:[__param_target]
        target_label:instance
      -target_label:__address__
        replacement:'IP:9116'

PS:最后 replacement 部分,若是k8s容器部署 snmp-exporter ,和普罗米修斯在同一命名空间,可改成 “容器名: ‘IP:9116’”

在浏览器访问 Prometheus ,点击 “Status” → “Targets” 中若能发现 “snmp-syno-nas” 栏,且设备数量对得上,State 为 UP,则代表已接入普罗米修斯监控了。

QNAP NAS

开启 SNMP 服务

浏览器登录 QNAP 管理后台,点击“控制台” → “SNMP” → 勾选 “启用 SNMP 服务器” + 选择“SNMP 版本”(这里勾选的是“SNMP V1/V2”)+ 填写“社区”(可理解为密码)→ 点击“应用”生效

SNMP MIB 文件下载

同样在 SNMP 页面,点击 SNMP MIB 的 “下载” 并进行查阅。这里和群晖不同,它只提供了 NAS.mib 的文件下载(QNAP 官方文档也没找到)。

打开 NAS.mib 文件,片段如下:

代码语言:javascript
复制
systemCPU-UsageEX OBJECT-TYPE
    SYNTAX Integer32
    MAX-ACCESS read-only
    STATUS     current
    DESCRIPTION
        "system CPU usage"
    ::= { systemInfoEx 1 }

命令解释:

代码语言:javascript
复制
systemCPU-UsageEX OBJECT-TYPE:定义了一个 SNMP 对象,名称为 systemCPU-UsageEX,表示系统 CPU 使用率的对象类型。

SYNTAX Integer32:这个属性定义了对象的类型,这里定义的 SYNTAX 是 Integer32,表示这个对象的值是 32 位整数。

MAX-ACCESS read-only:MAX-ACCESS 表示该对象的访问权限。read-only 说明这个对象只能被读取,不能修改。

STATUS current:STATUS 属性说明对象的状态。current 表示这是一个当前的有效对象。

DESCRIPTION “system CPU usage”:DESCRIPTION 是对该对象的简要描述,解释了这个对象表示的是系统 CPU 使用率。

::= { systemInfoEx 1 }:这是对象的 OID(对象标识符)。systemInfoEx 是一个父级节点,1 表示这是该父级节点下的第一个子对象。它标识了这个对象在整个 MIB 结构中的位置。

PS:总的来说,主要看两个地方就够了

  • systemCPU-UsageEX 就是对应 snmp.yml 文件里 metrics 的 name (后续生成 snmp.yml 要用的)
  • DESCRIPTION 就是说明这个东西是干嘛用的
generate的使用

主要用generate来对*.mib生成snmp.yml文件

generator使用说明(github):https://github.com/prometheus/snmp_exporter/tree/main/generator) generator下载地址(github):https://github.com/prometheus/snmp_exporter)

下好后,按官方使用说明,把 NAS.mib 文件放到snmp_exporter/generator/mibs/ 下并编辑 snmp_exporter/generator/generator.yml 文件。

代码语言:javascript
复制
modules:
    qnap:
        walk:
            - raidCount
            - raidStatus

PS:

  • qnap 是自定义的采集项名
  • walk 下的是要采集的信息(查看 NAS.mib 内容提取)

执行编译操作:

代码语言:javascript
复制
make docker-generate

PS:会联网下载github、构建docker镜像,生成 snmp.yml 文件

文件生成在:snmp_exporter/generator/snmp.yml 内容如下:

代码语言:javascript
复制
# WARNING: This file was auto-generated using snmp_exporter generator, manual changes will be lost.
modules:
qnap:
    walk:
    -1.3.6.1.4.1.55062.1.10.5.1.4
    get:
    -1.3.6.1.4.1.55062.1.10.4.0
    metrics:
    -name:raidCount
      oid:1.3.6.1.4.1.55062.1.10.4
      type:gauge
      help:ThenumberofRAID.-1.3.6.1.4.1.55062.1.10.4
    -name:raidStatus
      oid:1.3.6.1.4.1.55062.1.10.5.1.4
      type:OctetString
      help:ThestatusofRAID-1.3.6.1.4.1.55062.1.10.5.1.4
      indexes:
      -labelname:raidIndex
        type:gauge
运行snmp-exporter

在生成的snmp.yml文件追加version、community等信息即可使用。

PS:snmp.yml的具体格式和说明请参考群晖 NAS编写snmp.yaml章节

使用 docker 部署 snmp-exporter:

代码语言:javascript
复制
# 拉取
docker pull prom/snmp-exporter:v0.26.0
# 在台能访问QNAP NAS 的设备上运行
docker run -d \
  -v /path/to/snmp.yml:/etc/snmp_exporter/snmp.yml \
  -p 9116:9116 \
  prom/snmp-exporter:v0.26.0

IP + 端口号 在浏览器访问,Target 栏输入群晖NAS 的 IPModule 栏输入自定义的采集项名,如,上面用的是 qnap,若能返回数据,则成功,否则检查IP地址、网络、采集项名等。

PS:若有疑问请查阅群晖 NAS运行snmp-exporter章节

加入Prometheus监控

修改普罗米修斯的 /etc/prometheus/prometheus.rules 文件,追加如下内容并重启服务。

代码语言:javascript
复制
  - job_name:'snmp-qnap-nas'
    scrape_interval:5m
    scrape_timeout:3m
    static_configs:
      -targets:
        -QNAPNASIP1
        -QNAPNASIP2
        -QNAPNASIP....
    metrics_path:/snmp
    params:
      module:[qnap]
    relabel_configs:
      -source_labels:[__address__]
        target_label:__param_target
      -source_labels:[__param_target]
        target_label:instance
      -target_label:__address__
        replacement:'IP:9116'

在浏览器访问 Prometheus ,点击 “Status” → “Targets” 中若能发现 “snmp-syno-nas” 栏,且设备数量对得上,State 为 UP,则代表已接入普罗米修斯监控了。

华为防火墙

开启 SNMP 服务

~浏览器登录 华为防火墙 管理后台,点击 “系统” → “配置” → “SNMP” → 勾选“SNMP” + 勾选 “v2c” + 填写 “SNMP 只读团体名” 、“认证密码”、“加密密码” → 点击“应用”生效~

这里不知道是我防火墙太旧还是什么bug,Web 页面配置就是不生效(你也可以先尝试上面方法开启),只能到进 控制台 去开启 snmp 服务:笔记本接防火墙Console 端口(RJ45 转 USB 或 DB9 转 USB 的线,9600 波特率)SSH 远程连接Web 登录打开 CLI 控制台 ,任意采用一种方式即可。

进控制台后命令如下:

代码语言:javascript
复制
system-view
undo snmp-agent
snmp-agent
#重启snmp服务
display snmp-agent community
#查看之前的社群配置(加密了,所以显示乱码)
undo snmp-agent community <community-string>
#删除社群
snmp-agent community read <社群密码>
测试
网络测试

开通ACL(没有则不做)、开通 SNMP 服务后。 在另一台设备(Linux)访问测试该端口号:

代码语言:javascript
复制
nc -zv -u <firewall-ip> 161
# 返回如下信息就是正常,否则请检查网络连接
# Connection to <firewall-ip> 161 port [udp/snmp] succeeded!
# UDP 端口不能使用telnet测试
连接测试

该华为防火墙(UDP:161端口),使用 snmpwalk 命令测试,若没有这通过命令安装: Centos/Redhat:

代码语言:javascript
复制
sudo yum update
sudo yum install net-snmp-utils

Ubuntu/Debian:

代码语言:javascript
复制
sudo apt update
sudo apt install snmp

测试命令:

代码语言:javascript
复制
snmpwalk -v 2c -c 社群密码 华为防火墙IP

若返回一大串 iso. 开头的信息,则表示正常,否则请检查社群密码、华为防火墙 IP

查阅文档

到 华为官方网站上查找自己设备对应型号,点击左上角 “切换产品” → 输入自己设备的型号 → 点击 “MIB 查询” → 选择所对应 “版本” (在 防火墙管理后台可以看到) → 查阅文档

查看 “对象含义” 根据自己说需监控的信息提取 OID 。

部署 snmp-exporter + Prometheus监控。

具体操作请查阅上方群晖NAS编写 snmp.yml和运行snmp-exporter和加入Prometheus监控篇章。

链接:https://blog.csdn.net/weixin_41004518/artic le/details/141963162

👍 既然都看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 群晖 NAS
    • 开启 SNMP 服务
    • 测试
    • MIB 文档
    • 编写 snmp.yml
    • 5、运行snmp-exporter
      • 加入Prometheus监控
  • QNAP NAS
    • 开启 SNMP 服务
    • SNMP MIB 文件下载
    • generate的使用
    • 运行snmp-exporter
    • 加入Prometheus监控
  • 华为防火墙
    • 开启 SNMP 服务
    • 测试
    • 查阅文档
    • 部署 snmp-exporter + Prometheus监控。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档