Linuxカーネルv4.2-rc5の時点では、libpcapで使用されているインターフェースを使用して直接キャプチャすることはできません。libpcapは、Linux固有のAF_PACKET
(エイリアスPF_PACKET
)ドメインを使用します。これにより、「ネットデバイス」(イーサネットインターフェイスなど)を通過するデータのデータのみをキャプチャできます。
AF_UNIX
ソケットからキャプチャするためのカーネルインターフェイスはありません。標準のイーサネットキャプチャには、発信元/宛先などのイーサネットヘッダーがあります。Unixソケットにはそのような偽のヘッダーはなく、リンク層ヘッダータイプレジストリにはこれに関連するものはリストされません。
データの基本的なエントリポイントはunix_stream_recvmsg
and unix_stream_sendmsg
ですSOCK_STREAM
(SOCK_DGRAM
およびSOCK_SEQPACKET
同様の名前の関数があります)。関数内sk->sk_receive_queue
およびunix_stream_sendmsg
関数内でデータがバッファリングされます。パケットキャプチャのためにtpacket_rcv
関数を呼び出すことに最終的につながるコードはありません。一般的なパケットキャプチャの内部の詳細については、SOのosgxによるこの分析を参照してください。
AF_UNIX
ソケットモニタリングに関する元の質問に戻ります。主にアプリケーションデータに関心がある場合、いくつかのオプションがあります。
- パッシブ(既に実行中のプロセスでも機能します):
strace
I / Oを実行する可能性のあるシステムコールを使用してキャプチャします。それらの多くがありますが、read
、pread64
、readv
、preadv
、recvmsg
と、より多くの...を参照してくださいステファンChazelasの@のための一例xterm
。このアプローチの欠点は、最初にファイル記述子を見つける必要があり、それでもシステムコールを逃す可能性があることです。straceを使用する-e trace=file
と、それらのほとんどに使用できます(pread
でのみカバーされますが-e trace=desc
、ほとんどのプログラムではUnixソケットにはおそらく使用されません)。
- /上のブレーク修正し
unix_stream_recvmsg
、unix_stream_sendmsg
(またはunix_dgram_*
またはunix_seqpacket_*
で)カーネルのどこかに、データと出力データ。SystemTapを使用して、このようなトレースポイントを設定できます。これは、送信メッセージを監視する例です。カーネルサポートとデバッグシンボルの可用性が必要です。
アクティブ(新しいプロセスでのみ機能します):
ファイルも書き込むプロキシを使用します。クイックマルチプレクサを自分で記述するか、pcapを出力するこのようなものをハックすることができます(たとえばAF_UNIX
、ファイル記述子を渡すことができるなどの制限に注意してくださいAF_INET
)。
# fake TCP server connects to real Unix socket
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CONNECT:some.sock
# start packet capture on said port
tcpdump -i lo -f 'tcp port 6000'
# clients connect to this Unix socket
socat UNIX-LISTEN:fake.sock,fork TCP-CONNECT:127.0.0.1:6000
- 専用のアプリケーションプロキシを使用します。X11には、xscope(git、manual)があります。
提案されたCONFIG_UNIX_DIAG
オプションは、残念ながらここでは役に立たないため、統計を収集するためにのみ使用でき、流れているリアルタイムのデータを取得することはできません(linux / unix_diag.hを参照)。
残念ながら、現時点では、pcapを生成するUnixドメインソケット用の完璧なトレーサーはありません(私の知る限り)。理想的には、ソース/宛先PID(利用可能な場合)に続いてオプションの追加データ(資格情報、ファイル記述子)、最後にデータを含むヘッダーを持つlibpcap形式があります。それに欠けて、できる最善のことは、システムコールのトレースです。
(興味のある読者のために)追加情報、ここではいくつかのバックトレースがある(GDBは、上の破壊で取得unix_stream_*
してrbreak packet.c:.
、LinuxのQEMUでとsocatに関するメインラインのLinux 4.2-RC5上):
# echo foo | socat - UNIX-LISTEN:/foo &
# echo bar | socat - UNIX-CONNECT:/foo
unix_stream_sendmsg at net/unix/af_unix.c:1638
sock_sendmsg_nosec at net/socket.c:610
sock_sendmsg at net/socket.c:620
sock_write_iter at net/socket.c:819
new_sync_write at fs/read_write.c:478
__vfs_write at fs/read_write.c:491
vfs_write at fs/read_write.c:538
SYSC_write at fs/read_write.c:585
SyS_write at fs/read_write.c:577
entry_SYSCALL_64_fastpath at arch/x86/entry/entry_64.S:186
unix_stream_recvmsg at net/unix/af_unix.c:2210
sock_recvmsg_nosec at net/socket.c:712
sock_recvmsg at net/socket.c:720
sock_read_iter at net/socket.c:797
new_sync_read at fs/read_write.c:422
__vfs_read at fs/read_write.c:434
vfs_read at fs/read_write.c:454
SYSC_read at fs/read_write.c:569
SyS_read at fs/read_write.c:562
# tcpdump -i lo &
# echo foo | socat - TCP-LISTEN:1337 &
# echo bar | socat - TCP-CONNECT:127.0.0.1:1337
tpacket_rcv at net/packet/af_packet.c:1962
dev_queue_xmit_nit at net/core/dev.c:1862
xmit_one at net/core/dev.c:2679
dev_hard_start_xmit at net/core/dev.c:2699
__dev_queue_xmit at net/core/dev.c:3104
dev_queue_xmit_sk at net/core/dev.c:3138
dev_queue_xmit at netdevice.h:2190
neigh_hh_output at include/net/neighbour.h:467
dst_neigh_output at include/net/dst.h:401
ip_finish_output2 at net/ipv4/ip_output.c:210
ip_finish_output at net/ipv4/ip_output.c:284
ip_output at net/ipv4/ip_output.c:356
dst_output_sk at include/net/dst.h:440
ip_local_out_sk at net/ipv4/ip_output.c:119
ip_local_out at include/net/ip.h:119
ip_queue_xmit at net/ipv4/ip_output.c:454
tcp_transmit_skb at net/ipv4/tcp_output.c:1039
tcp_write_xmit at net/ipv4/tcp_output.c:2128
__tcp_push_pending_frames at net/ipv4/tcp_output.c:2303
tcp_push at net/ipv4/tcp.c:689
tcp_sendmsg at net/ipv4/tcp.c:1276
inet_sendmsg at net/ipv4/af_inet.c:733
sock_sendmsg_nosec at net/socket.c:610
sock_sendmsg at net/socket.c:620
sock_write_iter at net/socket.c:819
new_sync_write at fs/read_write.c:478
__vfs_write at fs/read_write.c:491
vfs_write at fs/read_write.c:538
SYSC_write at fs/read_write.c:585
SyS_write at fs/read_write.c:577
entry_SYSCALL_64_fastpath at arch/x86/entry/entry_64.S:186
tpacket_rcv at net/packet/af_packet.c:1962
dev_queue_xmit_nit at net/core/dev.c:1862
xmit_one at net/core/dev.c:2679
dev_hard_start_xmit at net/core/dev.c:2699
__dev_queue_xmit at net/core/dev.c:3104
dev_queue_xmit_sk at net/core/dev.c:3138
dev_queue_xmit at netdevice.h:2190
neigh_hh_output at include/net/neighbour.h:467
dst_neigh_output at include/net/dst.h:401
ip_finish_output2 at net/ipv4/ip_output.c:210
ip_finish_output at net/ipv4/ip_output.c:284
ip_output at net/ipv4/ip_output.c:356
dst_output_sk at include/net/dst.h:440
ip_local_out_sk at net/ipv4/ip_output.c:119
ip_local_out at include/net/ip.h:119
ip_queue_xmit at net/ipv4/ip_output.c:454
tcp_transmit_skb at net/ipv4/tcp_output.c:1039
tcp_send_ack at net/ipv4/tcp_output.c:3375
__tcp_ack_snd_check at net/ipv4/tcp_input.c:4901
tcp_ack_snd_check at net/ipv4/tcp_input.c:4914
tcp_rcv_state_process at net/ipv4/tcp_input.c:5937
tcp_v4_do_rcv at net/ipv4/tcp_ipv4.c:1423
tcp_v4_rcv at net/ipv4/tcp_ipv4.c:1633
ip_local_deliver_finish at net/ipv4/ip_input.c:216
ip_local_deliver at net/ipv4/ip_input.c:256
dst_input at include/net/dst.h:450
ip_rcv_finish at net/ipv4/ip_input.c:367
ip_rcv at net/ipv4/ip_input.c:455
__netif_receive_skb_core at net/core/dev.c:3892
__netif_receive_skb at net/core/dev.c:3927
process_backlog at net/core/dev.c:4504
napi_poll at net/core/dev.c:4743
net_rx_action at net/core/dev.c:4808
__do_softirq at kernel/softirq.c:273
do_softirq_own_stack at arch/x86/entry/entry_64.S:970