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.0Exporter 本身不主动抓取,它等待 Prometheus 的 scrape 请求,通过 URL 参数target和module动态查询设备。
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/ifHCOutOctets | 64-bit 入/出字节数(Counter) |
ifInErrors/ifOutErrors | 入/出错包 |
ifInDiscards/ifOutDiscards | 入/出丢包 |
PromQL 示例:
- 接口 down:
ifOperStatus == 2 - 入站流量 Mbps:
rate(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,基于
ifHCInOctets和ifHCOutOctets创建接口流量热力图。
导入后选择数据源,通过变量instance或device_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 实时告警。网络监控不再是孤立的“网管系统”,而是全栈可观测性地块中不可或缺的一环,实现从应用、服务器到网络层的端到端透明化。