Bagaimana cara melacak aktivitas jaringan dari suatu perintah?

13

Saya ingin melacak aktivitas jaringan dari suatu perintah, saya mencoba tcpdump dan strace tanpa hasil.

Sebagai contoh, Jika saya menginstal paket atau menggunakan perintah apa pun yang mencoba menjangkau beberapa situs, saya ingin melihat aktivitas jaringan tersebut (situs yang dicoba untuk dijangkau).

Saya kira kita bisa melakukan ini dengan menggunakan tcpdump. Saya mencoba tetapi melacak semua aktivitas jaringan sistem saya. Katakanlah jika saya menjalankan beberapa perintah yang berhubungan dengan jaringan dan saya ingin melacak hanya aktivitas jaringan perintah tertentu, saat itu sulit untuk menemukan solusi yang tepat.

Apakah ada cara untuk melakukan itu?

MEMPERBARUI:

Saya tidak ingin melacak semua yang terjadi pada antarmuka jaringan saya. Saya hanya ingin melacak perintah (misalnya # yum install -y vim) aktivitas jaringan. Seperti situs yang dicoba untuk dijangkau.

Buvanesh Kumar
sumber
1
Masukkan aplikasi dalam namespace jaringan, lalu gunakan tcpdump / wireshark. Lihat misalnya di sini .
dirkt

Jawaban:

17

netstat untuk kesederhanaan

Menggunakan netstatdan memahami PID atau nama proses:

# netstat -np --inet | grep "thunderbird"
tcp        0      0 192.168.134.142:45348   192.168.138.30:143      ESTABLISHED 16875/thunderbird
tcp        0      0 192.168.134.142:58470   192.168.138.30:443      ESTABLISHED 16875/thunderbird

Dan Anda dapat menggunakan watchuntuk pembaruan dinamis:

watch 'netstat -np --inet | grep "thunderbird"'

Dengan:

  • -n: Tampilkan alamat numerik alih-alih mencoba menentukan host simbolik, port atau nama pengguna
  • -p: Tunjukkan PID dan nama program yang dimiliki oleh setiap soket.
  • --inet: Hanya tampilkan soket protokol mentah, udp dan tcp.

strace untuk kata kerja

Anda bilang Anda mencoba stracealat ini, tetapi apakah Anda mencoba opsi itu trace=network? Perhatikan bahwa hasilnya bisa sangat bertele-tele, jadi Anda mungkin perlu beberapa grepping. Anda bisa mulai dengan memahami "sin_addr".

 strace -f -e trace=network <your command> 2>&1 | grep sin_addr

Atau, untuk proses yang sudah berjalan, gunakan PID:

 strace -f -e trace=network -p <PID> 2>&1 | grep sin_addr
Gohu
sumber
+1 netstatyang merupakan solusi IMHO paling sederhana dan rapi.
dr01
@ Gohu saya melakukan hal yang sama untuk dnf. tapi tidak berhasil. Saya mencoba menginstal beberapa paket menggunakan dnf, kemudian saya melihat bahwa proses dnf sedang berjalan (nama proses: dnf sesuai dengan perintah top dan ps aux). Sayangnya, saya tidak mendapatkan output dari netstat -np --inet | grep "dnf".
Buvanesh Kumar
+1 untuk strace. Ini mengatasi masalah saya. Saya bisa mendapatkan alamat IP. Terima kasih banyak atas jawaban Anda :) @Gohu. Saya kira itu memberikan semua alamat IP yang menjangkau melalui jaringan (mis. IP router dan IP lainnya). Jika Anda tahu, apakah mungkin untuk melacak hanya IP tujuan?
Buvanesh Kumar
Anda dapat mencoba dan memfilter straceoutput lagi, hanya menyimpan connectsyscalls dan menghapus dnspermintaan (port 53) dengan:| grep connect | grep -v 'sin_port=htons(53)'
Gohu
+1 untuk opsi jejak jaringan pada strace
phreed
5

Saya akan membuat namespace jaringan baru , menjembatani itu ke jaringan nyata, dan kemudian memantau jembatan dengan tcpdump.

Simon Richter
sumber
1
Terima kasih atas jawabannya. Akan sangat bagus jika Anda memberi tahu saya caranya :).
Buvanesh Kumar
5

sysdig memungkinkan Anda untuk memantau semua aktivitas kernel atau beberapa perintah yang berjalan di sistem Anda dalam perjalanan, termasuk dan tidak terbatas pada aktivitas jaringan.

Karena hasilnya bisa besar, Anda harus membuat filter, halaman default untuk filter paling dasar cukup mudah dipahami.

Ini juga memiliki keuntungan karena tidak digunakan sebagai pembungkus aplikasi seperti pada strace, dan itu bisa sangat kuat.

Dari Contoh Sysdig

Jaringan

Lihat proses teratas dalam hal penggunaan bandwidth jaringan

sysdig -c topprocs_net 

Tampilkan data jaringan yang dipertukarkan dengan host 192.168.0.1

Sebagai biner:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1   

Sebagai ASCII:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1 

Lihat port server lokal teratas:

Dalam hal koneksi yang dibangun:

sysdig -c fdcount_by fd.sport "evt.type=accept"   

Dalam hal total byte:

sysdig -c fdbytes_by fd.sport 

Lihat IP klien teratas

Dalam hal koneksi yang dibangun

sysdig -c fdcount_by fd.cip "evt.type=accept"   

Dalam hal total byte

sysdig -c fdbytes_by fd.cip 

Daftar semua koneksi yang masuk yang tidak dilayani oleh apache.

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
Rui F Ribeiro
sumber
1

Anda bisa menggunakan wireshark untuk mengendus semua lalu lintas input dan output dari antarmuka jaringan. Jika Anda membutuhkan opsi tanpa GUI, Anda dapat menggunakan tshark.

Dengan kedua opsi tersebut, Anda dapat melihat semua lalu lintas jaringan dan menyimpannya untuk kemudian menganalisis semua koneksi yang ada.

Ricard Molins
sumber
1
Seperti yang saya katakan sebelumnya, Jika saya menjalankan beberapa perintah yang berhubungan dengan jaringan, lalu bagaimana saya bisa tahu perintah mana yang mendapatkan situs mana?
Buvanesh Kumar
Ini adalah jawaban yang lebih umum. Itu saya sudah tahu bahwa kita dapat melacak aktivitas jaringan dari antarmuka jaringan :). Saya mencari pelacakan statika jaringan perintah tertentu.
Buvanesh Kumar
Jika Anda tahu port mana yang digunakan perintah, Anda mungkin bisa memfilter sniff untuk membatasinya ke perintah yang Anda inginkan. Namun ini mungkin tidak dapat dilakukan dalam situasi Anda.
Ricard Molins