Mengendus soket domain UNIX

9

Saya tahu bahwa beberapa proses menulis ke soket domain unix tertentu ( /var/run/asterisk/asterisk.ctl), tapi saya tidak tahu pid pengirimnya. Bagaimana saya bisa mengetahui siapa yang menulis ke soket? Saya sudah mencoba:

sudo lsof /var/run/asterisk/asterisk.ctl

tetapi itu hanya daftar pemilik soket. Saya ingin tahu siapa yang menulis / membaca soket ini, dan saya juga ingin mengendus data. Apakah ini mungkin?

dangonfast
sumber

Jawaban:

4

Jawaban singkatnya adalah tidak dan tidak mudah.

Di Linux, ia bergantung /proc/net/unixuntuk mengambil informasi mengenai soket domain UNIX. Antarmuka ini mencantumkan semua soket terikat, tetapi tidak melacak titik akhir. Jadi Anda bisa melihat soket apa yang ada, tetapi Anda tidak bisa melihat apa yang terhubung dengannya. Di suatu tempat informasi ini dilacak, itu harus dilacak atau koneksi soket tidak berfungsi. Saya belum menemukan mekanisme untuk mengambil informasi koneksi.

Pertanyaan mengendus sedikit lebih menarik, tapi tidak kalah mengecewakan. Yang saya maksud dengan "tidak mudah" adalah tidak ada kait untuk menyelinap masuk dan mengambil data itu. Analog terdekat menggunakan tcpdump atau Wireshark, keduanya menggunakan libpcap untuk benar-benar melakukan pengangkatan berat. Sementara jaringan (AF_INET) dan domain UNIX (AF_UNIX) keduanya dibuat menggunakan socket()panggilan fungsi, keduanya digunakan connect()untuk menyambung ke, keduanya menggunakan read()dan write()untuk memproses data, mereka ditangani oleh berbagai subsistem kernel. Ini memiliki efek samping yang disayangkan bahwa libpcap tidak dirancang untuk bekerja dengan soket domain UNIX.

Ada sisi yang sedikit kurang redup untuk masalah tersebut. Lihatlah halaman manual untuk recv(2). Ini adalah panggilan sistem tingkat bawah yang read()memanfaatkan. Ada bendera untuk recv()dipanggil MSG_PEEK. Ini akan memungkinkan Anda untuk mengendus lalu lintas yang melewati soket domain UNIX. Jadi itulah sisi baiknya, sisi gelapnya adalah setahu saya tidak ada aplikasi saat ini yang dirancang untuk melakukan ini. Jadi Anda sedang melihat beberapa upaya pengembangan.

Saya benar-benar berharap ada adalah jawaban sederhana bagus F'YEAH untuk kedua bagian dari pertanyaan Anda.

Scott Pack
sumber
11

Ya, Anda bisa melakukan ini. Yang Anda butuhkan hanyalah systemtap.

Pertimbangkan salah satu contoh skrip systemtap yang akan mencetak PID dan nama proses program apa pun yang membaca atau menulis inode yang ditentukan (dan soket domain Unix Anda adalah hal semacam itu).

Anda dapat memodifikasi skrip ini secara sepele untuk mencetak data aktual yang sedang dibaca / ditulis; Saya akan meninggalkan melakukannya sebagai latihan untuk pembaca.

Michael Hampton
sumber
3

Saya tahu ini bukan menjawab pertanyaan utama, tetapi saya telah berakhir di sini, mencari hanya mengendus komunikasi pada soket. Saya telah memutuskan untuk mengirim orang lain seperti saya. Begini cara saya melakukannya:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT: /var/run/php5-fpm.sock

Anda dapat menghapus -x dan biarkan -v untuk komunikasi ascii. Semoga itu bisa membantu seseorang.

Anton Valqk
sumber
berfungsi dengan baik
JSmyth
-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

Tidak ada duplikasi output, tidak ada output siklik. Kesalahan komentar sebelumnya ".sock.socat"

srvf
sumber
2
Meskipun itu mungkin perintah yang berguna, tolong tambahkan beberapa penjelasan / klarifikasi (dan apa bedanya dengan jawaban ini ?)
HBruijn
Maafkan saya. Tidak ada duplikasi output, tidak ada output siklik. Kesalahan komentar sebelumnya ".sock.socat"
srvf