
eBPFベースのパケットアナライザで、ネットワークトラフィックをキャプチャし、プロセス、コンテナ、Kubernetes Podのメタデータを自動で注釈付けします。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を使用して出力に含めるコンテキストを制限: