Pengambilan TCP / IP dan UDP dapat dilakukan menggunakan tcpdump
/ dumpcap
dan menghasilkan file pcap / pcapng yang dapat diumpankan ke Wireshark untuk analisis lebih lanjut. Apakah ada alat serupa untuk soket domain bernama Unix? (Solusi umum yang berfungsi untuk soket abstrak akan lebih baik juga.)
strace
apa adanya tidak cukup, tidak mudah untuk menyaring I / O soket domain Unix. Sebuah proxy menggunakan socat
atau sama juga tidak cocok sebagai tujuannya adalah analisis pasif untuk program terbuka yang ada.
Bagaimana saya bisa mendapatkan tangkapan paket yang bisa saya gunakan di Wireshark untuk analisis? Contoh aplikasi protokol adalah X11 (Xorg, aplikasi saya saat ini) dan cURL / PHP (HTTP). Saya telah melihat CONFIG_UNIX_DIAG
opsi di kernel Linux, apakah ini ada gunanya?
sumber
-nolisten tcp
, tidak ada soket TCP. Jika semua gagal, maka saya mungkin akan kembali menggunakan xscope atau trik strace + text2pcap Anda yang rapi. Saya masih akan tertarik pada penangkapan soket Unix generik (hanya data, bukan data saluran samping).Jawaban:
Pada Linux kernel v4.2-rc5 tidak mungkin untuk menangkap secara langsung menggunakan antarmuka yang digunakan oleh libpcap. libpcap menggunakan domain khusus Linux
AF_PACKET
(aliasPF_PACKET
) yang hanya memungkinkan Anda untuk mengambil data untuk data yang melalui " netdevice " (seperti antarmuka Ethernet).Tidak ada antarmuka kernel untuk mengambil dari
AF_UNIX
soket. Tangkapan Ethernet standar memiliki tajuk Ethernet dengan sumber / tujuan, dll. Soket Unix tidak memiliki tajuk palsu dan registri jenis taut-lapis tidak mencantumkan apa pun yang terkait dengan ini.Titik masuk dasar untuk data adalah
unix_stream_recvmsg
danunix_stream_sendmsg
untukSOCK_STREAM
(SOCK_DGRAM
danSOCK_SEQPACKET
memiliki fungsi yang bernama sama). Data bufferedsk->sk_receive_queue
dan dalamunix_stream_sendmsg
fungsi tersebut , tidak ada kode yang pada akhirnya mengarah ke memanggiltpacket_rcv
fungsi untuk menangkap paket. Lihat analisis ini oleh osgx pada SO untuk detail lebih lanjut tentang internal capture paket secara umum.Kembali ke pertanyaan awal tentang
AF_UNIX
pemantauan soket, jika Anda terutama tertarik pada data aplikasi, Anda memiliki beberapa opsi:strace
dan tangkap kemungkinan panggilan sistem yang menjalankan I / O. Ada banyak dari mereka,read
,pread64
,readv
,preadv
,recvmsg
dan masih banyak lagi ... See @ Stéphane Chazelas contoh bagixterm
. Kerugian dari pendekatan ini adalah bahwa Anda pertama-tama harus menemukan deskriptor file Anda dan kemudian masih mungkin kehilangan panggilan sistem. Dengan strace Anda dapat menggunakan-e trace=file
sebagian besar dari mereka (pread
hanya ditutupi oleh-e trace=desc
, tetapi mungkin tidak digunakan untuk soket Unix oleh sebagian besar program).unix_stream_recvmsg
,unix_stream_sendmsg
(atauunix_dgram_*
atauunix_seqpacket_*
) di kernel dan output data, di suatu tempat. Anda dapat menggunakan SystemTap untuk mengatur titik jejak tersebut, berikut adalah contoh untuk memantau pesan keluar. Membutuhkan dukungan kernel dan ketersediaan simbol debugging .Aktif (hanya berfungsi untuk proses baru):
Gunakan proxy yang juga menulis file. Anda dapat menulis multiplexer cepat sendiri atau meretas sesuatu seperti ini yang juga menghasilkan pcap (waspadalah terhadap keterbatasan, misalnya
AF_UNIX
dapat melewati deskriptor file,AF_INET
tidak dapat):CONFIG_UNIX_DIAG
Opsi yang disarankan sayangnya juga tidak membantu di sini, hanya dapat digunakan untuk mengumpulkan statistik, tidak memperoleh data waktu nyata saat mereka mengalir (lihat linux / unix_diag.h ).Sayangnya tidak ada pelacak yang sempurna saat ini untuk soket domain Unix yang menghasilkan pcaps (setahu saya). Idealnya akan ada format libpcap yang memiliki header yang berisi PID sumber / dest (bila tersedia) diikuti oleh data tambahan opsional (kredensial, deskriptor file) dan akhirnya data. Karena itu, yang terbaik yang bisa dilakukan adalah penelusuran syscall.
Informasi tambahan (untuk pembaca yang tertarik), berikut adalah beberapa backtraces (diperoleh dengan GDB break on
unix_stream_*
danrbreak packet.c:.
, Linux di QEMU dan socat pada mainline Linux 4.2-rc5):sumber
Saya menulis alat untuk menangkap dan membuang lalu lintas soket domain unix. Ini digunakan
bpf/kprobe
untuk menyelidiki fungsi kernelunix_stream_sendmsg
dan membuang lalu lintas ke ruang pengguna.Alat ini tergantung pada
bcc
, jadi Anda harus menginstalbcc
terlebih dahulu.Contoh dijalankan:
sumber