可还曾记得 skbtracer 内核网络包跟踪工具?

这是我刚学习 eBPF 不久就开发的工具,不过更多时候是向 skbtracerpwru 这两个网络包跟踪工具项目学习。

现在,我持续参与 pwru 的维护,为其添砖加瓦、提升性能。

skbtracer

skbtracer 在开发完毕后就没有继续维护了,所以导致其中有不少使用的 kprobe 过期了。

因而,我将它存档了。

skbtracer-iptables

源代码: github.com/Asphaltt/skbtracer-iptables

不过,有朋友反馈说,其中关于 iptables 的功能挺有用的。

所以,我花了一个周末的时间,将其中 iptables 相关的功能抽离出来,成为了一个独立的项目继续维护。

在开发 skbtracer-iptables 的时候,的确发现所使用的 kprobe 函数 ipt_do_tablesip6t_do_tables 在 5.16 内核里有变更;因而,在 eBPF 代码里准备了两段代码,并在 Go 代码里判断一下当前的内核版本,按需选用 kprobe bpf prog。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// >= 5.16

SEC("kprobe/ipt_do_table")
int BPF_KPROBE(k_ipt_do_table, struct xt_table *table,
    struct sk_buff *skb,
    const struct nf_hook_state *state)
{
    return __ipt_do_table_in(ctx, skb, state, table);
};

// < 5.16

SEC("kprobe/ipt_do_table")
int BPF_KPROBE(k_ipt_do_table_old, struct sk_buff *skb,
    const struct nf_hook_state *state,
    struct xt_table *table)
{
    return __ipt_do_table_in(ctx, skb, state, table);
}

与此同时,将 Go 代码里使用的 eBPF 库从 github.com/dropbox/goebpf 改为 github.com/cilium/ebpf

Go 代码风格上,则直接参考了 pwru 的写法。

One more thing

准备开发一个基于 eBPF 的 iptables TRACE 的替代工具,一个比 skbtracer-iptables 更强大的 iptables 网络包跟踪工具。

万分期待。