Kestrel 通过 eBPF 代理跟踪内核事件(进程执行、文件访问、网络连接),并将其流式传输到 SvelteKit Web 应用——该应用渲染实时活动流、进程树、主机概览,并提供基于规则的告警引擎。完整的产品/架构文档参见 SPEC.md,运维指南参见 AGENTS.md。
eBPF 生态系统以后端、CLI、Kubernetes Operator 为主要形态。Falco——CNCF 已毕业的业界标准——众所周知地不自带任何 UI。从“内核输出丰富的数据”到“人类能够真正读懂”之间的空白地带,正是本项目立足的全栈甜区。v1 刻意设计为单主机(非 Kubernetes)、仅观测(不强制执行)。
flowchart TB
subgraph host["Linux host · VM in dev, VPS in prod · kernel ≥ 5.8"]
direction TB
probes["eBPF probes (C)<br/>execve · openat · connect"]
agent["Go agent — cilium/ebpf<br/>decode · enrich · batch"]
ingest["/api/ingest<br/>Zod-validated at the boundary"]
rules["rule engine"]
hub["live hub"]
db[("Postgres<br/>events · rules · alerts")]
dash["SvelteKit dashboard<br/>live feed · tree · overview"]
probes -- "ring buffer" --> agent
agent -- "HTTP POST · JSON (Zod contract)" --> ingest
ingest --> db
ingest --> rules
ingest --> hub
hub -- "SSE" --> dash
end
关键的部署约束:代理需要真实内核,因此无法运行在 Cloudflare Workers 上(V8 隔离环境,没有内核)。v1 将代理 + 应用 + Postgres 共置于同一台主机。参见 SPEC.md §2。
阶段 3——进行中。阶段 2 的必需项(实时活动流、进程树、主机概览)已完成,并在虚拟机中进行了实时验证:eBPF 代理(execve + exit,cilium/ebpf)跟踪真实内核并将事件流式传输到应用,启动时以 /proc 快照为进程树建立初始数据。阶段 3 目前进展:代理新增了文件打开(openat)与出站连接(security_socket_connect)探针(编译已验证;负载测试待虚拟机中进行),网络拓扑图(8.3) 已完成——一个 D3 力导向的进程↔目标图。接下来:敏感文件监控(8.4)以及规则引擎与告警(8.5)。探针相关工作始终在开发虚拟机中进行,绝不在宿主机上进行。
在少数几个视图上做深,胜过浅尝辄止的广度——六个精炼视图,按优先级顺序构建(必需项优先)。
execve 探针 → 环形缓冲区 → cilium/ebpf → /api/ingest (在虚拟机中)exit 探针 + /proc 快照 · 进程树 · 主机概览nixosTest 内核集成测试 · GitHub Actions CIcd app
pnpm install
pnpm dev # http://localhost:5173
应用运行在宿主机上;代理则运行在开发虚拟机中,将事件发送给应用。若想在无代理的情况下看到有数据的实时流,可开启合成数据生成器:KESTREL_SYNTHETIC=1 pnpm dev。
pnpm check # svelte-check (types)
pnpm test # vitest — schema + ingest unit tests
pnpm build # production build (adapter-node)
开发/测试数据库采用 PGlite(Postgres 编译为 WASM):无需原生编译、无需独立服务器,与生产 Postgres 使用相同的 SQL 方言。数据持久化到 app/kestrel-pgdata/(已被 git 忽略);测试则使用临时的内存数据库。
# stream events (leave running in one terminal)
curl -N http://localhost:5173/api/stream
# post an event (in another) — appears live in the stream and the browser
curl -X POST http://localhost:5173/api/ingest -H 'content-type: application/json' \
-d '[{"host":"demo","type":"exec","pid":42,"comm":"bash","cmdline":"bash -i"}]'
三个层级,分别对应每类 bug 所在之处(完整细节见 SPEC.md §6–§7):
fast-check 用对抗性/畸形事件驱动 Zod 事件契约,并断言规则引擎的不变式:无误匹配、判定结果确定、畸形输入在边界即被拒绝。目前的测试覆盖:Vitest 单元测试(schema、ingest、overview、process tree、network graph)+ 代理的 procscan 解析器以及事件 decode 辅助函数。在 /app 目录下运行 pnpm test,在 /agent 目录下运行 go test ./...。
SPEC.md §8.11)。SPEC.md §8.10)。cilium/ebpf vs libbpfgo——纯 Go,CGO_ENABLED=0,bpf2go 工作流。SPEC.md §10)。SPEC.md §6)。| 路径 | 说明 |
|---|
/app | SvelteKit 应用——事件 schema、采集、SSE 中心、仪表盘视图。已构建且可运行。 |
/agent | Go 用户态代理 + eBPF C 探针(execve/exit/openat/connect)+ /proc 快照。已构建;仅在虚拟机中运行。 |
/infra | Nix 开发虚拟机(已构建)+ nixosTest、Terraform/libvirt 预置(阶段 4)。 |
SPEC.md | 权威的产品与架构规范。 |
| 视图 | 它回答的问题 | 状态 |
|---|
| 实时活动流 (8.1) | 现在正在发生什么? | ✅ 已构建 |
| 进程树 (8.2) | 谁派生了谁? | ✅ 已构建 |
| 主机概览 (8.6) | 一屏掌握状态? | ✅ 已构建 |
| 网络拓扑图 (8.3) | 这台主机在与谁通信? | ✅ 已构建 |
| 敏感文件监控 (8.4) | 是否有进程触碰了重要文件? | ◻️ 已规划 |
| 告警与规则 (8.5) | 当有可疑迹象时通知我。 | ◻️ 已规划 |