jdtec-ex/flowarden-ex
GitHub: jdtec-ex/flowarden-ex
Flowarden 是一款基于 Rust + Avalonia 的跨平台桌面网络流量监控工具,支持实时抓包与 pcap 重放,提供流量排名、进程归属、目标地图及行为信号告警等功能。
Stars: 3 | Forks: 0
# Flowarden
[](https://github.com/jdtec-ex/flowarden-ex/actions/workflows/ci.yml)
[](LICENSE)
[](#)
[
[](flowarden/)
[](flowarden-ui/)
**公测版。** 桌面网络流量监控工具,支持实时捕获和 pcap 重放 —— 包含排名的主机、服务和连接,目标地理位置,进程归属,TLS SNI,行为信号,以及 **RFC5424 + CEF syslog** 导出(信号 + Inspect 流)。
**跨平台:** Linux、macOS 和 Windows。在三个平台上使用相同的 Rust 核心和 Avalonia UI;捕获栈使用 libpcap(Linux/macOS)或 Npcap(Windows)。
构建为 **Rust 常驻分析核心**,在本地 gRPC 上提供 **Avalonia (.NET 8) UI**,外加一个共享相同投影契约的 **CLI**。灵感来自 [Sniffnet](https://github.com/GyulyVGC/sniffnet);非分支版本。
## 截图
| Overview | Source |
| --- | --- |
|  |  |
| Inspect | Signals |
| --- | --- |
|  |  |
| Settings | Thumbnail |
| --- | --- |
|  |  |
## 功能
### 捕获与分析
- 从选定接口进行实时捕获,或离线重放 pcap/pcapng
- 可选的捕获时 BPF(在会话开始时应用)
- 实时和离线共享 pipeline:解码、方向、服务标签、每秒聚合
- ARP、TCP/UDP/ICMP、TLS ClientHello **SNI**、本地进程名/PID(异步、非阻塞)
- **行为 / 轻量级 DPI 检测器**(Signals):数据阈值、监视/已知恶意实体、单向大文件传输(可能的数据外泄)、长期空闲 TCP、未经授权的 P2P/代理启发式分析
- **Syslog 导出**(RFC5424 信封 + **CEF** 正文,SIEM 标准键):信号和 **Inspect 流**摘要;CLI/`core` 参数或设置 UI(`Get`/`SetSyslogConfig`)
- 带有内存限制的常驻模式,适合长时间运行的会话
- 捕获期间可选的原始 pcap 写出
### 桌面控制台
- **Source** — 设备列表、简短预览样本、启动 / 暂停 / 恢复 / 停止
- **Overview** — 吞吐量图表(入/出)、状态卡片、目标地图 + 热门区域、热门主机 / 服务 / 连接
- **Inspect** — 过滤优先的工作台:即时搜索、方向、结构化过滤器、可移除的标签(chips);流和 TCP 表
- **Signals** — 阈值、监视和已知恶意实体;未读徽章、提示音/声音、转入 Inspect
- **Settings** — Top N、信号策略、诊断导出、UI 密度(舒适 / 紧凑)
- 用于轻量级监控的置顶缩略图窗口
- 连接排名上的进程图标(可用时显示 OS 图标)
### 跨页面分析
- 一键从 Overview 排名(主机、服务、连接、**区域/地图标记**)转入 Inspect
- 离线发现可以聚焦时间线和排名,然后使用相同的过滤器打开 Inspect
- Inspect 上的国家/地区过滤器使用来自实时投影的主机地理位置
### CLI
- `devices` / `capture`,提供表格或 JSON 输出
- 在适用的地方提供与 UI 相同的丰富字段(主机、连接、SNI、发现)
- 用于离线回归的稳定黄金样本
## 为什么选择 Flowarden
| | |
| --- | --- |
| **跨平台** | **Linux、macOS 和 Windows** 上使用同一代码库运行(libpcap / Npcap + Avalonia)。 |
| **清晰的边界** | 捕获/分析保留在 Rust 中;UI 仅消费投影。CLI 和 UI 共享一个契约。 |
| **为长时间运行而构建** | 常驻核心、软上限聚合、滚动实时时间线 —— 而不是无限制的会话转储。 |
| **分析师工作流** | 过滤器、标签、转入、信号和离线取证标记 —— 不仅仅是图表。 |
| **诚实的语义** | 捕获 BPF 与 Inspect 过滤器是分开的。投影 Top N 是显式的。进程查找是启发式和非阻塞的。 |
| **当今的实用深度** | 轻量级 DPI(TLS SNI)和进程归属,而无需完整的 IDS 范围。 |
| **深入发展的空间** | 核心 pipeline 旨在向更广泛的 DPI 和协议细节发展。 |
## 架构
```
┌─────────────────┐ gRPC (local) ┌──────────────────────────┐
│ Avalonia UI │ ◄──────────────────► │ flowarden (resident) │
│ flowarden-ui │ health · control │ capture → decode → agg │
└─────────────────┘ discovery · proj. │ projection · signals │
└────────────┬─────────────┘
│
┌────────────▼─────────────┐
│ flowarden-core │
│ devices · pcap · flow │
└──────────────────────────┘
CLI: flowarden devices | capture … (same core, no UI)
```
| 组件 | 角色 |
| --- | --- |
| `flowarden/` | Rust 工作区:CLI、常驻 gRPC host、core、proto |
| `flowarden-ui/` | Avalonia 桌面应用 |
| `screenshots/` | README 产品截图 |
## 支持的平台
| OS | Core / CLI | 桌面 UI | 捕获后端 |
| --- | --- | --- | --- |
| **Linux** | 是 | 是(Avalonia) | libpcap |
| **macOS** | 是 | 是(Avalonia) | libpcap(系统) |
| **Windows** | 是 | 是(Avalonia) | [Npcap](https://npcap.com/)(兼容 WinPcap API) |
### 下载(用户)
预构建的**便携完整捆绑包**(在一个压缩包中包含独立的 UI + `flowarden` 核心)发布在:
**https://github.com/jdtec-ex/flowarden-ex/releases**
发布标题使用 **`Flowarden 0.1.*`**(从 **0.1.0** 开始)。Git 标签与数字匹配:`0.1.0`、`0.1.1`、…
| 资产(示例) | 平台 |
| --- | --- |
| `flowarden-linux-x64.tar.gz` | Linux x64 |
| `flowarden-macos-arm64.tar.gz` | macOS Apple Silicon |
| `flowarden-windows-x64.zip` | Windows x64 |
解压后,将 UI 和核心保持在**同一文件夹**中,然后启动 `Flowarden.Ui` / `Flowarden.Ui.exe`。完整说明也位于压缩包内的 `README.txt` 中。
**下载后(所有平台)**
1. 解压压缩包。
2. 不要将 UI 二进制文件与 `flowarden` / `flowarden.exe` 分开 —— UI 会从同一目录启动核心。
3. **Windows:** 首先安装 [Npcap](https://npcap.com/)(如果提供,请启用 WinPcap API 兼容性)。
4. **Linux:** 确保已安装 libpcap;实时捕获通常需要提升的权限(见下文)。
5. **macOS(未签名 / GitHub zip):** 清除隔离,以便 Gatekeeper 不会阻止二进制文件(**临时**变通方法,直到应用签名/公证):
```
# 从解压后的文件夹
xattr -cr .
# 或仅可执行文件:
xattr -d com.apple.quarantine ./Flowarden.Ui ./flowarden 2>/dev/null || true
```
然后运行 `./Flowarden.Ui`。如果 macOS 仍然阻止该应用:系统设置 → 隐私与安全性 → 允许被阻止的应用,或右键单击 → 打开。
**权限 / `sudo`(实时捕获)**
- 实时数据包捕获需要对网络接口的原始访问权限。离线 pcap 重放则**不需要**。
- **Linux:** 您可能需要 `sudo ./Flowarden.Ui` 或 `sudo ./flowarden …`,或者授予 capabilities 而不是完全的 root 权限,例如:
`sudo setcap cap_net_raw,cap_net_admin=eip ./flowarden`
尽可能优先使用 capabilities,而不是让 UI 以 root 身份运行。
- **macOS:** 第一次捕获可能会提示授予权限;某些设置仍然需要从具有提升权限的终端运行。出现系统权限对话框时,优先使用它;只有在授予权限后捕获仍然失败时才使用 `sudo`。
- **Windows:** 使用管理员权限安装一次 Npcap;如果 Npcap 安装正确,日常 UI 通常不需要“以管理员身份运行”。
- **注意:** 在 `sudo`/`Administrator` 下运行整个桌面 UI 会增加风险。尽可能只提升捕获后端的权限,并避免以 root 身份浏览不受信任的文件。
CI(仅测试)在 Ubuntu 和 Windows 上运行;当推送 `0.1.*` 标签时,会为 Linux、macOS 和 Windows 生成 **Release** 包。
## 环境要求
- **Rust**(稳定版)用于 core/CLI
- **.NET 8 SDK** 用于 UI(`global.json` 锁定补丁级别)
- 捕获栈:
- **Linux:** `libpcap`(例如 `libpcap-dev`)以及根据需要的捕获权限
- **macOS:** 系统 libpcap;在提示时授予捕获权限
- **Windows:** 安装 [Npcap](https://npcap.com/)(如果提供,请启用 WinPcap API 兼容性);仅在从源代码构建时才需要 SDK
- 可选:核心资源路径下的 MaxMind GeoLite2 数据库,用于国家/ASN 丰富(出于产品选择,UI 不显示 ASN)
## 构建
```
# Core + CLI
cd flowarden
cargo build --release
# Desktop UI
cd ../flowarden-ui
dotnet build Flowarden.Ui.sln -c Release
```
## 运行
### CLI
```
cd flowarden
# 列出 interfaces
cargo run -p flowarden --release -- devices
cargo run -p flowarden --release -- devices --format json
# 实时抓包(5s 采样)
cargo run -p flowarden --release -- capture --device en0 --duration 5
# 离线 pcap
cargo run -p flowarden --release -- capture --read ./sample.pcap --format json
# BPF + pcap 输出
cargo run -p flowarden --release -- capture --device en0 --duration 10 \
--bpf "tcp" --pcap-out ./capture.pcap
```
### 桌面
```
# 优先使用 PATH 上或 UI 启动配置旁边的 release core binary。
cd flowarden && cargo build --release -p flowarden
cd ../flowarden-ui && dotnet run --project src/Flowarden.Ui -c Release
```
UI 可以启动或附加到本地 `flowarden core` 常驻进程。首选项位于 OS 应用数据目录(`Flowarden/preferences.json`)下。
## 投影一览
| 界面 | 内容 |
| --- | --- |
| Overview 快照 | 总计、时间线、热门主机/服务/连接、目标、TCP 切片、信号 |
| Inspect | 过滤后的连接行(进程、SNI、方向、通过主机映射的国家) |
| Control | Source、BPF 存储、启动/停止/暂停/恢复、信号策略 |
| CLI JSON | 在相同策略控制下丰富的 Top + 可选发现 |
## 行为信号
信号在活动捕获期间(或离线 pcap 完成时)在常驻核心(`SignalEngine`)中产生。UI **Signals** 页面显示与 Overview 投影相同的列表;syslog(如果已启用)将每个新信号导出为带有 `cat=signal` 的 CEF。
策略来自设置(阈值、监视 / 已知恶意列表)或 CLI(`--data-threshold`、`--watch`、`--known-bad`)。除非 control API 另有设置,否则 DPI 风格的检测器使用内置默认值。实时检测器会在冷却后重新触发,因此不会刷屏;离线发现通常每次捕获会话只触发一次。
| 类型 | 含义 | 默认触发条件(约) |
| --- | --- | --- |
| `DataThresholdExceeded` | 会话字节总数越过配置的上限 | `50_000_000` 字节(设置 / CLI 可以降低此值) |
| `WatchedEntityTransmitted` | 监视列表上的主机、服务或进程显示有流量 | 列表条目的子字符串匹配;可选前缀 `service:`、`process:`、`sni:` |
| `KnownBadHostTransmitted` | 与监视相同的匹配方式,针对已知恶意列表 | 相同的模式规则;严重性更高 |
| `UnidirectionalLargeTransfer` | 一个连接主要是出站且流量大 | 出站 ≥ `50_000_000` 字节且 出/入 ≥ `20`(用于批量上传 / 可能的数据外泄的启发式规则) |
| `LongIdleTcpConnection` | 已建立的 TCP、陈旧、安静、数据量少 | 存在时间 ≥ 1 小时,无 payload ≥ 10 分钟,总字节数 ≤ 64 KiB |
| `UnauthorizedP2pOrProxy` | 端口 / 进程 / SNI 看起来像 P2P 或代理工具 | 例如端口 1080、3128、6881–6889、7890、9050;进程名如 Clash、qbittorrent、tor;狭窄的 SNI 模式 |
### 匹配列表的工作原理
- 监视和已知恶意接受设置中的逗号分隔的 token。
- 裸 token 通过不区分大小写的子字符串匹配主机(IP 或名称)和相关标签。
- 当您关心类型时,首选显式形式:`service:https`、`process:Chrome`、`sni:cdn.example`。
- 进程信号需要连接上的进程归属(OS 查是尽力而为且异步的)。
### 如何触发每种类型
**数据阈值** — 将阈值设置为一个小数字(例如 `1` 或 `1000`),应用,然后实时捕获几秒钟或重放任何 pcap。最容易产生的信号。
**监视的主机 / 服务 / 进程** — 将您实际要通信的主机(或 `service:https`,或 `process:<浏览器名称>`)放入监视列表,应用,产生流量。预期 `pivot_kind` 为 `host`、`service` 或 `process`。
**已知恶意** — 与监视相同,在已知恶意列表上。用于验证严重性和 UI 处理,而不是作为威胁情报源。
**单向大文件传输** — 默认值特意设置得很高。可以在安静的路径上上传大文件,或者在测试时通过 control 策略降低 `dpi_exfil_min_bytes` / `dpi_exfil_ratio`。需要出现在投影的热门连接集中的连接。
**长期空闲 TCP** — 默认值需要小时级的空闲。要快速检查,请在策略中降低 `dpi_idle_min_age_secs` 和 `dpi_idle_silence_secs`,保持几乎静默的已建立 TCP,等待超过缩短的时间窗口。需要在投影中有 TCP 行(Inspect TCP 路径)。
**P2P / 代理** — 运行进程列表知道的程序(Clash、Transmission 等),或在列出的代理/P2P 端口上打开流量。进程名命中和端口命中是独立的。允许列表条目(`dpi_p2p_allow`)会抑制您认为合法的匹配。
### CLI 冒烟测试
```
cd flowarden
cargo run -p flowarden --release -- capture \
--read ./flowarden-core/tests/fixtures/offline_mixed_ethernet.pcap \
--data-threshold 1 \
--watch service:https \
--format json
```
发现在 UI 下显示为相同的类型。对于引擎的单元级覆盖:
```
cargo test -p flowarden watched_ offline_finding
```
### Syslog
启用 syslog 后(`--syslog-target` 或设置),每个信号都是一行 RFC5424,其 MSG 为 CEF。签名 ID 等于类型字符串;扩展 `cat=signal` 将它们与流行(`cat=traffic`)区分开来。
### 值得了解的限制
- 只有进入当前投影 Top / TCP 切片的实体才能触发主机/服务/连接检测器。
- 冷却时间:阈值(实时)大约 30 秒,每个监视/恶意实体 20 秒,DPI 类型 60 秒。
- 开始新的捕获会清除信号会话。
- 仅 UI 的后备阈值(当核心未返回信号时)**不会**发送到 syslog;导出时请信任核心列表。
## 与 Sniffnet 的关系
Flowarden **灵感来自 [Sniffnet](https://github.com/GyulyVGC/sniffnet)** —— 其捕获和聚合模型、排名视图、目标地图、进程提示和紧凑的缩略图监控塑造了产品目标。
它**不是分支或重新换皮**。Sniffnet 是一个精致的单进程 Rust 桌面应用(iced)。Flowarden 以不同的架构重新实现了监控理念:一个无头的 Rust 核心,一个基于本地 gRPC 的 Avalonia UI,以及一个共享相同投影契约的 CLI。
| | Sniffnet | Flowarden |
| --- | --- | --- |
| 形式 | 集成的 iced GUI | Avalonia UI + 常驻 Rust 核心 |
| IPC | 进程内 | 本地 gRPC(control / projection) |
| CLI | 有限 | 一流的 JSON/表格捕获输出 |
| 长时间运行 | 扎实的默认值 | 显式的常驻边界 + tick 窗口 |
| 丰富信息 | 国家、ASN、进程、地图 | 国家、进程、**TLS SNI**、地图标记;**UI 中隐藏 ASN**(产品选择) |
| 警报 | 通知 / webhook | 信号 + 策略 + **行为检测器**(数据外泄 / 空闲 TCP / P2P-代理) |
| Syslog | — | **RFC5424 + CEF** 信号 + 流量导出(CLI + 设置) |
| 深度协议 / DPI | 超出参考产品的范围 | 现在支持轻量级 DPI + 启发式方法;**计划支持更深度的协议 DPI** |
**在以下情况使用 Flowarden:** 您需要核心/UI 分离、可脚本化的捕获输出、面向 Inspect 的过滤和转入、SNI/进程上下文、syslog 集成或可扩展的 DPI 路径。
感谢 GyulyVGC 和 Sniffnet 社区提供的参考产品,并证明了这类桌面监控器在实践中运行良好。
## 路线图
- **更深度的 DPI** — 超越 SNI + 行为启发式方法:更丰富的应用层解析和投影字段,而不会成为完整的 IDS。
- 更深度的会话/取证视图和持续的 UX 优化仍然是次要的,优先保证稳定的核心 + UI 契约。
## 许可证
Apache License 2.0(见仓库中的许可证文件,如果有)。
GeoLite2 数据(如果您使用它)受 MaxMind 的条款和署名要求约束。
标签:Avalonia, GitHub搜索工具, IP 地址批量处理, Python工具, Rust, 可视化界面, 桌面应用, 网络流量分析, 网络流量审计, 通知系统