
네트워크 트래픽을 캡처하고 프로세스, 컨테이너, Kubernetes 파드 메타데이터를 자동으로 주석 처리하는 eBPF 기반 패킷 분석기로, tcpdump 호환 필터링과 PcapNG 출력을 지원합니다.
English | 中文
ptcpdump는 eBPF로 구동되는 tcpdump 호환 패킷 분석기로, 감지 가능한 경우 패킷에 프로세스/컨테이너/파드 메타데이터를 자동으로 주석 처리합니다. jschwinger233/skbdump에서 영감을 받았습니다.

--pid (프로세스), --pname (프로세스 이름), --container-id (컨테이너), --pod-name (파드).-i, -w, -c, -s, -n, -C, -W, -A 등).pcap-filter(7) 구문 지원.--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 사용:
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 사용: