
BPFベースのLinux IPCトレーサー。パイプ、シグナル、Unixソケット、ループバック、疑似端末を対象とし、メタデータとコンテンツのキャプチャ、フィルタリング、JSON出力をサポート。
ipcdumpは、Linux上でプロセス間通信(IPC)をトレースするためのツールです。パイプ、FIFO、シグナル、Unixソケット、ループバックベースのネットワーキング、擬似端末など、一般的なIPCメカニズムのほとんどをカバーしています。マルチプロセスアプリケーションのデバッグに役立つツールであり、システム内のさまざまなコンポーネントがどのように相互に通信しているかを理解する簡単な方法でもあります。ipcdumpは、この通信のメタデータと内容の両方をトレースでき、特に短命なプロセス間のIPCのトレースに適しています。これは、straceやgdbのような従来のデバッグツールでは困難な場合があります。また、大量のイベントを選別するのに役立つ基本的なフィルタリング機能も備えています。 ipcdumpが収集する情報のほとんどは、カーネル内の主要な関数のkprobeとtracepointに配置されたBPFフックから取得されますが、/procファイルシステムから一部のブックキーピングデータも補充します。この目的のために、ipcdumpはbccフレームワーク向けのgolangバインディングを提供するgobpfを多用しています。
| Ubuntu 18.04 LTS | Ubuntu 20.04 LTS | |
|---|---|---|
| 4.15.0 | テスト済み | 未テスト |
| 5.4.0 | 未テスト | テスト済み |
| 5.8.0 | 未テスト | テスト済み* |
*bccをソースからビルドする必要があります
snap install go --classic
または 直接 golang website から
git clone https://github.com/guardicore/IPCDump
cd IPCDump/cmd/ipcdump
go build
./ipcdump -h
Usage of ./ipcdump:
-B uint
max number of bytes to dump per event, or 0 for complete event (may be large). meaningful only if -x is specified.
-D value
filter by destination comm (can be specified more than once)
-L do not output lost event information
-P value
filter by comm (either source or destination, can be specified more than once)
-S value
filter by source comm (can be specified more than once)
-c uint
exit after <count> events
-d value
filter by destination pid (can be specified more than once)
-f string
<text|json> output format (default is text) (default "text")
-p value
filter by pid (either source or destination, can be specified more than once)
-s value
filter by source pid (can be specified more than once)
-t value
filter by type (can be specified more than once).
possible values: a|all k|signal u|unix ud|unix-dgram us|unix-stream t|pty lo|loopback lt|loopback-tcp lu|loopback-udp p|pipe
-x dump IPC bytes where relevant (rather than just event details).
rootで実行:
# dump all ipc on the system
./ipcdump
# dump signals sent between any two processes
./ipcdump -t kill
# dump loopback TCP connection metadata to or from pid 1337
./ipcdump -t loopback-tcp -p 1337
# dump unix socket IPC metadata and contents from Xorg
./ipcdump -t unix -x -S Xorg
# dump json-formatted pipe i/o metadata and first 64 bytes of contents
./ipcdump -t pipe -x -B 64 -f json
ipcdumpは一連のコレクタで構成されており、各コレクタが特定のタイプのIPCイベントを担当します。例えば、IPC_EVENT_LOOPBACK_SOCK_UDP や IPC_EVENT_SIGNAL などです。
実際には、すべてのコレクタはkprobeとtracepointにアタッチされたbpfフックを使用して構築されています。ただし、それらの実装は完全に独立しています。情報が常にbpfから得られるとは限らないからです。とはいえ、異なるコレクタは共通のコードを共有する必要があるため、単一のbpfモジュールを共有する必要があります。この目的のために、単一のBpfBuilder(本質的にはbccコードの文字列を連結するラッパー)を共有し、各コレクタはそのビルダーに自身のコードを登録します。そして、完全なbccスクリプトがgobpfでロードされ、各モジュールが必要なフックを配置します。
現在、IPCコレクタ間で共有されるブックキーピングには2種類あります:
SocketIdentifier (internal/collection/sock_id.go) -- カーネルの struct sock* とそれを使用するプロセスとの間のマッピング。CommIdentifier (internal/collection/comm_id.go) -- pid番号と対応するプロセス名 (/proc/<pid>/comm) の間のマッピング。これらのブックキーピングは、特に短命なプロセスにとって重要です。この情報は後でユーザーモードで/procを解析して埋め込むこともできますが、イベントがハンドラに到達する頃には関連プロセスが消えていることがよくあります。とはいえ、/procから情報を埋め込むこともあります。これは主にipcdumpが実行される前に存在していたプロセスに対して行われます。この場合、プロセスの命名などのイベントはキャッチできません。SocketIdentifierとCommIdentifierは、bccコードと/proc解析の二重性を単一のAPIの背後に抽象化しようとしますが、完全にきれいではありません。ちなみに、超新しいバージョンのLinux(5.8)では、bpfイテレータがこのブックキーピングを完全に置き換えることができますが、後方互換性のために、今のところはフックとprocfsのパラダイムに固執するべきでしょう。
イベント出力は共通のEmitIpcEvent()関数を通じて行われ、この関数は標準的なイベント形式(送信元プロセス、宛先プロセス、メタデータのキーと値のペア、内容)を受け取り、統一された形式で出力します。イベント帯域幅を節約するため、コレクタは通常、-xフラグが指定されていない場合、IPC内容を出力しません。これはinternal/collection/ipc_bytes.go内のいくつかの華麗な前処理マジックによって行われます。
ぜひご参加ください!本当に重要なことはTODOを確認してください。ipcdumpの初期の作業のほとんどは、異なるカーネルバージョンやシンボルへの調整を含む可能性があります。