Bagaimana saya bisa menemukan proses mana yang mengirim data ke port tertentu?

21

Saya punya layanan, menjaga port tertentu tetap terbuka.

Saya mendapatkan data untuk itu, yang saya tidak harapkan atau tidak ingin dapatkan, dan saya mencoba untuk menunjukkan dengan tepat sumber data ini. Jadi bagaimana saya bisa menemukan proses mana yang mengirimkan data ke port tertentu, sebagai lawan dari proses mana yang mendengarkan.

pengguna50849
sumber

Jawaban:

23

Untuk TCP (meskipun pendekatan yang sama akan bekerja untuk SCTP 1 atau protokol transport berorientasi koneksi), sama seperti untuk mencari yang mendengarkan:

lsof -nPi tcp:the-port

Akan melaporkan proses yang memiliki soket TCP terbuka di port itu. Jika Anda tahu porta sumbernya (aplikasi server Anda bisa mengetahuinya dan mencatatnya), Anda bisa menggunakannya untuk menentukan klien jahat.

Untuk soket UDP atau RAW, akan lebih sulit meskipun saya kira di situlah sesuatu seperti systemtap atau dtrace bisa berguna. Mungkin diaudit juga.


1 Meskipun dukungan SCTP (hanya untuk Linux) ditambahkan ke lsofdalam versi 4.86, Anda tidak dapat menggunakan -iuntuk meminta soket SCTP secara eksplisit. Di sini dapat digunakan lsof -nP | grep -w 'SCTP.*:the-port'sebagai heuristik sebagai gantinya.

Stéphane Chazelas
sumber
Ini tidak berfungsi untuk SCTP untuk saya.
sudo
1
@sudo, lihat edit
Stéphane Chazelas
3

Coba ikuti:

$sudo ss -tp

Atau:

$sudo netstat -A inet -p

Untuk menghindari hasil localhost:

$sudo netstat -A inet -p | grep -v localhost

Untuk mencantumkan hanya koneksi ESTABLISHED:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
Amol
sumber
2

Bergantung pada jenis koneksi yang dibangunnya untuk mengirim data, salah satu dari pendekatan ini akan membawa Anda ke suatu tempat.

  • Gunakan tcpdump port 1234untuk memperoleh data yang dikirim ke port ini. Anda dapat menggunakan program seperti Wireshark untuk menganalisisnya di komputer lain (ditangkap ke file menggunakan -wopsi). Atau, gunakan Wireshark secara langsung.

  • Dalam kasus itu membangun dan tetap membuka koneksi tcp / udp yang dapat Anda gunakan netstatuntuk menemukan IP jarak jauh dari koneksi.

  • Tuliskan soket terbuka dari suatu proses seperti dalam jawaban yang diberikan oleh @StephaneChazelas.

gertvdijk
sumber
1

Anda dapat menggunakan sockstatperintah untuk menemukan proses yang memulai koneksi ke layanan Anda pada host lokal.

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

Cocokkan semua koneksi sumber ke tujuan Anda. Ini berfungsi dengan baik untuk soket TCP / UDP / UNIX.

Andrey Voitenkov
sumber
0

Pada Solaris, menjalankan pfile pada semua proses harus menunjukkan proses mana yang memiliki koneksi terbuka. Ini membutuhkan pengarsipan yang cermat, mungkin menggunakan opsi -A, -B ggrep ...

Di Linux, netstat -anp --inetakan berfungsi, bahkan tanpa lsof diinstal. (jatuhkan juga --inetuntuk mendapatkan soket domain Unix)

Gert van den Berg
sumber