
Analyseur de paquets basé sur eBPF qui capture le trafic réseau avec annotation automatique des métadonnées de processus, conteneur et pod Kubernetes, prenant en charge le filtrage compatible tcpdump et la sortie PcapNG.
Anglais | 中文
ptcpdump est un analyseur de paquets compatible tcpdump, propulsé par eBPF, qui annote automatiquement les paquets avec les métadonnées du processus/conteneur/pod lorsque cela est détectable. Inspiré par jschwinger233/skbdump.

--pid (processus), --pname (nom de processus), --container-id (conteneur), --pod-name (pod).-i, -w, -c, -s, -n, -C, -W, -A, et plus).pcap-filter(7) comme tcpdump.--netns).Vous pouvez télécharger l'exécutable lié statiquement pour x86_64 et arm64 depuis la page des versions.
Noyau Linux >= 5.2 (compilé avec le support BPF et BTF).
ptcpdump nécessite optionnellement debugfs. Il doit être monté dans /sys/kernel/debug.
Si le dossier est vide, il peut être monté avec :
mount -t debugfs none /sys/kernel/debug
La configuration noyau suivante est requise. La compilation en tant que modules est également possible.
| Option | Backend | Note |
|---|---|---|
| CONFIG_BPF=y | les deux | Requis |
| CONFIG_BPF_SYSCALL=y | les deux | Requis |
| CONFIG_DEBUG_INFO=y | les deux | Requis |
| CONFIG_DEBUG_INFO_BTF=y | les deux | Requis |
| CONFIG_KPROBES=y | les deux | Requis |
| CONFIG_KPROBE_EVENTS=y | les deux | Requis |
| CONFIG_TRACEPOINTS=y | les deux | Requis |
| CONFIG_PERF_EVENTS=y | les deux | Requis |
| CONFIG_NET=y | les deux | Requis |
| CONFIG_NET_SCHED=y | tc | Requis |
| CONFIG_NET_CLS_BPF=y | tc | Requis |
| CONFIG_NET_ACT_BPF=y | tc | Requis |
| CONFIG_NET_SCH_INGRESS=y | tc | Requis |
| CONFIG_CGROUPS=y | cgroup-skb | Requis |
| CONFIG_CGROUP_BPF=y | cgroup-skb | Requis |
| CONFIG_FILTER=y | socket-filter | Requis |
| CONFIG_BPF_TRAMPOLINE=y | tp-btf | Requis |
| CONFIG_SECURITY=y | les deux | Optionnel (Recommandé) |
| CONFIG_BPF_TRAMPOLINE=y | les deux | Optionnel (Recommandé) |
| CONFIG_SOCK_CGROUP_DATA=y | les deux | Optionnel (Recommandé) |
| CONFIG_BPF_JIT=y | les deux | Optionnel (Recommandé) |
| CONFIG_CGROUP_BPF=y | tc, tp-btf, socket-filter | Optionnel (Recommandé) |
| CONFIG_CGROUPS=y | tc, tp-btf, socket-filter | Optionnel (Recommandé) |
Vous pouvez utiliser zgrep $OPTION /proc/config.gz pour valider si une option est activée.
Filtrer comme avec 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'
Interfaces multiples :
sudo ptcpdump -i eth0 -i lo
Filtrer par processus ou utilisateur :
sudo ptcpdump -i any --pid 1234 --pid 233 -f
sudo ptcpdump -i any --pname curl
sudo ptcpdump -i any --uid 1000
Capture par processus via programme cible :
sudo ptcpdump -i any -- curl ubuntu.com
Filtrer par conteneur ou pod :
sudo ptcpdump -i any --container-id 36f0310403b1
sudo ptcpdump -i any --container-name test
sudo ptcpdump -i any --pod-name test.default
Sauvegarder les données au format 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 -
Capture d'interfaces dans d'autres espaces de noms réseau :
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
Par défaut :
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]
Avec -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]
Avec -v :