jdtec-ex/flowarden-ex

GitHub: jdtec-ex/flowarden-ex

Flowarden 是一款基于 Rust + Avalonia 的跨平台桌面网络流量监控工具,支持实时抓包与 pcap 重放,提供流量排名、进程归属、目标地图及行为信号告警等功能。

Stars: 3 | Forks: 0

# Flowarden [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/jdtec-ex/flowarden-ex/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) [![Status](https://img.shields.io/badge/status-Public_Beta-yellow.svg)](#) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg](#supported-platforms) [![Rust](https://img.shields.io/badge/Rust-stable-orange.svg)](flowarden/) [![.NET](https://img.shields.io/badge/.NET-8-512BD4.svg)](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 | | --- | --- | | ![Overview](https://static.pigsec.cn/wp-content/uploads/repos/cas/3f/3fb9531e71596c8b61ff54e2ad7698b8e8232c592c81aa8213aba5b93430a56b.png) | ![Source](https://static.pigsec.cn/wp-content/uploads/repos/cas/13/13db411fd70bf3e0e23eaac9880c1c9ee49cc1d3b14520b6deee00c4139863b1.png) | | Inspect | Signals | | --- | --- | | ![Inspect](https://static.pigsec.cn/wp-content/uploads/repos/cas/cd/cd4657e6da9d43ee11747cff22f9dae7270e9d11a8b0dac1b9d90a23b959119a.png) | ![Signals](https://static.pigsec.cn/wp-content/uploads/repos/cas/c4/c45fc3837aa34d1a418ebde75fac9c4adfc775e590c9c80afc2fd785a574473e.png) | | Settings | Thumbnail | | --- | --- | | ![Settings](https://static.pigsec.cn/wp-content/uploads/repos/cas/4d/4d92dbf3e3b8d159a60fa23a7e4a29700523b44222c3f7012fb96ce48f135777.png) | ![Thumbnail](https://static.pigsec.cn/wp-content/uploads/repos/cas/60/60a9219c8f31b98eafe3c5d2b128c1964fa0d5c617cf34ac3944034a6f2cf1ee.png) | ## 功能 ### 捕获与分析 - 从选定接口进行实时捕获,或离线重放 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, 可视化界面, 桌面应用, 网络流量分析, 网络流量审计, 通知系统