基于 OpenWrt 的轻量级网络管理 Web 应用
实时流量监控 · 可视化仪表盘 · 防火墙规则管理
OpenWrt Network Manager 是一个面向嵌入式路由器的网络管理工具,以 Web 仪表盘的形式提供 实时流量监控 和 防火墙规则管理 两大核心功能。项目采用 C + Python + JavaScript 三层架构,专为 OpenWrt 25.12(firewall4 / nftables)设计,通过 Samba 共享完成部署,资源占用极低。
- 🚀 实时流量捕获 — 基于 libpcap 的 C 语言抓包程序,按
(src_ip, dst_ip)对统计累计流量、峰值速率、平均速率 - 📊 可视化仪表盘 — 蓝色主题 Web UI,包含流量趋势图、主机热力图、连接分析、活跃主机排行
- 🔥 防火墙管理 — 通过 UCI 接口管理 firewall4 规则,支持新增、查看、删除、清空,操作安全隔离
- 🔌 零依赖后端 — Python 标准库
http.server,无需 pip 安装任何第三方包 - 📡 RESTful API — 标准化的 JSON 接口,便于二次开发和系统集成
┌─────────────────────────────────────────────────────────────┐
│ Browser (Web UI) │
│ index.html + style.css + app.js │
│ 仪表盘 / 流量监控 / 连接分析 / 防火墙 / 历史记录 │
└──────────────────────────┬──────────────────────────────────┘
│ HTTP (JSON)
▼
┌─────────────────────────────────────────────────────────────┐
│ Python Backend (server.py) │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ GET /api/traffic│ │ POST /api/firewall/* │ │
│ │ GET /api/overview│ └────────┬─────────┘ │
│ └──────┬───────┘ │ │
│ │ │ subprocess │
│ ▼ ▼ │
│ data/traffic.json Shell Scripts (firewall_*.sh) │
└──────────┬───────────────────────┬──────────────────────────┘
│ file I/O │ UCI commands
▼ ▼
┌────────────────────┐ ┌────────────────────────────────────┐
│ C Monitor │ │ OpenWrt firewall4 (nftables) │
│ traffic_monitor │ │ /etc/config/firewall │
│ (libpcap + pthread)│ │ fw4 / uci │
└────────────────────┘ └────────────────────────────────────┘
数据流说明:
- 流量监控链路:C 程序通过 libpcap 抓取
br-lan接口的 IP 数据包 → 解析源/目的 IP 和包长度 → 按流聚合统计 → 每 2 秒写入data/traffic.json→ Python 后端读取 JSON → 前端轮询/api/traffic刷新展示 - 防火墙管理链路:前端表单提交 → Python 后端参数校验 → 调用 Shell 脚本 → 脚本通过
uci add/set/commit写入配置 →/etc/init.d/firewall reload使规则生效
openwrt-network-manager/
├── c_monitor/ # C 语言流量监控模块
│ ├── traffic_monitor.c # libpcap 抓包 + 流量统计
│ ├── Makefile # 编译脚本
│ └── build_for_ac2100.sh # MIPS 交叉编译辅助脚本(可选)
│
├── backend/ # Python 后端服务
│ └── server.py # HTTP 服务 + API 路由 + 参数校验
│
├── frontend/ # Web 前端
│ ├── index.html # 主页面(蓝色主题仪表盘)
│ ├── style.css # 样式表
│ └── app.js # 前端逻辑(页面路由、图表渲染、API 调用)
│
├── data/ # 运行时数据
│ └── traffic.json.example # 流量 JSON 模板(首次运行自动复制)
│
├── docs/ # 补充文档
│ ├── immortalwrt-ac2100-deploy.md
│ └── compile-traffic-monitor-ac2100.md
│
├── scripts/ # Shell 脚本
│ ├── run_monitor.sh # 启动流量监控
│ ├── run_server.sh # 启动后端服务
│ ├── firewall_add.sh # 添加防火墙规则
│ ├── firewall_list.sh # 列出防火墙规则
│ ├── firewall_delete.sh # 删除指定规则
│ └── firewall_clear.sh # 清空所有 Web 规则
│
├── LICENSE # 开源许可证
├── .gitignore
└── README.md # 项目说明文档
| 层级 | 技术 | 说明 |
|---|---|---|
| 流量捕获 | C / libpcap | 高性能原始包捕获,BPF 过滤仅处理 IPv4 |
| 数据交换 | JSON | C 程序写入 → Python 读取,文件级解耦 |
| 后端服务 | Python 3 / http.server | 零第三方依赖,纯标准库实现 |
| 前端界面 | HTML + CSS + Vanilla JS | 无框架依赖,Canvas 原生绘图 |
| 防火墙 | UCI + firewall4 | OpenWrt 22.03+ 的 nftables 方案 |
| 部署方式 | Samba / scp / git | 将项目目录复制到路由器即可运行 |
| 环境 | 包管理器 | 防火墙 | 流量监控二进制 |
|---|---|---|---|
| OpenWrt 23.05+ / ImmortalWrt 23.05.x | opkg |
firewall4 (nftables) | 需按目标 CPU 架构交叉编译 |
| OpenWrt SNAPSHOT (部分分支) | apk |
firewall4 (nftables) | 同上 |
MIPS 设备(如红米 AC2100)请参考 docs/compile-traffic-monitor-ac2100.md 与 docs/immortalwrt-ac2100-deploy.md。
| 条件 | 说明 |
|---|---|
| OpenWrt 版本 | 23.05+ 或兼容的 ImmortalWrt(firewall4 / nftables) |
| 包管理器 | opkg 或 apk(视固件而定) |
| Python 3 | 例如 opkg install python3 或 apk add python3 |
| libpcap | 运行时库(交叉编译时需对应 dev 包) |
| 编译环境 | 外部 Linux x86_64(gcc、libpcap-dev;MIPS 设备需 SDK 交叉编译) |
⚠️ OpenWrt 默认缺少 musl-dev 和 libpcap-dev,需在外部 Linux x86_64 环境编译。
# 在 Linux x86_64 主机上
cd c_monitor
make # 生成 traffic_monitor 可执行文件编译产物为 traffic_monitor,是一个 Linux ELF 可执行文件。编译依赖:
libpcap— 网络抓包pthread— 写入线程
将项目目录传输到路由器(路径可自定义,以下以 /root/openwrt-network-manager 为例):
scp -r . root@192.168.1.1:/root/openwrt-network-manager/也可通过 Samba 共享等方式复制整个项目目录。
SSH 登录 OpenWrt 后:
cd /root/openwrt-network-manager
# 赋予脚本执行权限
chmod +x scripts/*.sh
# 终端 1:启动流量监控(默认监听 br-lan)
./scripts/run_monitor.sh br-lan
# 终端 2:启动后端服务(默认端口 8080)
./scripts/run_server.sh 8080浏览器打开(将 <ROUTER_IP> 替换为路由器地址):
http://<ROUTER_IP>:8080
| 指标 | 说明 |
|---|---|
| 累计流量 (total_bytes) | 该流自首次发现以来的总字节数 |
| 峰值速率 (peak_rate) | 所有 2 秒采样窗口中的最大字节/秒 |
| 平均速率 (avg_rate) | 累计流量 ÷ 存活时长 |
C 程序采用 双线程架构:
- 主线程 — 运行
pcap_loop抓包循环,解析以太网帧中的 IPv4 数据包,更新内存中的统计记录 - 写入线程 — 每 2 秒计算峰值速率、写入 JSON 文件、刷新控制台表格
线程间通过 pthread_mutex 保护共享记录数组,支持最多 1024 条流记录。
本项目通过 UCI(Unified Configuration Interface)管理 firewall4 规则:
| 操作 | 脚本 | UCI 命令 |
|---|---|---|
| 添加 | firewall_add.sh |
uci add firewall rule → uci set → uci commit → reload |
| 查看 | firewall_list.sh |
uci show firewall → 过滤 web_rule_* |
| 删除 | firewall_delete.sh |
uci delete firewall.<section> → uci commit → reload |
| 清空 | firewall_clear.sh |
遍历所有 web_rule_* 逐条删除 → commit → reload |
💡 安全设计:所有 Web 添加的规则 name 以
web_rule_前缀标识(如web_rule_1719301234),与系统默认规则隔离,防止误删系统配置。
验证规则是否生效:
# 查看 UCI 配置
uci show firewall | grep web_rule_
# 查看 nftables 实际规则
fw4 print所有接口返回 JSON 格式,支持 CORS(Access-Control-Allow-Origin: *)。
GET /api/traffic
响应示例:
{
"status": "success",
"timestamp": "2026-06-15 16:30:00",
"data": [
{
"src_ip": "192.168.1.2",
"dst_ip": "192.168.1.1",
"total_bytes": 20480,
"peak_rate": 4096,
"avg_rate": 1024
}
]
}GET /api/overview
返回主机名、系统时间、运行时长、监控接口、流量记录数、防火墙规则数等。
| 方法 | 路径 | 请求体 | 说明 |
|---|---|---|---|
| POST | /api/firewall/add |
{protocol, src_ip, dst_ip, port, action} |
添加规则 |
| POST | /api/firewall/list |
无 | 获取规则列表 |
| POST | /api/firewall/delete |
{section_id} |
删除指定规则 |
| POST | /api/firewall/clear |
无 | 清空所有 Web 规则 |
添加规则请求示例:
{
"protocol": "tcp",
"src_ip": "192.168.1.2",
"dst_ip": "192.168.1.1",
"port": "80",
"action": "drop"
}参数校验规则:
| 参数 | 约束 |
|---|---|
| protocol | 必须为 tcp / udp / icmp |
| src_ip / dst_ip | 合法 IPv4 地址,各段 0-255 |
| port | TCP/UDP 必填,1-65535;ICMP 可留空 |
| action | 必须为 accept / reject / drop |
| 变量 | 默认值 | 说明 |
|---|---|---|
OWRT_MONITOR_IFACE |
br-lan |
流量监控的网络接口 |
# 流量监控程序
./traffic_monitor [接口名] [输出文件路径]
# 默认: br-lan, ../data/traffic.json
# 后端服务
python3 server.py [端口号]
# 默认: 8080
# 启动脚本
./scripts/run_monitor.sh [接口名]
./scripts/run_server.sh [端口号]| 宏 | 默认值 | 说明 |
|---|---|---|
MAX_RECORDS |
1024 | 最大流记录条数 |
UPDATE_INTERVAL |
2 | JSON 写入间隔(秒) |
SNAP_LEN |
65535 | 抓包最大长度 |
在宿主机上产生网络流量,观察前端仪表盘变化:
# 在宿主机持续 ping(将 <ROUTER_IP> 替换为路由器地址)
ping <ROUTER_IP>
# 或使用 iperf3 产生大流量
iperf3 -c <ROUTER_IP>- 通过 Web 页面添加一条
drop规则(如 ICMP drop 某 IP) - 在宿主机执行
ping <被阻断的IP>,验证请求被丢弃 - 删除或清空规则后,验证连通性恢复
# 将 192.168.1.1 替换为你的路由器 IP
curl http://192.168.1.1:8080/api/traffic
curl http://192.168.1.1:8080/api/overview
curl -X POST http://192.168.1.1:8080/api/firewall/add \
-H "Content-Type: application/json" \
-d '{"protocol":"icmp","src_ip":"192.168.1.2","dst_ip":"192.168.1.1","port":"","action":"drop"}'
curl -X POST http://192.168.1.1:8080/api/firewall/list
curl -X POST http://192.168.1.1:8080/api/firewall/clearC 程序无法运行
确认编译环境为 Linux x86_64,产物为 ELF 可执行文件而非 Windows .exe。
file traffic_monitor
# 应输出: ELF 64-bit LSB executable, x86-64 ...抓不到数据包
尝试更换网络接口。OpenWrt 默认桥接接口为 br-lan,部分场景可能需要使用 eth0:
# 查看可用接口
ip link show端口被占用
修改启动端口:
./scripts/run_server.sh 9090 # 使用其他端口防火墙规则不生效
确保以 root 用户运行脚本,并检查 firewall4 服务状态:
/etc/init.d/firewall status
/etc/init.d/firewall reload
fw4 print | grep web_rule_前端页面打不开
- 确认后端服务已启动且监听正确端口
- 确认 OpenWrt 防火墙放行该端口
- 检查浏览器控制台是否有网络错误
| 页面 | 功能 |
|---|---|
| 🏠 仪表盘 | 流量趋势图、主机热力图、实时连接、活跃主机排行、快捷添加规则、操作历史 |
| 📊 流量监控 | 完整流量数据表格,自动刷新 |
| 🔗 连接分析 | 所有连接记录的详细列表 |
| 🔥 防火墙 | 添加规则表单、执行日志、规则列表管理(刷新/删除/清空) |
| 📜 历史记录 | 所有操作的时间线记录 |
本项目面向实验与受信任局域网环境,默认不提供身份认证:
- HTTP 服务监听
0.0.0.0,局域网内任意主机均可访问 API - 防火墙管理接口可直接修改路由器
firewall配置,需 root 权限运行脚本 - CORS 设置为
Access-Control-Allow-Origin: *
请勿在未加固的公网或不可信网络中直接暴露本服务。 生产或半生产场景建议:
- 仅绑定
127.0.0.1,通过带认证的反向代理对外提供访问 - 在路由器防火墙中限制管理端口的来源 IP
- 自行增加 Token / Basic Auth 等鉴权层
本项目采用 MIT License 开源。
如有问题或建议,欢迎提交 Issue 或 Pull Request。