Prometheus 监控 OpenWrt 全栈实战:把软路由变成高性能可观测边缘节点

Prometheus 监控 OpenWrt 全栈实战:把软路由变成高性能可观测边缘节点


监控 OpenWrt 不仅仅是看网络通不通,而是深入掌控这台 Linux 边缘设备的 CPU、内存、连接跟踪表、Wi-Fi 客户端、接口流量等核心指标。方案依然遵循 在设备上部署 Exporter → Prometheus 集中抓取 → Grafana 可视化/告警 的经典模式,但针对资源受限的嵌入式环境,轻量化与高价值信息的平衡至关重要。下面我会以 node_exporter 为主线,辅以无线指标的自定义采集,构建一套专为 OpenWrt 优化的可观测体系。


1. 为什么一定要监控 OpenWrt?

  • 作为主路由/旁路由,CPU 飙升、连接数打满会直接影响全家/全公司网络
  • 多 WAN 口、策略路由下的流量分布需要实时可见
  • WiFi 客户端数量、信号强度是排查无线问题的第一手数据
  • 存储卡(overlay)写满会导致配置丢失或插件异常
  • 温度过高可能引发降频或死机

2. 选择哪个 Exporter?

OpenWrt 上主推两种形态:

方案适合人群资源占用指标丰富度
prometheus-node-exporter-lua (Lua 版)空间紧张(<16MB Flash)、低性能设备极低基础 CPU/内存/网络/磁盘,无复杂指标
node_exporter (Go 二进制)有一定空间(>32MB 可用磁盘)、追求完整指标稍高(~10MB 内存)完整的 Linux 指标,支持 textfile collector
snmp_exporter + snmpd习惯 SNMP 的用户中等依赖 MIB,无线指标需扩展

最佳实践:用 node_exporter(官方 Go 版),因为它的 --collector.textfile.directory 可以轻松加入自定义无线脚本指标,而且预编译的 ARM/MIPS 二进制直接可用。如果设备实在老旧(如 4/32 配置),再用 Lua 版兜底。


3. 在 OpenWrt 上部署 node_exporter

3.1 确定架构并下载官方二进制

登录路由器,查看架构:

uname -m
# 常见:mips, mipsel, armv7l, aarch64

Prometheus 下载页 获取对应 node_exporter 二进制(例如 node_exporter-1.7.0.linux-armv7.tar.gz)。如果没有直接对应架构,需交叉编译,但多数主流架构都有预编译包。

将二进制上传到 /usr/bin/,并赋予执行权限:

# 示例:上传 node_exporter 到 /usr/bin/node_exporter
chmod +x /usr/bin/node_exporter
3.2 配置自启动(OpenWrt procd)

创建 /etc/init.d/node_exporter

#!/bin/sh /etc/rc.common

START=99
USE_PROCD=1
PROG=/usr/bin/node_exporter
CONFIG_DIR=/var/lib/node_exporter/textfile_collector

start_service() {
    mkdir -p $CONFIG_DIR
    procd_open_instance
    procd_set_param command $PROG \
        --web.listen-address="0.0.0.0:9100" \
        --collector.textfile.directory=$CONFIG_DIR \
        --collector.nf_conntrack \    # 启用连接跟踪表采集(需内核模块)
        --collector.wifi \            # 如果有的话,但 node_exporter 没有内置 wifi 采集,这里需要自己写脚本
        --collector.disable-defaults  # 可选,按需精简采集项
    procd_close_instance
}

node_exporter--collector.wifi 参数并不存在,Wi-Fi 指标需要通过 textfile collector 注入,这里先保留示例,后面会补上。

启用并启动:

/etc/init.d/node_exporter enable
/etc/init.d/node_exporter start

确认监听:

netstat -tlnp | grep 9100
curl localhost:9100/metrics | head
3.3 防火墙放行(如果 Prometheus 不在本机)

/etc/config/firewall 中添加规则,或直接通过 LuCI 界面放行 9100 端口(仅限内网)。


4. Prometheus 抓取配置

scrape_configs:
  - job_name: 'openwrt'
    scrape_interval: 30s      # 边缘设备间隔可稍长
    static_configs:
      - targets:
        - '192.168.1.1:9100'
        labels:
          device: 'router-main'
          location: 'home'

如果有多台 OpenWrt(比如分布式 AP),使用文件服务发现管理更灵活。


5. 核心监控指标与 PromQL

