DavidHavoc/ayaFlow

GitHub: DavidHavoc/ayaFlow

基于 eBPF 和 Rust 构建的高性能网络流量分析器,以极低开销为 Kubernetes 集群提供内核原生的节点级网络可见性。

Stars: 18 | Forks: 0

# ayaFlow 一个用 Rust 编写的、基于 eBPF 的高性能网络流量分析器。设计为在 Kubernetes 中以无 Sidecar DaemonSet 方式运行,以极低的开销提供节点级全网流量的内核原生可见性。 基于 [Aya](https://aya-rs.dev/) eBPF 框架构建。 ## 架构 ``` Kernel: NIC --> TC Hook (eBPF, ingress + egress) --> RingBuf | Userspace: Tokio Event Loop / | \ DashMap SQLite Axum HTTP (live stats) (history) (API + /metrics) ``` - **内核侧**:挂载在入口和出口的 TC(流量控制)分类器解析 Ethernet/IPv4/TCP/UDP 头部,并将轻量级的 `PacketEvent` 结构体(带有方向标签)推送到共享环形缓冲区。 - **用户空间**:一个异步 Tokio 代理轮询环形缓冲区,在 DashMap 中维护实时连接状态,将事件持久化到 SQLite,并通过 REST API 暴露 Prometheus 指标。 ## 功能特性 - **eBPF 原生捕获** —— 无需 libpcap,无需特权 sidecar。直接挂钩到内核的流量控制子系统。 - **无 Sidecar DaemonSet** —— 每个节点一个 Pod,而不是每个应用 Pod 一个。 - **实时监控** —— 通过 REST API + WebSocket 流式传输的实时仪表板。 - **持久化历史** —— SQLite 存储,支持可配置的数据保留和聚合。 - **深度 L7 检测** —— 可选的 TLS SNI 和 DNS 查询提取,以实现对加密流量的域名级可见性。 - **Prometheus /metrics** —— 原生导出器,支持 `ayaflow_packets_total`、`ayaflow_bytes_total`、`ayaflow_active_connections`、`ayaflow_domains_resolved_total`、`ayaflow_deep_inspect_packets_total`。 - **IP 白名单** —— 根据源 CIDR 限制 API/仪表板访问。 ## 前置条件 - **Rust**:Stable + nightly 工具链 - **bpf-linker**:`cargo +nightly install bpf-linker` - **Linux 内核**:>= 5.8 且支持 BTF(用于 eBPF) - **Capabilities**:`CAP_BPF`、`CAP_NET_ADMIN`、`CAP_PERFMON` ## 快速开始 ### 构建 ``` # 安装 bpf-linker (一次性) cargo +nightly install bpf-linker # 构建所有内容 (eBPF + userspace) cargo xtask build ``` ### 运行 ``` # eBPF attachment 需要 root 权限 sudo ./target/debug/ayaflow --interface eth0 ``` ### 验证 ``` curl http://localhost:3000/api/health curl http://localhost:3000/metrics ``` ## CLI 选项 | 标志 | 描述 | 默认值 | |------|-------------|---------| | `-i, --interface` | 挂载 eBPF 的网络接口 | `eth0` | | `-p, --port` | API 服务器端口 | `3000` | | `--db-path` | SQLite 数据库路径 | `traffic.db` | | `--connection-timeout` | 陈旧连接清理时间(秒) | `60` | | `--data-retention` | 自动删除早于此时间的包(秒) | 禁用 | | `--aggregation-window` | 每个窗口聚合事件的时间(秒) | `0` (关) | | `--allowed-ips` | 允许访问 API 的 CIDR | 不限制 | | `-c, --config` | YAML 配置文件路径 | - | | `-q, --quiet` | 抑制非错误日志 | `false` | | `--deep-inspect` | 启用 DNS + TLS SNI 域名提取 | `false` | ## Kubernetes 部署 作为 DaemonSet 部署(见 `k8s/daemonset.yaml`): ``` kubectl apply -f k8s/daemonset.yaml ``` 该 DaemonSet 使用 `hostNetwork: true` 并挂载 `/sys/fs/bpf`。默认包含 Prometheus 抓取注解。 ### 资源建议 ``` resources: requests: memory: "32Mi" cpu: "50m" limits: memory: "128Mi" cpu: "500m" ``` ## API 参考 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/api/health` | GET | 健康检查及基本计数器 | | `/api/stats` | GET | 运行时间、吞吐量、连接数 | | `/api/live` | GET | 按数据包计数排名的前 50 个活跃连接 | | `/api/history?limit=N` | GET | 从 SQLite 获取的最近数据包(最多 1000 条) | | `/api/stream` | WS | 每 1 秒推送统计信息的 WebSocket | | `/metrics` | GET | Prometheus 文本格式指标 | ## 项目结构 ``` ayaflow-common/ # Shared types (no_std, used by both kernel and userspace) ayaflow-ebpf/ # eBPF kernel program (TC classifier) ayaflow/ # Userspace agent (Aya loader + Tokio + Axum) xtask/ # Build orchestration (cargo xtask) k8s/ # Kubernetes DaemonSet manifest ``` ## 性能与资源占用 在最小化 VM(Ubuntu 24.04, 2 vCPU, 2 GB RAM)上测得: | 指标 | 数值 | |--------|-------| | 用户空间 RSS(稳定状态) | ~33 MB | | eBPF 程序 (xlated) | 784 B | | eBPF 程序 (JIT 编译后) | 576 B | | eBPF 程序 memlock | 4 KB | | EVENTS 环形缓冲区 | 256 KB | | PAYLOAD_EVENTS 环形缓冲区 | 256 KB(仅在开启 `--deep-inspect` 时使用) | | 环形缓冲区 memlock | ~270 KB(深度检测时 540 KB) | | 内存随时间增长 | 未观察到(RSS 稳定) | 通过 `bpftool` 验证加载的 eBPF 分类器: ``` $ sudo bpftool prog show name ayaflow 430: sched_cls name ayaflow tag 0dabf78b3d068075 gpl loaded_at 2026-02-16T16:38:12+0100 uid 0 xlated 784B jited 576B memlock 4096B map_ids 76 ``` ## 测试环境 - **操作系统**:Ubuntu 24.04 LTS (aarch64) - **内核**:6.x 且支持 BTF - **硬件**:2 vCPU, 2 GB RAM (Lima VM) - **Rust**:nightly 工具链 + `bpf-linker` ## 许可证 本项目根据以下任一许可证授权: - [Apache License, Version 2.0](LICENSE-APACHE) - [MIT license](LICENSE-MIT) 您可选择其中之一。 eBPF 内核组件(`ayaflow-ebpf`)采用 GPL 许可,以确保与 Linux 内核验证器的兼容性。
标签:Axum, Aya, Beacon Object File, DaemonSet, DNS 监控, Docker镜像, IP 地址批量处理, L7 深度包检测, Linux 内核, Prometheus 监控, REST API, Ring Buffer, Rust, Sidecarless, SQLite, TC Hook, TLS SNI 提取, Tokio, WSL, 二进制发布, 内核级可观测性, 可视化界面, 子域名突变, 开源工具, 流量可视化, 网络安全, 网络流量分析, 网络流量审计, 自定义请求头, 通知系统, 隐私保护