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 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务