kenjohnscreates/network-monitor
GitHub: kenjohnscreates/network-monitor
一款基于 Rust + Tauri 的 macOS 本地网络流量实时监控桌面应用,旨在以比 Wireshark 更简洁的方式回答「我的机器在和谁通信」的问题。
Stars: 0 | Forks: 0
# 网络监视器
用于监控 macOS 上本地网络流量的个人使用桌面应用。它是 Wireshark 的一个更简单、主观的替代方案,适合解决日常的“我的机器在和谁通信”这类问题。
## 技术栈
- **桌面外壳:** Tauri 2
- **前端:** React 18 + TypeScript + Vite + TanStack Table + Recharts
- **后端:** Rust workspace
- `capture_core` — `libpcap` + `etherparse` 数据包捕获与解析
- `flow_engine` — 双向流聚合
- `enrichment` — 非阻塞式 rDNS + GeoIP
- `shared_types` — 跨越 Tauri bridge 的 serde 契约
- **包管理器:** pnpm
## 仓库布局
```
apps/desktop/ # Tauri 2 + React app
src/ # React frontend
src-tauri/ # Tauri Rust backend
crates/
shared_types/ # PacketEvent, FlowRecord, Direction, Protocol
capture_core/ # Live capture pipeline
flow_engine/ # Flow keys, aggregation, top-K helpers
enrichment/ # rDNS + GeoIP worker
docs/
setup.md # macOS BPF permissions + run notes
```
## 前置条件 (macOS)
- Xcode Command Line Tools: `xcode-select --install`
- 通过 [rustup.rs](https://rustup.rs) 安装 Rust (stable)
- Node 20+
- pnpm 10+ (`curl -fsSL https://get.pnpm.io/install.sh | sh -`)
- BPF 读取权限 — 参见 [`docs/setup.md`](docs/setup.md)。如果没有此权限,应用可以列出网卡接口,但实时捕获会因权限错误而失败。
## 在开发环境中运行
```
pnpm install
cargo build --workspace
cd apps/desktop
pnpm tauri dev
```
然后在窗口中:
1. 选择一个可用的网卡接口(例如 `en0`)。
2. 点击 **start**。大约 1 秒内,仪表盘就会显示数据:总上传/下载量、数据包/秒走势线图、热门主机/协议/端口。
3. 使用连接表按主机、协议、端口或方向进行过滤 — 尝试 **focus: wan-ish**,在你初步了解情况时,它可以隐藏明显的本地多播和纯 RFC1918↔RFC1918 通信。
4. 打开 **Signals** 查看基于规则的启发式提示(可在 **settings** 下切换规则);这些提示是调查线索,而非恶意软件判定。
5. 可选:打开 **settings** → 启用 Reverse DNS,浏览并选择 GeoLite2 `.mmdb` 文件 → 设置会跨次启动持久化保存。
6. **export csv** / **export json** 会将当前会话写入文件。
### 前五分钟(熟悉指南)
新手的快速上手路径:选择网卡接口 → **start** → 连接表使用 **focus: wan-ish** → 按 **total** 排序 → 浏览 **Signals** 查找罕见端口或高上传量的 WAN 数据流 → 如果某个陌生的远程 IP 让你在意,你可以按自己的方式查询(许多人使用外部信誉工具,例如 [VirusTotal IP 查询](https://www.virustotal.com/gui/home/search);这会将数据发送给 VirusTotal)。
更多设置细节(BPF,GeoIP 下载)请见 [`docs/setup.md`](docs/setup.md)。
### 敏感问题附件
避免将包含实时 IP 或凭据的导出文件附加到公开的问题中 — 参见 [`SECURITY.md`](SECURITY.md)。
## 构建发布版本
```
cd apps/desktop
pnpm tauri build
```
在分发前,请将 `apps/desktop/src-tauri/icons/icon.png` 替换为真正的 512×512 RGBA PNG 图像。
## CLI 示例
无需启动 GUI 即可进行的快速检查:
```
cargo run -p capture_core --example list # list interfaces
sudo cargo run -p capture_core --example capture en0 5 # 5s of JSONL packet events
sudo cargo run -p flow_engine --example aggregate en0 10 5 # top flows for 10s, refreshing every 5
```
## 测试
```
cargo test --workspace
```
涵盖了流键控、聚合、top-K 辅助程序、方向推断、数据包解析、enrichment 缓存行为以及异常启发式算法(`flow_engine::anomaly`)。
## 隐私
本应用:
- 仅捕获数据包头(不包含 payload)
- 完全在本地运行 — 除了可选的 reverse DNS 和你本地提供的 GeoIP 数据库外,不进行任何网络调用
- 仅持久化你的设置(`/settings.json`);数据流存在于内存中,并在停止或退出时清除
- 在设备上根据 UI 所看到的相同聚合数据计算 **Signals** 启发式规则;可以在设置下禁用或调整规则(它们是可解释的提示,而非 AV 判定)
## GeoLite2 再分发
MaxMind GeoLite2 数据库受 [许可证约束](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data)。请从 MaxMind 下载你自己的 `.mmdb` 文件 — **不要**将 GeoIP 文件提交到 git 中(参见 [.gitignore](.gitignore))。
## 已知限制
- **以 macOS 为主。** 依赖于 `/dev/bpf*` 和 Wireshark 的 ChmodBPF 的代码路径是 macOS 特有的。Linux 可能可以运行(libpcap + cap_net_raw),但未经测试。
- **无进程归因。** 将数据流映射到 PID 需要轮询 `lsof` 或使用私有 API;此功能在 v1 版本中暂缓。
- **支持 IPv6 但在仪表盘中未优先处理。**
- **VPN 接口(`utun*`)** 通常需要额外权限,并且可能无法捕获有意义的数据包。
- **基于快照的 UI。** 连接表最多显示 `top_n`(默认为 250)条数据流;仪表盘的总量/top-K 是基于*完整*的聚合器状态计算的,因此即使存在此上限,它们也能保持准确。**Signals** 可能会引用当前 top-N 表之外的某个数据流 — 滚动/高亮仅在显示该行时适用。
- **Reverse DNS** 在 worker 线程中同步使用操作系统解析器;结果会在应用的整个生命周期内在进程内缓存。
## 路线图
v1.0 已完成。最初的十个构建阶段均已交付:
- [x] 阶段 1 — Tauri + Rust workspace 引导
- [x] 阶段 2 — 通过 pcap 进行网卡接口发现
- [x] 阶段 3 — 实时数据包捕获
- [x] 阶段 4 — 数据流聚合引擎
- [x] 阶段 5 — Tauri 命令/事件 bridge
- [x] 阶段 6 — 实时仪表盘 UI
- [x] 阶段 7 — 连接表
- [x] 阶段 8 — DNS + GeoIP enrichment
- [x] 阶段 9 — 导出 + 设置
- [x] 阶段 10 — 清理 + 强化
## 构建方式
本项目是使用 LLM 辅助开发在 Cursor 中构建的。架构、PRD、决策和审查均由我本人完成。实现过程是我与模型协作完成的,每次更改都经过了审查和测试。我对此持开放态度,因为该领域发展迅速,README 应该反映代码实际的诞生过程。
## 许可证
[MIT](LICENSE)
## 贡献
这是一个个人项目。欢迎提交问题(Issues)。我不主动寻求 PR,但会予以考虑。
标签:React, Rust, Syscalls, Tauri, 可视化界面, 桌面应用, 网络流量审计, 通知系统