网络排障工具 PWRU
pwru 是 cilium 推出的基于 eBPF 开发的网络数据包排查工具,它提供了更细粒度的网络数据包排查方案。本文将介绍 pwru 的使用方法和经典场景,并介绍其实现原理。
安装部署
部署要求
pwru 要求内核代码在 5.5 版本之上,--output-skb 要求内核版本在 5.9 之上,并且要求内核开启以下配置:
| Option | Note |
|---|---|
| CONFIG_DEBUG_INFO_BTF=y | Available since >= 5.3 |
| CONFIG_KPROBES=y | |
| CONFIG_PERF_EVENTS=y | |
| CONFIG_BPF=y | |
| CONFIG_BPF_SYSCALL=y |
使用方法
|
|
案例演示
下图案例演示了 pwru 展现出快速定位出数据包被 iptables 规则 drop 掉的原因:
在不设置 iptables 规则之前:
添加了 iptables 规则之后
|
|
可以看到在 nf_hook_slow 函数后发生了变化:
我们可以看到数据包在 nf_hook_slow 判决为 NF_DROP,调用了 kfree_skb
|
|
原理实现
pwru 本质上是向 kprobe 注册了一些 eBPF code,根据 pwru 传入的参数可以更新 eBPF Map,改变限制条件,从而更新输出。
比如在 FilterCfg 里面制定了过滤的 IP 地址和协议等条件
|
|
会根据 pwru 传入的参数更新这个 eBPF Map
|
|
在 eBPF code 中,可以看到会读取配置 bpf_map_lookup_elem,然后进而执行真正的 filter:
|
|
可以看到,这里通过 bpf_perf_event_output 将过滤结果以 Perf event 传递上来。
|
|
Linked Mentions
-
No backlinks found.