家里网突然变卡,打开 LuCI 只能看到一条总流量曲线,到底是哪台设备在下载、哪个摄像头在上传,还是看不出来。所以我们自己写了一个。
先说明:openwrt-pulse 是 Baffox 自己开发并开源的项目,MIT 协议,代码托管在 GitHub。本文介绍它是什么、能做什么、两种固件怎么安装,也会把目前的限制和安全注意事项讲清楚。
openwrt-pulse 是什么
openwrt-pulse 是一个 OpenWrt 路由器的实时流量面板。打开一个网页,就能看到流量从互联网经过路由器、交换机、无线 AP 流向每一台设备,每秒刷新一次,谁在用带宽、用了多少,一眼就能看出来。
它由两部分组成:
- 前端:纯静态网页,原生 JavaScript 加 SVG,不需要构建,体积约 60 到 90 KB。可以装在路由器上,也可以直接在电脑上双击打开。
- 采集器:路由器上的一个 CGI 脚本,只在浏览器请求时运行,不常驻内存。它读取系统里的接口计数、DHCP、无线客户端、WireGuard 和连接跟踪信息,返回累计字节数,由前端算出实时速率。
界面布局参考了 MikroTik 路由器的开源面板 routeros-lanpulse,但所有代码都是我们独立编写的,没有复制它的源码和资源,仓库里的 NOTICE 文件有说明。

为什么要做它
OpenWrt 自带的统计功能能用,但不好用:
- LuCI 自带的实时图表太简单:只能按接口看总流量,看不出是哪台设备在用。
- 按设备统计的插件大多是累计值:比如 nlbwmon,看的是今天、这个月每台设备总共用了多少,不是“现在这一秒”谁在跑满带宽。
- 好看的方案门槛高:Bandix 需要较新的内核,ntopng 这类专业工具对家用路由器来说太重。
- 老固件没人管:很多人手里的京东云、红米等高通机器跑的是 QWRT 这类基于 OpenWrt 19.07 的固件,还开着 NSS 硬件加速,常见的统计插件要么装不上,要么数据不准。
我们想要的很简单:一个页面,1 秒刷新,看清每台设备的实时速率,新设备上线、连接数暴涨、WireGuard 掉线都能马上看到。
主要功能
- 顶部指标卡:WAN 下行和上行速率(带峰值和 90 秒曲线)、在线设备数、WireGuard 对端、活动连接数、DHCP 租约、路由器负载和内存。
- 流量流向图:Internet、路由器、内网交换机、无线 AP、各设备依次连线,虚线按速率流动,颜色区分公网、WireGuard、有线和无线。
- 实时事件流:新设备上线、DHCP 分配、流量突发、连接数激增、WireGuard 握手超时和重连。
- 底部表格:内网 Top 设备(带 90 秒趋势)、WireGuard 对端列表、接口状态。
- 使用体验:1 秒刷新,中文和英文切换,亮色和暗色主题,手机上流向图自动改成竖排。


