Prometheus 监控网络设备全栈实战:SNMP Exporter 统一掌控交换机/路由器/防火墙
2026/8/21 9:47:13 网站建设 项目流程

Prometheus 监控网络设备全栈实战:SNMP Exporter 统一掌控交换机/路由器/防火墙


SNMP(简单网络管理协议)是网络设备监控的通用语言,从交换机、路由器到防火墙,几乎每一台网络设备都通过 SNMP 暴露运行状态。Prometheus 通过SNMP Exporter完美对接这一生态,将 SNMP OID 转化为标准 Prometheus 指标,让网络层的可观测性与服务器、应用无缝融合。本文将带你从生成snmp.yml配置、部署 Exporter,到解读核心指标、构建 Grafana 面板与告警规则,实现对交换机、路由器、防火墙的全类型网络设备统一监控。


1. 为什么选择 SNMP Exporter 统一监控网络设备?

  • 通用协议:无论品牌(Cisco、华为、Juniper、HPE、Fortinet 等),只要支持 SNMP v2c/v3,即可监控。
  • 配置生成器:通过generator模块解析 MIB 文件,自动生成snmp.yml,避免手写海量 OID。
  • 安全可控:支持 SNMPv3 认证加密,Prometheus 只读拉取。
  • 指标丰富:接口流量、错误包、CPU、内存、温度、风扇、电源、堆叠状态、VPN 隧道等。
  • 扩展性强:通过snmp.yml中的modules定义不同厂商的采集行为,可同时监控数百台设备。

2. 部署 SNMP Exporter 与 snmp.yml 生成

2.1 部署 SNMP Exporter

Docker 部署(推荐):

dockerrun-d\--namesnmp_exporter\-v/path/to/snmp.yml:/etc/snmp_exporter/snmp.yml\-p9116:9116\prom/snmp-exporter:v0.21.0

Exporter 本身不主动抓取,它等待 Prometheus 的 scrape 请求,通过 URL 参数targetmodule动态查询设备。

2.2 生成 snmp.yml

snmp.yml是 SNMP Exporter 的核心配置文件,需要依赖generator工具生成。过程如下:

gitclone https://github.com/prometheus/snmp_exporter.gitcdsnmp_exporter/generator

编辑generator.yml,定义一个通用的网络设备模块(例如if_mib用于接口统计,同时添加厂商私有 MIB)。

通用模板:

modules:# 基础接口模块(所有设备通用)if_mib:walk:-1.3.6.1.2.1.2# IF-MIB (接口信息)-1.3.6.1.2.1.31.1.1# IF-MIB 64-bit 计数器get:-1.3.6.1.2.1.1.3.0# sysUptimemetrics:# 接口状态-name:ifAdminStatusoid:1.3.6.1.2.1.2.2.1.7type:gauge-name:ifOperStatusoid:1.3.6.1.2.1.2.2.1.8type:gauge# 64-bit 流量计数器(高容量端口)-name:ifHCInOctetsoid:1.3.6.1.2.1.31.1.1.1.6type:counter-name:ifHCOutOctetsoid:1.3.6.1.2.1.31.1.1.1.10type:counter# 错误与丢弃-name:ifInErrorsoid:1.3.6.1.2.1.2.2.1.14type:counter-name:ifOutErrorsoid:1.3.6.1.2.1.2.2.1.20type:counter-name:ifInDiscardsoid:1.3.6.1.2.1.2.2.1.13type:counter-name:ifOutDiscardsoid:1.3.6.1.2.1.2.2.1.19type:counter

对于不同厂商的私有 MIB(如 Cisco CPU、Juniper 温度),可创建额外的模块并在generator.yml中定义,然后运行make generate生成最终的snmp.yml

生成后,将snmp.yml拷贝至 SNMP Exporter 的配置路径并重启容器。


3. 配置 Prometheus 抓取

Prometheus 需要为每类设备(或每个设备)指定 SNMP Exporter 的地址、模块以及 SNMP 认证参数。

scrape_configs:-job_name:'network-switches'scrape_interval:30smetrics_path:/snmpparams:module:[if_mib]# 使用接口模块auth:[public]# SNMP v2c 社区名static_configs:-targets:-192.168.1.1# 核心交换机-192.168.1.2labels:device_type:'switch'-targets:-192.168.10.1# 路由器labels:device_type:'router'relabel_configs:-source_labels:[__address__]target_label:__param_target-source_labels:[__param_target]target_label:instance-target_label:__address__replacement:127.0.0.1:9116# SNMP Exporter 地址# 若使用 SNMPv3-job_name:'network-firewalls'scrape_interval:30smetrics_path:/snmpparams:module:[if_mib]auth:[v3]username:[monitor]security_level:[authPriv]auth_protocol:[SHA]auth_password:[authpass]priv_protocol:[AES]priv_password:[privpass]static_configs:-targets:-10.0.0.1# 防火墙labels:device_type:'firewall'relabel_configs:...(同上)

可通过file_sd或 Consul 动态管理大规模设备列表。


4. 核心监控指标与 PromQL

