Dapatkah saya memantau soket domain unix lokal seperti tcpdump?

Jawaban:

15

Ada seorang pria yang mengaku melakukannya dengan membuat aplikasi yang bertindak sebagai gerbang antara dua soket dan mencatat semua data yang mengalir. Jadi Anda tidak dapat mengetuk soket tetapi jika Anda dapat memulai kembali layanan dan menyetelnya untuk menggunakan aplikasi orang ini Anda akan dapat melihat semua lalu lintas.

Berikut tautan ke pos: Unix Socket Sniffer

Ada cara lain yang membutuhkan Anda untuk menemukan id proses yang terpasang pada soket, kemudian temukan dengan lsof deskriptor file soket dan kemudian ketuk deskriptor file menggunakan strace.

Jika Anda dapat menghentikan klien / server apa pun yang menggunakan soket dan mengonfigurasi ulang, saya akan selalu menyarankan metode pertama, metode kedua itu rumit dan mengharuskan Anda untuk mengetuk proses saat ini yang pada beberapa aplikasi dapat menyebabkannya macet.

Semoga seseorang mencerahkan kita dengan cara lain :)

Semoga berhasil

Keberanian
sumber
Yah, Anda dapat melakukan metode perantara juga dengan socat tetapi saya berharap untuk cara yang lebih langsung tanpa mengubah pengaturan yang ada di tempat lain.
ck_
1
Kemudian lof dan strace itu satu-satunya cara saya sadari. Berhati-hatilah dalam produksi ketika Anda melepaskan strace dari proses, periksa apakah semuanya tetap berjalan setelah itu.
Valor
3
Setelah beberapa penggalian di sekitar saya menemukan pertanyaan serupa dengan beberapa rincian tentang mengapa hal ini tidak secara langsung terjadi pada stackoverflow stackoverflow.com/questions/8394613/…
ck_
80

Anda bisa menggunakan socat.

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

Apa yang terjadi di atas: Pertama-tama pindahkan soket asli ke sock.original. Socat membuat soket baru ('UNIX-LISTEN') di lokasi asli dan meneruskan semua ke yang asli ('UNIX-connect'). -V memberitahu socat untuk juga mencetak output ke STDERR.

storoj
sumber
3
Ingin menambahkan sedikit penjelasan?
Kazark
4
Itu mudah ketika soket unix asli memiliki jalur pada sistem file. tetapi bagaimana jika itu adalah soket unix namespace abstrak yang Anda tidak dapat benar-benar bergerak?
Valerio Schiavoni
6

Anda juga dapat mencoba menggunakan strace pada salah satu proses di kedua sisi soket, karena ini akan membuat Anda menonton apa yang tertulis / baca. Saya temukan di lingkungan produksi saya, saya tidak punya socat, tetapi memiliki strace.

Untuk tujuan apa pun yang berguna, pengaturan -s untuk sesuatu yang besar adalah suatu keharusan.

omnigrok
sumber
Ini bekerja dengan baik untuk saya, dan mudah dilakukan. Gunakan strace -p <pid>untuk menonton proses yang sedang berjalan.
Matt Munson
perintah cepat: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logdan kemudian jalankan tes. Anda memiliki /tmp/php.log untuk memeriksa secara perlahan apakah log terlalu besar. Jika Anda mendapatkan terlalu banyak lalu lintas, lakukan permintaan dengan string-kueri dengan nama Anda atau sesuatu agar Anda dapat mencarinya di log
higuita
1
@ Higuita Saya tahu ini sudah lama, tapi alih-alih loop itu, Anda bisa membiarkan printfpengulangan. printf " -p %s" $(pidof php5-fpm)akan mengawali setiap argumen pid dengan -pdan jauh lebih praktis untuk ditulis.
JoL
2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

kemudian:

sudo tcpdump -i lo -netvv port 8089
任喜军
sumber
1
el magnifeco! Terima kasih
typelogic