基于 Rust + aya 的家庭网络流量分析工具,目标是回答“流量花在哪里”。
- 指定网卡
ingress/egress流量统计(按IP/proto/port聚合)。 - 通过 eBPF
RingBuf上报 DNS 报文片段,在 userspace 解析qname并统计查询次数。 - 在 userspace 解析 DNS 响应并维护
ip -> domainTTL 映射,将流量归因到域名。 - 持久化到 SQLite(WAL),支持
Top IP / Top LAN IP / Top Domain / Top DNS查询。 - 支持
Top SNI / Domain Detail / Attribution Coverage / DNS Cache Inspect / DoHDoT查询。 - 支持采集健康度观测(
collector-health):flow map 占用、老化回收、ringbuf 丢事件。 - 支持历史数据清理(
prune)。
traffic-analyzer/
├── Cargo.toml # workspace
├── README.md
├── traffic-analyzer-common/ # eBPF 与 userspace 共享结构
├── traffic-analyzer-ebpf/ # tc ingress/egress eBPF 程序
└── traffic-analyzer/ # userspace CLI + SQLite 聚合
- Linux 内核支持 eBPF + tc
clsact。 - 运行用户具备 root 或等效权限。
- 建议关闭或减少 DNS over HTTPS / DNS over TLS,否则域名归因会下降。
- 若 DB 文件由
sudo生成,首次查询建议使用可写权限运行一次(或调整文件属主),以完成自动建表/迁移。 - 默认 DB 路径为
/var/lib/traffic-analyzer/traffic-analyzer.db,程序会自动创建父目录。
最简单用法(默认 DB 路径已内置):
sudo ./target/release/traffic-analyzer run --iface eth0如果你还没编译过,直接一条命令完成构建并启动:
./hack/build-single.sh && sudo ./target/release/traffic-analyzer run --iface eth0采集启动后,另开一个终端看实时面板:
./target/release/traffic-analyzer ui --iface eth0详细命令(构建、run 参数、全部 top-* / 诊断命令)见:
docs/USAGE.md
- 聚合周期:默认每
1s采集 flow map 增量并触发一次聚合/落库。 - 事件拉取:默认每
100ms高频拉取 DNS/TLS ringbuf(--event-poll-millis可调),降低突发丢事件。 - 聚合粒度:按分钟键(
ts_minute)聚合到flow_1m_5t与dns_1m。 - 写入模式:采集线程异步投递批次,后台写线程执行 SQLite
WAL+ 事务upsert。 - 保留策略:通过
prune命令保留最近 N 天数据。 - 退出行为:默认支持
Ctrl+C优雅退出,退出前会执行最终一次增量采集并等待写线程完成落库。 - 新增表:
sni_1m(SNI 计数)和dns_cache_1m(缓存行为指标)。 - 流量表使用五元组:
flow_1m_5t记录src_ip/src_port/dst_ip/dst_port/proto/direction/domain/bytes/packets。 - 兼容迁移:启动时会自动检测旧版
flow_1m(peer_ip/peer_port)表并一次性迁移到flow_1m_5t,迁移状态保存在meta_kv。 - 查询连接策略:查询命令优先使用可写连接(便于自动建表/迁移),若命中只读错误会自动降级为只读连接。
- eBPF 程序仅做轻量工作:识别 DNS UDP 包、上报
DnsEvent,并持续维护FLOW_STATS。 - DNS 解析全部在 userspace 完成:包括 query 提取、answer 解析(A/AAAA)和 TTL 处理。
- 为兼顾 verifier 稳定性和开销,eBPF 采用分档固定长度抓取(
12/16/24/32/48/64/96字节)。 - 若
captured_len不足以覆盖完整 DNS 名称或答案,当前条目会被跳过,不会写入错误域名。 - SNI 解析为 best-effort:仅解析 TLS ClientHello 中明文 SNI,受抓包截断、连接复用和 ECH 影响。
- 域名归因是近似值,
CDN共享 IP 会产生歧义。 DoH/DoT场景下无法直接看到明文qname。- 当前支持 IPv4/IPv6 基础 L3/L4 解析;复杂 IPv6 扩展头场景仍可能漏计。
- 当前实现优先稳定和低开销,未做进程级归因。
top-dohdot为可疑流量识别:DoH 基于已知解析器域名列表,DoT 基于853端口统计。top-ip统计的是“对端 IP”(ingress 用src_ip,egress 用dst_ip);top-lan统计的是“本机/内网侧 IP”(ingress 用dst_ip,egress 用src_ip)。
- 增加
exact/ambiguous/unknown更细粒度归因标签。 - 增加设备维度(内网 IP/MAC)日榜。
- 输出 Prometheus 指标与 Grafana 大盘。
- 新增
1h聚合表,降低长期存储体积。