两种采集器,覆盖新旧固件
| 目录 | 适用固件 | 采集器 | 每设备计数来源 |
|---|---|---|---|
| router | OpenWrt 23.05、24.10(有 ucode 和 nftables) | ucode CGI | nft 每 IP 计数表,依次回退到 Bandix、conntrack、nlbwmon |
| router19 | OpenWrt 19.07、QSDK、QWRT(无 ucode) | Lua 5.1 CGI | conntrack 字节统计(开着 NSS/ECM 时由 ECM 回写) |
两个采集器输出同一套 JSON,前端完全通用。Lua 版已经在一台运行 QWRT 固件的京东云 AX1800 Pro(高通 IPQ6018,内核 4.4,开着 NSS 和 ECM 硬件加速)上真机跑过;现代 OpenWrt 版目前只做过离线测试和模拟数据测试,还没有大规模真机验证,欢迎大家反馈。
先看效果:不用路由器也能跑
在电脑上克隆仓库,用 Python 起一个本地网页服务,然后在浏览器打开 http://127.0.0.1:8765/?mock=1 就能看到演示数据:
git clone https://github.com/liujiand-bt/openwrt-pulse.git
cd openwrt-pulse
python3 -m http.server 8765 --directory web
直接双击 web 文件夹里的 index.html 也会进入演示模式,并弹出“连接路由器”对话框。网址后面还可以加 lang=en 切换英文、theme=dark 切换暗色。
安装:现代 OpenWrt(23.05 / 24.10)
装了 LuCI 的固件一般已经自带 ucode、nftables 和 uhttpd,缺什么安装脚本会用 opkg 或 apk 自动补上。在电脑上把整个目录传到路由器,再在路由器上执行安装脚本:
# 在电脑上执行
scp -O -r openwrt-pulse [email protected]:/tmp/
# 登录路由器后执行
sh /tmp/openwrt-pulse/router/install.sh
安装完成后用浏览器打开 http://192.168.1.1/pulse/ 即可(192.168.1.1 换成你的路由器地址)。脚本会安装采集器、前端和配置文件,并创建一张只计数、不拦截任何流量的 nftables 表。如果检测到开着 flow offloading,脚本会提示你每设备速率会偏低。
装好后建议马上设置访问口令,例如生成一个随机口令并写入配置:
uci set pulse.main.token="$(head -c 12 /dev/urandom | md5sum | cut -c1-16)"
uci commit pulse
uci get pulse.main.token
卸载执行同目录下的 uninstall.sh。scp 加 -O 参数,是因为路由器上的 dropbear 不支持新版 OpenSSH 默认使用的 SFTP 协议。
安装:QWRT / OpenWrt 19.07(如京东云 AX1800 Pro)
这类机器往往只剩几百 KB 闪存空间,所以建议只在路由器上装采集器,约 32 KB,网页放在自己电脑上打开。
第一步,在电脑上打包。仓库暂时没有发布预编译的安装包,需要运行打包脚本,它会用 lua5.1 做一次语法检查:
tools/build-qwrt.sh
第二步,上传到路由器,先诊断再安装:
scp -O dist/pulse-qwrt.tar.gz [email protected]:/tmp/
ssh [email protected]
cd /tmp && tar xzf pulse-qwrt.tar.gz
sh /tmp/pulse-qwrt/diag.sh # 只诊断,不安装
sh /tmp/pulse-qwrt/install.sh tmp # 临时试用:全部放在内存里,重启就没了
sh /tmp/pulse-qwrt/install.sh # 常驻安装:约 32 KB 写入闪存
诊断脚本会检查 Lua 模块、uhttpd、conntrack 字节统计、ECM 和 NSS、无线客户端、WireGuard 和 IPv6 邻居,最后做一个 5 秒对比:WAN 接口速率和 conntrack 统计到的速率差多少。跑诊断时最好让某台设备在测速,对比才有意义。
常驻安装会自动生成口令并打印出来,忘了可以用 uci get pulse.main.token 查看。装完建议重启一次路由器,因为 conntrack 字节统计只对之后新建的连接生效。
第三步,在电脑上双击安装包里的 web/index.html,在“连接路由器”对话框里填采集器地址 http://192.168.1.1/cgi-bin/pulse 和口令。地址和口令只保存在这台电脑的浏览器里。
更详细的步骤、ssh 报错处理和卸载方法,见仓库 router19 目录下的 INSTALL-QWRT.md。
目前的限制,先说清楚
| 场景 | 影响 |
|---|---|
| 开启 flow offloading(软件或硬件) | 被卸载的连接不经过防火墙转发链,现代 OpenWrt 上每设备速率会严重偏低;WAN 总速率来自网卡计数,一般仍准确。要准就关掉 flow offloading。 |
| 高通 NSS + ECM 硬件加速 | 加速流量不经过 netfilter,iptables 和 nft 计数不可靠。Lua 采集器读 conntrack,由 ECM 大约每秒回写一次字节数,所以每设备速率会有 1 到 3 秒延迟和跳动,面板会自动按约 3 秒窗口平滑。 |
| 独立 AP 或二级路由下的无线设备 | 主路由读不到它们的无线客户端列表,这些设备会显示为有线。只有路由器本机能枚举到的客户端才标为无线。 |
| 内网互拷(电脑到 NAS) | 走交换芯片或网桥,不经过 conntrack,不计入每设备流量。面板只统计进出外网的流量。 |
| IPv6 | 现代版目前每设备主要统计 IPv4;QWRT 版在 IPv6 邻居表可用时,会把 IPv6 连接算到对应设备。 |
安全:只在内网用
面板会显示设备名、IP、MAC 和 WireGuard 端点,这些都是不该公开的信息。
- 不要暴露到公网:不要给 80、443 或 8088 端口做端口转发。在外面想看,先用 WireGuard 连回家里。
- 一定要设口令:请求必须带上口令才返回数据。不过它是共享口令加明文 HTTP,只能防家里人随手打开,扛不住有针对性的攻击。
- 采集器只读:不改路由和防火墙规则(只有手动把计数方式改成 iptables 时,才会建一条只计数的链),WireGuard 私钥不会输出。
如果你在家里还跑着 NAS、网站等服务,可以搭配我们之前介绍的 Uptime Kuma,一个看实时流量,一个看服务在不在线。
优缺点
优点:
- 真正的每设备实时速率:1 秒刷新,不只是累计用量。
- 新旧固件都能用:现代 OpenWrt 和 QWRT 这类 19.07 老固件各有一套采集器。
- 很轻:采集器按需运行不常驻,QWRT 上只占约 32 KB 闪存,前端不需要构建。
- 自带诊断:老固件上先跑诊断脚本,就知道数据能不能准。
- 开源免费:MIT 协议,可以随便改。
缺点:
- 项目刚发布:现代 OpenWrt 还没有大规模真机验证。
- 硬件加速下有误差:NSS/ECM 下速率会滞后和跳动,开着 flow offloading 时每设备数据偏低。
- 不存历史:只看最近 90 秒,不能查“上个月谁用得最多”。
- 安装要用命令行:目前没有 ipk 包,也不能在 LuCI 里一键安装。
适合谁
- 想知道“现在是谁在占网速”的家庭和小办公室网管。
- 用京东云、红米等高通机器刷 QWRT,苦于没有好用流量统计的玩家。
- 用 WireGuard 连回家、想顺便看看对端在不在线的人。
如果你需要按天、按月统计每台设备的总用量,nlbwmon 更合适;需要深度分析每条连接、协议和应用,ntopng 更专业。
和同类方案对比
| 对比项 | openwrt-pulse | Bandix | nlbwmon | luci-app-statistics | ntopng |
|---|---|---|---|---|---|
| 主要用途 | 实时流向和每设备速率 | 每设备流量监控 | 每设备累计用量 | 系统和接口历史图表 | 专业流量分析 |
| 每设备实时速率 | 支持,1 秒刷新 | 支持 | 不是实时,看累计值 | 按接口,不按设备 | 支持 |
| 历史数据 | 只保留最近 90 秒 | 有 | 按天和月 | 有(collectd 加 RRD) | 有 |
| 固件要求 | 23.05 及以上,或 19.07 和 QWRT | 内核 6.x,建议 24.10 及以上 | 通用 | 通用 | 官方建议小型网络 2 GB 以上内存 |
| 硬件加速下 | 需关闭 offloading;NSS 下读 conntrack | 需关闭硬件 offloading 和 Turbo ACC | 同样受影响 | 接口计数基本不受影响 | 依赖抓包,同样受影响 |
| 界面 | 独立网页,支持手机 | LuCI 页面 | LuCI 页面 | LuCI 页面 | 独立网页 |
Bandix 的要求来自它的官方 README;ntopng 的内存要求来自官方硬件规格文档(小型网络 2 核、2 GB 内存起),大多数家用路由器达不到,通常要装在单独的机器上。另外,openwrt-pulse 能读取 Bandix 和 nlbwmon 的数据作为每设备计数来源,它们不冲突,可以一起装。
项目信息
| 项目 | 信息 |
|---|---|
| 名称 | openwrt-pulse |
| 开发 | Baffox |
| GitHub | liujiand-bt/openwrt-pulse |
| 开源协议 | MIT |
| 适用固件 | OpenWrt 23.05、24.10;OpenWrt 19.07、QSDK、QWRT |
| 真机测试 | 京东云 AX1800 Pro(QWRT,IPQ6018,NSS/ECM) |
| 前端 | 原生 JavaScript 加 SVG,无需构建 |
| 采集器 | ucode CGI(现代版)、Lua 5.1 CGI(QWRT 版) |
| 界面语言 | 中文、English |
| 发布时间 | 2026 年 10 月 11 日 |
项目刚刚发布,如果它对你有用,欢迎到 GitHub 点个 Star。你的路由器型号和固件跑不起来、数据对不上,也欢迎提 Issue,附上诊断脚本的输出(MAC 和公网 IP 已自动打码),我们会尽快适配。


