説明するのはちょっと難しいですが、ソケットが開いているPIDをstrace
ingすると、通信がまったく表示されないことに気付きました。ソケットファイルの真ん中に座って通信を監視するにはどうすればよいですか?
ソケットは、通信用のカーネルAPIです。ソケットAPIを使用すると、TCP/IP接続、SCTPアソシエーション、UDPデータグラムを介して2つのエンドポイント間で、またはUnixドメインソケットを使用して2つのプロセス(データグラムまたは接続)間でデータを交換できます。
カーネルAPIであるため、ソケットとの対話はシステムコール(socket
、bind
、connect
、listen
、accept
、 sendmsg
、send
、recv
、write/read
...)。
したがって、通常、strace
はシステムコールをトレースするため、strace
はそれらをトレースできます。 strace
が追跡できない唯一の通信メカニズムは、共有メモリを介したIPCです)(メモリ内の何かの読み取り/書き込みは明らかにシステムコールを含まないため)。
おそらく、あなたの場合、それは別のものです。私の賭けは、アプリケーションがマルチスレッドであり、適切なスレッドを束縛していないことです。または、アプリケーションがsetuid/setgidであり、スーパーユーザーとして起動されていない可能性があります。
Unixドメインソケットを介して交換されているものを追跡する場合、オプションは次のとおりです。
strace
およびその他のptrace
デバッガー(サーバーまたはクライアントをトレース)auditd
/auditctl
)LD_PRELOAD
ソケットと相互作用するシステムコールをラップするトリックMITMの場合、たとえばsocat
を使用できます。 X11のような接続指向のUnixドメインソケットの場合:
socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0
DISPLAY=:42 xlogo
次に、xlogo
とXサーバーが交換するX11トラフィックが表示されます。
「ソケットのトレース」はできません。straceはプロセスで機能するため、ソケットと通信するすべてのプロセスをトレースできますが、straceを使用して、ソケットに関係するすべての通信を完全に確認することはできません。あなたはmayがOSで利用可能であれば、dtraceまたはsystemtapでどこかに行くことができますが、それはかなりの作業です。