有些项目起于周密规划。skbx 却起于一位开发者掉进 Linux 网络栈的兔子洞,而且玩得比预期更开心。他问了一个简单的问题:这个数据包到底去了哪?

一个数据包可能穿越网络命名空间、路由决策、Netfilter、流量控制、XDP 程序、隧道、克隆、拷贝,还有丢弃路径。在某个接口上抓包也许完全正确,却只展现了整段旅程的一小截。

打开网易新闻 查看精彩图片

他想看到更完整的旅程。还想把看到的东西存下来,事后不用 root 权限就能回放,并且能知道抓包过程有没有遗漏观测。于是 skbx 诞生了,一个用 Rust 和 CO-RE eBPF(一次编译到处运行的扩展伯克利包过滤器)构建的 Linux 数据包路径飞行记录器

实时抓包时,skbx 观测内核网络函数,写出一条只追加的 JSONL 证据流。事后可以重放并检查这条证据流,无需再加载 eBPF 程序。实时流量 → CO-RE eBPF 观测 → 有界 traceq JSONL → 重放 → 路由模式 → 解释事件。

它不是为了替代 tcpdump 或 Wireshark。那些工具当问题涉及抓包点的数据包字节和协议时非常出色。skbx 关注的是数据包经过本地 Linux 内核的路径。这个项目也并非第一个追踪网络数据包的同类工具,它明确受到 pwru 的启发,后者展示了广泛 eBPF 数据包追踪的强大之处。

开发者特别想探索的是,实时终端停止滚动之后的证据。实时追踪很有用,但事件处理常常在特权会话结束后才继续。可能有其他人需要检查这份抓包数据,可能要与一次成功请求做对比,或者需要在 bug 报告里引用确切的事件。自动化或 AI 系统可能需要结构化的输入,但不该被允许捏造从未被观测到的东西。

所以 skbx 原生的数据流 traceq 带有一个信封:capture_start、event、event… capture_end。每个事件都分配一个稳定句柄,回放将有序事件分组为有界路由模式,并分配自己的句柄。页脚和事件一样重要:它记录停止原因,以及核预留失败、追踪递归遗漏、读取失败、用户态解码与充实失败、输出失败等可靠性计数。如果页脚缺失,产物就不完整;如果追踪丢失了观测,不确定性就始终附着在结果上。

开发者喜欢这个特性,因为追踪软件本身也是软件。它不该默默地装作全知全能。