4.1 通用接口指标
指标含义
ifOperStatus接口操作状态(1=up, 2=down)
ifHCInOctets/ifHCOutOctets64-bit 入/出字节数(Counter)
ifInErrors/ifOutErrors入/出错包
ifInDiscards/ifOutDiscards入/出丢包

PromQL 示例:

  • 接口 downifOperStatus == 2
  • 入站流量 Mbpsrate(ifHCInOctets{instance="192.168.1.1"}[1m]) * 8 / 1e6
  • 端口错包速率rate(ifInErrors{instance="192.168.1.1", ifName="GigabitEthernet0/1"}[5m])
4.2 设备资源指标(需厂商模块)
指标(示例)含义
cpmCPUTotal5secRev(Cisco)CPU 5秒平均利用率
ciscoMemoryPoolUsed/ciscoMemoryPoolFree内存使用/空闲
jmx_os_cpu_usage(Juniper)CPU 使用率
entitySensorValue(ENTITY-SENSOR-MIB)温度、风扇、电源状态
fwActiveConnections(FortiGate 私有 OID)并发连接数

这些指标需要在generator.yml中定义相应的模块,加入厂商 MIB 的 walk 和 get 配置。

PromQL 示例:

  • Cisco CPU > 80%cpmCPUTotal5secRev > 80
  • 温度过高entitySensorValue{sensor_type="temperature"} > 60
  • 防火墙会话使用率fwActiveConnections / fwMaxConnections
4.3 设备可达性
指标含义
up抓取是否成功(1=成功,0=失败)

直接告警:up{job="network-switches"} == 0


5. Grafana 仪表盘推荐

  • SNMP Device Overview:Dashboard ID14876,展示接口列表、流量、错误、CPU、内存(需对应指标)。
  • Cisco Routers/Switches:ID12139,含详细 CPU、内存、环境指标。
  • Juniper MX/EX:ID11332
  • 通用网络流量大屏:ID11128,基于ifHCInOctetsifHCOutOctets创建接口流量热力图。

导入后选择数据源,通过变量instancedevice_type切换设备。


6. 告警规则实战

groups:-name:network_device_alertsrules:-alert:NetworkDeviceDownexpr:up{job=~"network-.*"}== 0for:2mlabels:severity:criticalannotations:summary:"网络设备 {{ $labels.instance }} 不可达(SNMP 抓取失败)"-alert:InterfaceDownexpr:ifOperStatus == 2for:1mlabels:severity:criticalannotations:summary:"接口 {{ $labels.ifName }} on {{ $labels.instance }} 已 down"-alert:HighInterfaceErrorsexpr:rate(ifInErrors[5m])>0.5 or rate(ifOutErrors[5m])>0.5for:5mlabels:severity:warningannotations:summary:"接口 {{ $labels.ifName }} 错包率过高"-alert:HighBandwidthUtilizationexpr:(rate(ifHCInOctets[5m]) * 8) / (ifHighSpeed * 1000000)>0.85for:10mlabels:severity:warningannotations:summary:"接口 {{ $labels.ifName }} 入方向带宽利用率 > 85%"-alert:DeviceHighCPUexpr:cpmCPUTotal5secRev>85# Cisco 示例for:10mlabels:severity:warningannotations:summary:"设备 {{ $labels.instance }} CPU 使用率超过 85%"-alert:DeviceHighTemperatureexpr:entitySensorValue{sensor_type="temperature"}>60for:5mlabels:severity:criticalannotations:summary:"设备 {{ $labels.instance }} 温度超过 60℃"

根据实际采集的指标调整告警表达式。


7. 进阶:多厂商、动态发现与安全

7.1 多厂商环境

建议为每个厂商创建独立的module(如cisco,huawei,juniper),在 Prometheus 的params.module中按设备类型指定。generator.yml中可以包含多个模块,生成单一的snmp.yml

7.2 动态目标发现

利用 Prometheus 的file_sd或基于 DNS 的服务发现,实现设备列表的自动化管理。例如,从 CMDB 导出 JSON 文件定期更新。

7.3 安全加固
  • 全部 SNMP 通信使用 SNMPv3(authPriv),避免明文 community。
  • 管理 VLAN 隔离,仅允许 Prometheus 和 Exporter 之间的 SNMP 流量。
  • Exporter 监听端口 (9116) 仅对 Prometheus 服务器开放。
  • 定期轮换 SNMP 凭据。
7.4 性能调优
  • SNMP walk 可能产生较大查询,尤其接口数量多的设备。适当增加scrape_interval(如 60s)并启用--snmp.max-walk-retries等参数。
  • 通过metric_relabel_configs丢弃不需要的标签,减少时序基数。

8. 总结

借助 SNMP Exporter 和精心生成的snmp.yml,你可以在 Prometheus 中统一监控交换机、路由器、防火墙等所有 SNMP 设备。从接口流量、错误包到设备 CPU、温度,从 Cisco 到 Huawei,所有的网络层健康信号都转化为标准指标,在 Grafana 中集中展示,并通过 Alertmanager 实时告警。网络监控不再是孤立的“网管系统”,而是全栈可观测性地块中不可或缺的一环,实现从应用、服务器到网络层的端到端透明化。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询