pwru(packet, where are you?)是一款基于 eBPF 的 Linux 内核网络数据包追踪工具,具备高级过滤能力。它允许对内核状态进行细粒度检查,从而帮助调试网络连接问题,例如追踪数据包在何处被丢弃、分析网络路径等。
!logo
以下示例展示了在添加 iptables 规则后,curl 请求的数据包被丢弃的位置:
!demo
man 7 pcap-filter),可按内核函数名、网络接口、网络命名空间等多维度过滤kprobe 和 kprobe-multi 两种追踪后端,可根据内核版本自动选择--output-skb 选项:需内核版本 ≥ 5.9--backend=kprobe-multi 选项:需内核版本 ≥ 5.18pwru 可选依赖 debugfs,需挂载至 /sys/kernel/debug。若该目录为空,可通过以下命令挂载:
bashmount -t debugfs none /sys/kernel/debug
需启用以下内核配置选项,可通过 zgrep $OPTION /proc/config.gz 验证是否启用:
| 选项 | 后端 | 说明 |
|---|---|---|
| CONFIG_DEBUG_INFO_BTF=y | 两者均需 | 自 5.3 内核起可用 |
| CONFIG_KPROBES=y | 两者均需 | - |
| CONFIG_PERF_EVENTS=y | 两者均需 | - |
| CONFIG_BPF=y | 两者均需 | - |
| CONFIG_BPF_SYSCALL=y | 两者均需 | - |
| CONFIG_FUNCTION_TRACER=y | kprobe-multi | 需 /sys/kernel/debug/tracing/available_filter_functions |
| CONFIG_FPROBE=y | kprobe-multi | 自 5.18 内核起可用 |
pwru *** Docker 镜像托管于 Docker Hub:cilium/pwru
bashdocker run --privileged --rm -t --pid=host -v /sys/kernel/debug/:/sys/kernel/debug/ cilium/pwru pwru [选项] [pcap-filter]
参数说明:
--privileged:提供特权模式,确保容器能访问内核调试资源--rm:容器退出后自动删除-t:分配伪终端,确保输出格式正常--pid=host:共享主机 PID 命名空间,便于追踪内核进程-v /sys/kernel/debug/:/sys/kernel/debug/:挂载主机 debugfs,供工具访问内核调试信息追踪目标为 1.1.1.1 的网络流量,并输出 L4 元组:
bashdocker run --privileged --rm -t --pid=host -v /sys/kernel/debug/:/sys/kernel/debug/ cilium/pwru pwru --output-tuple 'host 1.1.1.1'
bashpwru [选项] [pcap-filter]
pcap-filter:pcap 过滤规则,语法参见 man 7 pcap-filter选项:支持以下主要参数(通过 pwru --help 获取完整列表):| 选项 | 说明 |
|---|---|
--backend string | 追踪后端,可选 kprobe 或 kprobe-multi,默认自动检测 |
--filter-func string | 按名称过滤要探测的内核函数(精确匹配,支持 RE2 正则表达式) |
--filter-ifname string | 过滤网络接口名称(需配合 --filter-netns,默认使用当前网络命名空间) |
--filter-netns string | 过滤网络命名空间(格式:/proc/<pid>/ns/net 或 inode:<inode>) |
--filter-track-skb | 即使数据包不匹配过滤条件也持续追踪(如 NAT 或隧道解封装后) |
--output-tuple | 输出 L4 元组(源/目的 IP、端口、协议),默认启用 |
--output-stack | 输出调用栈信息 |
--output-skb | 输出 skb 详情(需内核 ≥ 5.9) |
--output-json | 以 JSON 格式输出追踪结果 |
--timestamp string | 输出时间戳,可选 current(当前)、relative(相对)、absolute(绝对)或 none(默认) |
--filter-func=".*iptables.*"(追踪所有包含 iptables 的内核函数)--filter-ifname=eth0--output-stack --output-skb--output-json以下示例在指定 Kubernetes 节点上运行 pwru:
bash#!/usr/bin/env bash NODE=kind-control-plane # 目标节点名称 PWRU_ARGS="--output-tuple 'host 1.1.1.1'" # pwru 运行参数 trap "kubectl delete --wait=false pod pwru" EXIT # 退出时清理 pod kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: pwru spec: nodeSelector: kubernetes.io/hostname: ${NODE} # 调度到目标节点 containers: - image: docker.io/cilium/pwru:latest name: pwru volumeMounts: - mountPath: /sys/kernel/debug # 挂载 debugfs name: sys-kernel-debug securityContext: privileged: true # 特权模式 command: ["/bin/sh"] args: ["-c", "pwru ${PWRU_ARGS}"] # 运行 pwru volumes: - name: sys-kernel-debug hostPath: path: /sys/kernel/debug type: DirectoryOrCreate hostNetwork: true # 使用主机网络 hostPID: true # 共享主机 PID 命名空间 EOF kubectl wait pod pwru --for condition=Ready --timeout=90s # 等待 pod 就绪 kubectl logs -f pwru # 查看追踪日志
可通过 Slack 频道 中的 #pwru 与开发者、维护者及其他用户交流,获取帮助或分享使用经验。
Logo 说明:侦探地鼠(Detective Gopher)基于 Renee French 设计的 Go 地鼠形象创作。
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429