5.1 通用系统指标(CPU、内存、磁盘)
指标含义PromQL 示例
node_cpu_seconds_totalCPU 各模式时间100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
node_memory_MemAvailable_bytes可用内存(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
node_filesystem_avail_bytes{mountpoint="/overlay"}overlay 剩余空间(1 - node_filesystem_avail_bytes{mountpoint="/overlay"} / node_filesystem_size_bytes{mountpoint="/overlay"}) * 100
node_load11分钟负载直接可视化
5.2 网络流量(物理接口)

node_network_receive_bytes_total{device="eth0"}node_network_transmit_bytes_total{device="eth0"} 对应每个网卡的累计流量。

  • 接口带宽利用率(需要知道接口速率,如 1000Mbps):
    rate(node_network_receive_bytes_total{device="eth0"}[1m]) * 8 / (1000*1000*1000)
    
5.3 连接跟踪表(nf_conntrack)

如果启用了 --collector.nf_conntrack,会得到 node_nf_conntrack_entriesnode_nf_conntrack_entries_limit

  • 连接使用率node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 0.8 触发告警。
5.4 其他高价值指标
  • node_netstat_Tcp_CurrEstab:当前已建立的 TCP 连接数
  • node_procs_running:正在运行的进程数
  • node_time_seconds 配合 node_boot_time_seconds 计算运行时间

6. 自定义无线指标:用 textfile collector 采集 WiFi 客户端与信号

OpenWrt 的无线信息通常通过 iwinfoiw 获取。写一个 Cron 脚本,每分钟将指标写入 /var/lib/node_exporter/textfile_collector/wifi.prom

示例脚本 /usr/bin/wifi_metrics.sh

#!/bin/sh
OUTPUT=/var/lib/node_exporter/textfile_collector/wifi.prom
# 获取接口列表(根据实际无线接口名,如 wlan0, wlan1)
WIFI_INTERFACES="wlan0 wlan1"
> $OUTPUT.tmp
for iface in $WIFI_INTERFACES; do
    # 客户端数量
    clients=$(iwinfo $iface assoclist 2>/dev/null | grep -c "dBm")
    echo "wifi_clients{iface=\"$iface\"} $clients" >> $OUTPUT.tmp
    # 信号强度分布
    iwinfo $iface assoclist 2>/dev/null | while read line; do
        mac=$(echo "$line" | awk '{print $1}')
        signal=$(echo "$line" | grep -oP '[-]\d+ dBm' | grep -oP '[-]\d+')
        if [ -n "$signal" ]; then
            echo "wifi_signal_dbm{iface=\"$iface\",mac=\"$mac\"} $signal" >> $OUTPUT.tmp
        fi
    done
done
mv $OUTPUT.tmp $OUTPUT

赋予执行权限,并添加 Crontab(crontab -e):

* * * * * /usr/bin/wifi_metrics.sh

重启 node_exporter 后,就会多出 wifi_clientswifi_signal_dbm 指标,可用来绘制客户端数量趋势、信号质量热力图。

部分 OpenWrt 可能没有 iwinfo,可使用 iw dev wlan0 station dump 替代,解析方式类似。


7. Grafana 仪表盘推荐

  • 1860(Node Exporter Full):通用 Linux 监控,CPU、内存、网络、磁盘一应俱全,直接适配 OpenWrt。
  • 11159(Node Exporter / OpenWRT):社区专为 OpenWrt 打造的仪表盘,包含了接口流量、连接跟踪、WiFi 客户端等面板(如果使用了上述 textfile 指标,可在此基础上添加 WiFi 面板)。
  • 自建 WiFi 仪表板:使用 Stat Panel 显示客户端数,Bar Gauge 显示各客户端信号强度。

8. 告警规则(直接用于 OpenWrt)

groups:
  - name: openwrt_alerts
    rules:
      - alert: OpenWRTRouterDown
        expr: up{job="openwrt"} == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "OpenWrt 设备 {{ $labels.instance }} 下线"

      - alert: OpenWrtHighCPU
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU 使用率持续高于 85%"

      - alert: OpenWrtHighMemory
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "可用内存低于 10%"

      - alert: OpenWrtOverlayDiskFull
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/overlay"} / node_filesystem_size_bytes{mountpoint="/overlay"}) * 100 > 80
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Overlay 分区使用率超过 80%,可能造成配置丢失"

      - alert: OpenWrtConntrackTableFull
        expr: (node_nf_conntrack_entries / node_nf_conntrack_entries_limit) > 0.9
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "连接跟踪表即将耗尽,NAT 性能会急剧下降"

      - alert: OpenWrtHighNetworkBandwidth
        expr: rate(node_network_receive_bytes_total{device="eth0"}[1m]) * 8 / 1000000000 > 0.9
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "eth0 下行带宽利用率超过 90%"

9. 进阶:更省资源的替代方案

  • prometheus-node-exporter-lua:占用内存不到 2MB,能提供基础指标,但不支持 nf_conntrack 和 textfile。适合作为辅助或临时过渡。
  • snmp_exporter:利用 OpenWrt 自带的 snmpd,只需在 Prometheus 侧部署 snmp_exporter,通过 SNMP 拉取,路由器端零额外进程。适合管理大量 AP 的场景。
  • collectd + collectd_exporter:OpenWrt 的 luci-app-statistics 背后就是 collectd,可启用并转发到 Prometheus,但配置稍显复杂。

10. 安全加固

  • 将 node_exporter 监听地址改为 127.0.0.1:9100,通过 Nginx/Caddy 反向代理暴露,并添加 basic_auth。
  • 在防火墙中仅允许 Prometheus 服务器的 IP 访问 9100 端口。
  • 如果必须在公网暴露,务必启用 TLS(可配合 Caddy 自动管理)。

至此,你的 OpenWrt 就不再是一个黑盒网络设备,而是一个完全透明的可观测节点。CPU 负载、连接表溢出、WiFi 弱信号都能在第一时间发现并联动告警,真正做到“软路由”的精细化运维。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值