Unixドメインソケットを「追跡」する方法は?

Unixドメインソケットを「追跡」する方法は?

説明するのは少し難しいですが、straceソケットが開いているPIDを入力しても通信が見えないことがわかりました。ソケットファイルの真ん中に座って通信を観察するにはどうすればよいですか?

ベストアンサー1

ソケットは、通信に使用されるカーネルAPIです。ソケットAPIを使用すると、TCP / IP接続、SCTP接続、UDPデータグラムを介して2つのエンドポイント間、またはUnixドメインソケットを使用して2つのプロセス(データグラムまたは接続)間でデータを交換できます。

カーネルAPIとして、ソケットとのすべての対話はシステムコール(、、、、、、、、、... )を介しsocketて行われます。bindconnectlistenacceptsendmsgsendrecvwrite/read

したがって、通常、システムコールの追跡straceによってこれを追跡することが可能です。追跡できないstrace唯一のstrace通信メカニズムは共有メモリのIPCです(メモリから何かを読み書きすることは明らかにシステムコールを含まないためです)。

あなたの場合は、他のものである可能性が高くなります。アプリケーションはマルチスレッドであり、正しいスレッドを追跡しないと確信しています。または、アプリケーションが setuid/setgid で、スーパーユーザーとして起動しないことがあります。

Unixドメインソケットを介して交換されたコンテンツを追跡する場合は、オプションは次のとおりです。

  • straceその他のptraceデバッガ(トラッキングサーバーまたはクライアント)
  • 監査システム(auditd/ auditctl)、再びシステムコールの追跡
  • トリックを使用してLD_PRELOADソケットと対話するシステムコールをラップします。
  • アプリケーションのコードを計測し、そこにロギングを追加します。
  • 前述のように、systemtapおよびその他の低レベルカーネルトレース/デバッグシステム
  • 中央の人を挿入します。

socatMITMの場合は、たとえばX11などの接続指向のUnixドメインソケットを使用できます。

socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0
DISPLAY=:42 xlogo

xlogoこれにより、Xサーバーと交換されたX11トラフィックが表示されます。

おすすめ記事