
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 ExporterDocker 部署推荐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.ymlsnmp.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-switchesscrape_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:routerrelabel_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-firewallsscrape_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:firewallrelabel_configs:...(同上)可通过file_sd或 Consul 动态管理大规模设备列表。4. 核心监控指标与 PromQL4.1 通用接口指标指标含义ifOperStatus接口操作状态1up, 2downifHCInOctets/ifHCOutOctets64-bit 入/出字节数CounterifInErrors/ifOutErrors入/出错包ifInDiscards/ifOutDiscards入/出丢包PromQL 示例接口 downifOperStatus 2入站流量 Mbpsrate(ifHCInOctets{instance192.168.1.1}[1m]) * 8 / 1e6端口错包速率rate(ifInErrors{instance192.168.1.1, ifNameGigabitEthernet0/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_typetemperature} 60防火墙会话使用率fwActiveConnections / fwMaxConnections4.3 设备可达性指标含义up抓取是否成功1成功0失败直接告警up{jobnetwork-switches} 05. Grafana 仪表盘推荐SNMP Device OverviewDashboard ID14876展示接口列表、流量、错误、CPU、内存需对应指标。Cisco Routers/SwitchesID12139含详细 CPU、内存、环境指标。Juniper MX/EXID11332。通用网络流量大屏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:cpmCPUTotal5secRev85# Cisco 示例for:10mlabels:severity:warningannotations:summary:设备 {{ $labels.instance }} CPU 使用率超过 85%-alert:DeviceHighTemperatureexpr:entitySensorValue{sensor_typetemperature}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 通信使用 SNMPv3authPriv避免明文 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 实时告警。网络监控不再是孤立的“网管系统”而是全栈可观测性地块中不可或缺的一环实现从应用、服务器到网络层的端到端透明化。