文章目录
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_total | CPU 各模式时间 | 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_load1 | 1分钟负载 | 直接可视化 |
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_entries 和 node_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 的无线信息通常通过 iwinfo 或 iw 获取。写一个 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_clients、wifi_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 弱信号都能在第一时间发现并联动告警,真正做到“软路由”的精细化运维。


1059

被折叠的 条评论
为什么被折叠?



