如何快速上手pwru:10分钟学会Linux内核网络调试
·
如何快速上手pwru:10分钟学会Linux内核网络调试
pwru(Packet, where are you?)是一款基于eBPF技术的Linux内核网络调试工具,它能帮助开发者追踪网络数据包在内核中的流转路径,轻松定位复杂的网络连接问题。无论是排查丢包原因、分析转发逻辑还是调试防火墙规则,pwru都能提供精准的内核级视角,让网络调试不再盲人摸象。
🌟 为什么选择pwru?
传统的网络调试工具往往停留在用户态,难以深入内核黑盒。而pwru通过eBPF技术直接在 kernel 空间进行追踪,具有以下优势:
- 细粒度追踪:可观察数据包在内核函数间的完整路径
- 低侵入性:无需修改内核源码或重启系统
- 强大过滤:支持pcap过滤语法和内核函数级筛选
- 多场景支持:适用于物理机、容器和Kubernetes环境
pwru实时追踪网络数据包演示
📋 准备工作:系统要求与环境配置
内核版本要求
- 最低支持:Linux 5.3+
- 推荐版本:5.18+(支持kprobe-multi后端,性能更佳)
必备内核配置
通过 zgrep <选项> /proc/config.gz 验证以下配置是否启用:
| 配置选项 | 说明 |
|---|---|
| CONFIG_DEBUG_INFO_BTF=y | 提供内核类型信息(5.3+可用) |
| CONFIG_KPROBES=y | 支持内核动态探针 |
| CONFIG_PERF_EVENTS=y | 性能事件子系统支持 |
| CONFIG_BPF_SYSCALL=y | BPF系统调用支持 |
快速安装debugfs
如果系统未挂载debugfs,执行以下命令:
mount -t debugfs none /sys/kernel/debug
⚡ 三种安装方式,5分钟搞定
方式1:直接下载二进制(推荐)
从项目发布页面获取预编译可执行文件:
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/pw/pwru
cd pwru
# 下载对应架构的二进制文件(以x86_64为例)
wget https://github.com/cilium/pwru/releases/latest/download/pwru-amd64 -O pwru
chmod +x pwru
方式2:Docker一键运行
docker run --privileged --rm -t --pid=host \
-v /sys/kernel/debug/:/sys/kernel/debug/ \
cilium/pwru pwru --output-tuple 'host 1.1.1.1'
方式3:Kubernetes节点部署
使用项目提供的脚本快速部署:
# 使用 contrib/scripts 目录下的部署脚本
contrib/scripts/pwru-on-k8s-node --node=your-node-name --args="--output-tuple 'host 1.1.1.1'"
🚀 入门实战:3个常用调试场景
场景1:追踪特定IP的网络包
# 追踪目标IP为1.1.1.1的所有数据包
./pwru --output-tuple 'host 1.1.1.1'
场景2:定位丢包原因
# 追踪被DROP的ICMP包,显示调用栈
./pwru --output-stack 'icmp and host 8.8.8.8'
场景3:调试NAT后的流量
# 追踪经过NAT的流量,保持跨连接追踪
./pwru --filter-track-skb 'dst port 80'
📝 核心参数解析
| 参数 | 作用 | 示例 |
|---|---|---|
--output-tuple | 显示L4网络元组(源/目的IP:端口) | --output-tuple |
--output-stack | 显示内核调用栈 | --output-stack |
--filter-func | 按内核函数名过滤 | --filter-func=".*iptable.*" |
--output-skb | 打印完整skb结构 | --output-skb |
--output-json | JSON格式输出便于解析 | --output-json |
📚 进阶资源
- 官方文档:docs/vagrant.md
- 示例脚本:contrib/scripts/pwru-on-k8s-node
- 源码构建:执行项目根目录下的
make命令(需Go 1.16+和LLVM 12+)
💡 小贴士
- 首次使用建议从简单过滤规则开始,逐步添加复杂条件
- 使用
--output-limit-lines N限制输出行数,避免信息过载 - 结合
grep和jq处理输出:./pwru --output-json | jq '.func' - 内核版本低于5.18时,添加
--backend=kprobe参数
通过pwru这款强大的eBPF网络调试工具,你可以像侦探一样追踪每个数据包的内核之旅。无论是开发、运维还是网络排障,pwru都能让你轻松看透Linux内核的网络黑盒,成为你的必备调试利器!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)