netFlow_tool 是一个 (青春版netlimiter) Windows 本地 WebUI 网络流量监控工具,采用 Rust 和 Go 编写:
- Rust core WinDivert 抓包、协议解析、PID 映射、流量聚合与 IPC 传输
- Go WebUI host 拉起核心进程、轮询统计快照,并通过本地 HTTP/WebSocket 服务 React WebUI
- 按进程展示实时上传 / 下载速率
- 展示当前会话最高上传 / 下载峰值速率,启动窗口日志会输出抓包丢包计数与 PID 映射记录
- 展示累计上传 / 下载流量
- 可以按
User / System / Service分类查看进程 - 可以按
All / Active / Inactive状态筛选进程 - 提供历史流量统计页面与历史上下行柱状图
- 提供本地 WebUI 实时监测面板
- 支持表头排序、分类筛选、父子进程树形展示与历史流量图表
- 通过页面顶部导航栏在
Overview / Processes / History页面之间切换 - 点击
Processes页面中进程表头的Process / Upload / Download切换排序方式与升降序;Peak/Total 等完整指标在 Details 面板展示 - 点击进程名前的箭头展开 / 收起子进程
- 父进程会显示本机程序图标;图标由本地 Go WebUI host 从进程可执行文件中提取、按 exe 路径缓存并后台预热
- 在页面顶部导航栏中按
All / User / System / Service筛选 - 在
Processes页面表格标题处按All / Inactive / Active筛选进程状态 - 进程树使用 Rust core 最新 1 秒快照,避免测速峰值被长窗口平均稀释
History页面显示基于每日历史数据的上传 / 下载柱状图,悬停提示统一使用 MB / GB 单位,并在Recent Daily Usage表格中支持按日期或总流量排序
netFlow_tool/
├─ rust_core/ # Rust 抓包与聚合核心
│ ├─ src/
│ └─ libs/ # WinDivert 运行时与导入库
├─ go-ui/ # Go WebUI host、IPC 客户端、StatsService 与 React WebUI
├─ scripts/ # 本地构建 / 运行脚本
├─ build/ # 本地产物输出目录(生成物)
└─ .github/workflows/ # GitHub Actions 工作流
- Windows 10/11
- 管理员权限运行
- Rust MSVC toolchain
- Go 1.21+
- Node.js 22+(构建 React WebUI)
管理员权限仅用于 WinDivert 驱动抓包与监测,不会涉及其他额外的系统级用途。
仓库现已包含项目运行与构建所需的 WinDivert 文件,位于 rust_core/libs/:
WinDivert.dllWinDivert64.sysWinDivert.lib
其中:
WinDivert.dll:运行时动态库WinDivert64.sys:内核驱动WinDivert.lib:Rust 构建时使用的导入库
如果你准备替换 WinDivert 版本,请确保这三个文件保持版本匹配。
在仓库根目录的 PowerShell 中执行:
# 构建 Rust core + Go WebUI host,并将最终产物复制到 build/
.\scripts\build.ps1
# 运行 WebUI host(会自动拉起并管理 Rust core)
.\scripts\run.ps1首次真正抓包时,需要以管理员权限运行。
启动后,Go 进程会拉起本地 WebUI 服务,并随机监听一个高位端口,例如:
Web UI: http://127.0.0.1:52341
程序会尝试自动打开浏览器。即使浏览器没有自动弹出,也可以手动访问终端中输出的地址。
修改 WebUI 样式或交互时,可以只启动 Vite 本地开发服务器,不需要启动 Go WebUI host、Rust core 或 WinDivert:
cd go-ui\web\webui
npm run devVite 会监听固定地址:
http://127.0.0.1:5173
在该模式下,前端会自动使用内置 mock 流量快照数据,支持热更新实时预览界面;正式 npm run build 后嵌入 Go WebUI host 的版本仍然通过 /api/bootstrap 和 /ws 读取真实后端数据。
WebUI 采用前后端分离:
- 后端:Go 本地 HTTP server
- 提供
/api/bootstrap初始化接口 - 提供
/wsWebSocket 实时推送接口
- 提供
- 前端:使用 Vite 构建的独立 React 工程
- 使用 React 渲染
- 使用 Tailwind CSS 做样式
- 使用 shadcn CLI 生成的 UI 组件组织界面
- 使用 TanStack Table 渲染表格
- 使用 shadcn Chart 组件与 Recharts 绘制历史流量图表
- 使用
api/client.js与自定义 hooks 统一 bootstrap / WebSocket / mock 数据接入 - 使用
lib/processTree.js维护可测试的进程树构建与聚合逻辑
前端源码位于 go-ui/web/webui/,构建产物输出到 go-ui/web/webui/dist/,随后由 Go 程序直接嵌入并服务。
cd rust_core
$env:WINDIVERT_PATH = (Resolve-Path ".\libs").Path
cargo build --releasecd go-ui
go build -o ..\build\netFlow_tool-webui.exe .执行 .\scripts\build.ps1 后,build\ 目录下会生成:
netFlow_tool-core.exenetFlow_tool-webui.exeWinDivert.dllWinDivert64.sys
双击
netFlow_tool-webui.exe即可运行并自动拉起netFlow_tool-core.exe与本地 WebUI 服务。
Network
-> WinDivert
-> crossbeam channel
-> parser
-> PID mapper
-> FlowAggregator
-> IPC pipe server
-> Go StatsService
-> Go HTTP/WebSocket server
-> React WebUI
这是因为 WinDivert 抓包需要管理员权限。WebUI host 会在检测到非管理员运行时尝试自动请求提权重启;也可以直接右键以管理员身份运行程序。
请检查:
- 是否使用管理员权限启动
build\目录中是否包含WinDivert.dll与WinDivert64.sys- Rust core 是否已成功启动
请检查:
- 是否安装 Rust MSVC 工具链
- 是否安装 Go 1.21+
- 是否安装 Node.js 22+
rust_core/libs/中的 WinDivert 文件是否完整
- 当前以监控展示为主,限速逻辑尚未接入主流程
- Go WebUI host 与 Rust core 之间同一时刻仅维护单个 IPC 客户端连接
- IPC 当前仍使用 newline-delimited JSON;已带
protocol_version/snapshot_id,但尚未迁移到 length-prefixed framing
- 本项目采用
MIT License - 项目依赖 WinDivert,请在发布和再分发时确认对应版本的许可证条款
- WinDivert 官方项目:https://github.com/basil00/WinDivert