
Анализатор пакетов на основе eBPF, который захватывает сетевой трафик с автоматическим аннотированием метаданных процессов, контейнеров и подов Kubernetes, поддерживая фильтрацию, совместимую с tcpdump, и вывод в формате PcapNG.
Английский | 中文
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 со страницы релизов.
Ядро Linux >= 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: