
محلل حزم قائم على eBPF يلتقط حركة مرور الشبكة مع تعليق بيانات وصفية تلقائي للعمليات والحاويات و pods Kubernetes، ويدعم التصفية المتوافقة مع tcpdump وإخراج PcapNG.
English | 中文
ptcpdump هو محلل حزم متوافق مع tcpdump يعمل بتقنية eBPF، ويقوم تلقائيًا بتعليق الحزم ببيانات تعريف العملية/الحاوية/البود عندما يمكن اكتشافها. مستوحى من jschwinger233/skbdump.

--pid (العملية)، --pname (اسم العملية)، --container-id (الحاوية)، --pod-name (البود).-i, -w, -c, -s, -n, -C, -W, -A, والمزيد).pcap-filter(7) مثل tcpdump.--netns).يمكنك تنزيل الملف التنفيذي المرتبط بشكل ثابت لـ x86_64 و arm64 من صفحة الإصدارات.
نواة لينكس >= 5.2 (مجمعة مع دعم BPF و BTF).
ptcpdump يتطلب اختياريًا debugfs. يجب تركيبه في /sys/kernel/debug.
في حال كان المجلد فارغًا، يمكن تركيبه باستخدام:
mount -t debugfs none /sys/kernel/debug
تكوين النواة التالي مطلوب. البناء كوحدات نمطية ممكن أيضًا.
| الخيار | المحرك الخلفي | ملاحظة |
|---|---|---|
| CONFIG_BPF=y | كلاهما | مطلوب |
| CONFIG_BPF_SYSCALL=y | كلاهما | مطلوب |
| CONFIG_DEBUG_INFO=y | كلاهما | مطلوب |
| CONFIG_DEBUG_INFO_BTF=y | كلاهما | مطلوب |
| CONFIG_KPROBES=y | كلاهما | مطلوب |
| CONFIG_KPROBE_EVENTS=y | كلاهما | مطلوب |
| CONFIG_TRACEPOINTS=y | كلاهما | مطلوب |
| CONFIG_PERF_EVENTS=y | كلاهما | مطلوب |
| CONFIG_NET=y | كلاهما | مطلوب |
| CONFIG_NET_SCHED=y | tc | مطلوب |
| CONFIG_NET_CLS_BPF=y | tc | مطلوب |
| CONFIG_NET_ACT_BPF=y | tc | مطلوب |
| CONFIG_NET_SCH_INGRESS=y | tc | مطلوب |
| CONFIG_CGROUPS=y | cgroup-skb | مطلوب |
| CONFIG_CGROUP_BPF=y | cgroup-skb | مطلوب |
| CONFIG_FILTER=y | socket-filter | مطلوب |
| CONFIG_BPF_TRAMPOLINE=y | tp-btf | مطلوب |
| CONFIG_SECURITY=y | كلاهما | اختياري (موصى به) |
| CONFIG_BPF_TRAMPOLINE=y | كلاهما | اختياري (موصى به) |
| CONFIG_SOCK_CGROUP_DATA=y | كلاهما | اختياري (موصى به) |
| CONFIG_BPF_JIT=y | كلاهما | اختياري (موصى به) |
| CONFIG_CGROUP_BPF=y | tc, tp-btf, socket-filter | اختياري (موصى به) |
| CONFIG_CGROUPS=y | tc, tp-btf, socket-filter | اختياري (موصى به) |
يمكنك استخدام zgrep $OPTION /proc/config.gz للتحقق من تمكين الخيار.
التصفية مثل tcpdump:
sudo ptcpdump -i eth0 tcp
sudo ptcpdump -i eth0 -A -s 0 -n -v tcp and port 80 and host 10.10.1.1
sudo ptcpdump -i any -s 0 -n -v -C 100MB -W 3 -w test.pcapng 'tcp and port 80 and host 10.10.1.1'
sudo ptcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
واجهات متعددة:
sudo ptcpdump -i eth0 -i lo
التصفية حسب العملية أو المستخدم:
sudo ptcpdump -i any --pid 1234 --pid 233 -f
sudo ptcpdump -i any --pname curl
sudo ptcpdump -i any --uid 1000
الالتقاط حسب العملية عبر تشغيل البرنامج المستهدف:
sudo ptcpdump -i any -- curl ubuntu.com
التصفية حسب الحاوية أو البود:
sudo ptcpdump -i any --container-id 36f0310403b1
sudo ptcpdump -i any --container-name test
sudo ptcpdump -i any --pod-name test.default
حفظ البيانات بتنسيق PcapNG:
sudo ptcpdump -i any -w demo.pcapng
sudo ptcpdump -i any -w - port 80 | tcpdump -n -r -
sudo ptcpdump -i any -w - port 80 | tshark -r -
التقاط الواجهات في مساحات أسماء شبكة أخرى:
sudo ptcpdump -i lo --netns /run/netns/foo --netns /run/netns/bar
sudo ptcpdump -i any --netns /run/netns/foobar
sudo ptcpdump -i any --netns /proc/26/ns/net
الافتراضي:
09:32:09.718892 vethee2a302f wget.3553008 In IP 10.244.0.2.33426 > 139.178.84.217.80: Flags [S], seq 4113492822, win 64240, length 0, ParentProc [python3.834381], Container [test], Pod [test.default]
09:32:09.718941 eth0 wget.3553008 Out IP 172.19.0.2.33426 > 139.178.84.217.80: Flags [S], seq 4113492822, win 64240, length 0, ParentProc [python3.834381], Container [test], Pod [test.default]
مع -q:
09:32:09.718892 vethee2a302f wget.3553008 In IP 10.244.0.2.33426 > 139.178.84.217.80: tcp 0, ParentProc [python3.834381], Container [test], Pod [test.default]
09:32:09.718941 eth0 wget.3553008 Out IP 172.19.0.2.33426 > 139.178.84.217.80: tcp 0, ParentProc [python3.834381], Container [test], Pod [test.default]
مع -v:
13:44:41.529003 eth0 In IP (tos 0x4, ttl 45, id 45428, offset 0, flags [DF], proto TCP (6), length 52)
139.178.84.217.443 > 172.19.0.2.42606: Flags [.], cksum 0x5284, seq 3173118145, ack 1385712707, win 118, options [nop,nop,TS val 134560683 ecr 1627716996], length 0
Process (pid 553587, cmd /usr/bin/wget, args wget kernel.org)
User (uid 1000)
ParentProc (pid 553296, cmd /bin/sh, args sh)
Container (name test, id d9028334568bf75a5a084963a8f98f78c56bba7f45f823b3780a135b71b91e95, image docker.io/library/alpine:3.18, labels {"io.cri-containerd.kind":"container","io.kubernetes.container.name":"test","io.kubernetes.pod.name":"test","io.kubernetes.pod.namespace":"default","io.kubernetes.pod.uid":"9e4bc54b-de48-4b1c-8b9e-54709f67ed0c"})
Pod (name test, namespace default, UID 9e4bc54b-de48-4b1c-8b9e-54709f67ed0c, labels {"run":"test"}, annotations {"kubernetes.io/config.seen":"2024-07-21T12:41:00.460249620Z","kubernetes.io/config.source":"api"})
استخدام --context لتحديد السياق المراد تضمينه في المخرجات: