Bagaimana saya bisa menangkap lalu lintas jaringan dari satu proses?

93

Saya ingin memeriksa lalu lintas jaringan yang ditangani oleh satu proses, tetapi tangkapan jaringan sederhana tidak akan berfungsi karena saya berurusan dengan sistem yang sibuk (banyak lalu lintas lainnya terjadi pada saat yang sama). Apakah ada cara untuk mengisolasi tcpdumpatau wiresharkmenangkap lalu lintas jaringan dari satu proses spesifik? (Menggunakan netstattidak cukup.)

Kees Cook
sumber

Jawaban:

21

Memang ada caranya, menggunakan filter Wireshark . Tetapi Anda tidak dapat memfilter secara langsung berdasarkan nama proses atau PID (karena itu bukan jumlah jaringan).

Pertama-tama Anda harus mencari tahu protokol dan port yang digunakan oleh proses Anda ( perintah netstat dalam komentar sebelumnya berfungsi dengan baik).

Kemudian gunakan Wireshark untuk memfilter port masuk (atau keluar) dengan yang baru saja Anda ambil. Itu harus mengisolasi lalu lintas masuk dan keluar dari proses Anda.

OpenNingia
sumber
6
Untuk koneksi yang sederhana, ini mungkin, tetapi saya perlu melacak DNS, HTTP, dll, yang semuanya bergegas lewat, jadi tidak ada cara sederhana untuk hanya menggunakan netstatdan menangkap filter jaringan sederhana pada mesin yang sibuk.
Kees Cook
Ok, HTTP dan DNS port publik digunakan oleh banyak aplikasi, tetapi port pribadi yang sesuai unik. Jadi mengapa Anda tidak mencoba memfilter oleh port pribadi?
OpenNingia
Karena permintaan kecil yang cepat tidak akan terlihat oleh netstat; Saya hanya bisa menangkap koneksi berumur panjang. :(
Kees Cook
bagaimana jika proses menggunakan port dinamis pada saat run time, maka Anda tidak akan dapat menggunakan filter port statis
The Unix Janitor
Saya pikir Anda sudah di sini jawaban terbaik ... Sayangnya alat jaringan mengendus bekerja pada tingkat terendah dari tumpukan bersih, mencoba untuk menangkap semuanya, itu sama sekali tidak mengetahui proses yang berjalan pada OS. Akan sangat sulit untuk mengetahui apa yang berasal dari panggilan tertentu. Paket sniffer akhirnya dapat mengetahui (melalui nomor port) ID proses tetapi tidak dapat mengetahui proses mana yang melakukan pencarian DNS karena ini benar-benar independen (yang kemungkinan besar tumpukan net kernel yang memicu panggilan). Tetapi dengan memfilter dan menghentikan proses lain Anda harus dapat mencapai tujuan Anda.
Huygens
136

Untuk memulai dan memantau proses baru:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Untuk memantau proses yang ada dengan PID yang dikenal:

strace -p $PID -f -e trace=network -s 10000
  • -f adalah untuk "ikuti proses baru"
  • -e mendefinisikan filter
  • -s menetapkan batas string lebih dari 32
  • -p membutuhkan id proses untuk dilampirkan
Clausi
sumber
2
Ini berguna karena dapat digunakan tanpa memiliki akses root atau izin khusus (pada beberapa distribusi Linux, bagaimanapun - pada Ubuntu Anda mungkin memerlukan izin khusus).
Robin Green
1
Ini juga berguna, karena dapat dijalankan terhadap proses yang sudah diluncurkan dan tersedia di hampir semua kotak Linux.
zakmck
53

Saya tahu utas ini agak lama tetapi saya pikir ini mungkin membantu sebagian dari Anda:

Jika kernel Anda membolehkannya, menangkap lalu lintas jaringan dari satu proses sangat mudah dilakukan dengan menjalankan proses tersebut di ruang nama jaringan yang terisolasi dan menggunakan wireshark (atau alat jaringan standar lainnya) di ruang nama tersebut juga.

Penyiapannya mungkin terlihat sedikit rumit, tetapi begitu Anda memahaminya dan menjadi terbiasa dengannya, itu akan sangat memudahkan pekerjaan Anda.

Untuk melakukannya:

  • buat namespace jaringan uji:

    ip netns add test
    
  • buat sepasang antarmuka jaringan virtual (veth-a dan veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • ubah namespace aktif dari antarmuka veth-a:

    ip link set veth-a netns test
    
  • konfigurasikan alamat IP dari antarmuka virtual:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • konfigurasikan perutean dalam namespace tes:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • aktifkan ip_forward dan buat aturan NAT untuk meneruskan lalu lintas yang datang dari namespace yang Anda buat (Anda harus menyesuaikan antarmuka jaringan dan alamat ip SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (Anda juga dapat menggunakan aturan MASQUERADE jika Anda mau)

  • akhirnya, Anda bisa menjalankan proses yang ingin Anda analisis di namespace baru, dan wireshark juga:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Anda harus memantau antarmuka veth-a.

felahdab
sumber
4
Ide bagus, tapi waspadalah terhadap "keterbatasan". Karena ini adalah namespace yang terpisah, Anda tidak dapat berkomunikasi dengan proses lokal di namespace default menggunakan loopback address (es) atau soket domain UNIX. Yang terakhir mempengaruhi komunikasi melalui D-Bus.
Lekensteyn
@Lekensteyn Anda masih dapat menggunakan soket domain unix di seluruh ruang nama jaringan afaik. Sistem file tidak terisolasi oleh mereka.
Randandel
1
@randunel saya harus lebih tepat tentang itu. Yang ingin saya katakan adalah bahwa soket domain Unix di "abstrak soket namespace" (yang tidak menggunakan sistem file) tidak dapat secara langsung diakses antara ruang nama jaringan. Sebagai solusinya, Anda dapat menggunakan proxy sepertisocat .
Lekensteyn
Alamat IP apa yang Anda gunakan dengan --to-sourceargumen iptables? Apakah ini alamat IP dari antarmuka yang Anda berikan ke -oopsi, alamat IP yang Anda buat, atau ??? Saya mencoba versi topeng yang tidak perlu --to-source, seperti yang dijelaskan di sini , dan itu berhasil!
ntc2
3
Semua ini tampaknya memerlukan akses root.
simplegamer
15
netstat -taucp | grep <pid or process name>

Itu akan menunjukkan koneksi yang sedang dibuat aplikasi termasuk port yang sedang digunakan.

Oli
sumber
8
Ini akan menunjukkan koneksi yang ada untuk instan itu, tetapi itu tidak akan memberikan log lalu lintas itu sendiri.
Kees Cook
1
Tidak yakin tentang komentar Kees Cook. Netstat sederhana memperlihatkan info tentang koneksi untuk sesaat, tetapi dengan flag -c Anda mendapatkan snapshot dari keadaan itu setiap detik (lihat 'man netstat'). Mungkin tidak memiliki semua lalu lintas, tetapi bukan snapshot unik dari koneksi.
luar biasa
3
Ya saya yakin. Ini tidak akan menangkap semua lalu lintas jaringan dari suatu proses.
Reinier Post
Ini berguna untuk mencari tahu nomor port mana yang sedang diblokir oleh firewall internal. Ini menunjukkan TCP SYNs (bersama dengan alamat tujuan dan nomor port) yang dikirim oleh perintah yang saya jalankan.
Anthony Geoghegan
11

Hanya sebuah gagasan: Apakah mungkin untuk mengikat aplikasi Anda ke alamat IP yang berbeda? Jika demikian, Anda dapat menggunakan tersangka biasa ( tcpdump , dll.)

Alat untuk aplikasi yang tidak mampu mengikat ke alamat IP lain:

http://freshmeat.net/projects/fixsrcip

fixsrcipadalah alat untuk mengikat soket klien TCP dan UDP ( IPv4 ) keluar ke alamat IP sumber tertentu pada host multi-homed

http://freshmeat.net/projects/force_bind

force_bindmemungkinkan Anda untuk memaksa mengikat pada IP dan / atau port tertentu. Ia bekerja dengan IPv4 dan IPv6 .

Clausi
sumber
Sebagian besar aplikasi tidak mendukung menentukan IP sumber mereka, tetapi ini sebenarnya dimungkinkan dengan menggunakan wadah dengan CLONE_NEWNET tetapi tidak dengan CLONE_NEWNS.
Kees Cook
Atau, Anda dapat membuat namespace jaringan dan menjalankan aplikasi Anda di dalamnya www.evolware.org/?p=293
Flint
9

Saya telah datang ke masalah yang sama dan saya bisa mengatasinya berdasarkan jawaban ini dengan ioerror , menggunakan NFLOG seperti yang dijelaskan di sini :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Kemudian Anda dapat membuat menjalankan proses yang dimaksud dari akun pengguna yang tidak melakukan hal lain - dan voila, Anda baru saja mengisolasi dan menangkap lalu lintas dari satu proses tunggal.

Hanya ingin memposting kembali jika itu membantu siapa pun.

szymon
sumber
6

Saya menulis aplikasi C yang melakukan apa yang dijelaskan dalam jawaban di atas oleh felahdab!

Lihat di sini: nsntrace github repo

Jonas Danielsson
sumber
Itu keren, tapi saya pikir akan lebih baik untuk memasukkan beberapa rincian lebih lanjut tentang cara mendapatkannya dan menggunakannya :)
Zanna
Terima kasih! Saya memberikan tautan ke repo github yang menyimpan file README.md yang memiliki penggunaan dan contoh, dan mengunduh petunjuk!
Jonas Danielsson
5

Ini adalah hack kotor tapi saya sarankan pengalihan atau target log dengan iptables untuk UID yang diberikan. misalnya:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Mungkin juga layak untuk melihat sesuatu seperti '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid' untuk target log tersebut . Meskipun saya menduga itu hanya akan membantu Anda memposting proses pcap yang mencakup banyak data lainnya.

Target NFLOG mungkin berguna jika Anda ingin menandai paket dan kemudian paket yang ditandai akan dikirim melalui soket netlink ke proses yang Anda pilih. Saya ingin tahu apakah itu akan berguna untuk meretas sesuatu dengan wireshark dan aplikasi spesifik Anda berjalan sebagai pengguna tertentu?

ioerror
sumber
tetapi ini hanya berfungsi untuk keluar, bagaimana dengan incomming?
resultsway
5

Anda dapat mencoba tracedump - http://mutrics.iitis.pl/tracedump

Itu tidak persis apa yang Anda inginkan, Anda bisa memberikannya ID proses atau program untuk dijalankan.

pjf
sumber
1
Proyek yang bagus, tapi ... "Tracedump saat ini hanya berjalan di host Linux 32-bit" sayangnya, membunuh saya.
gertvdijk
4

Coba jalankan proses yang Anda minati di bawah strace :

strace ping www.askubuntu.com

Ini akan memberi Anda beberapa informasi yang sangat terperinci tentang apa yang dilakukan proses Anda. Karena suatu proses dapat membuka port apa saja yang diinginkan ke mana saja, menggunakan filter yang telah ditentukan sebelumnya Anda mungkin kehilangan sesuatu.

Pendekatan lain adalah dengan menggunakan mesin virtual stripped-down atau mesin uji di jaringan Anda, dan menempatkan proses Anda di atasnya dalam isolasi ini. Kemudian Anda bisa menggunakan Wireshark untuk menangkap semua dari mesin itu. Anda akan cukup yakin bahwa lalu lintas yang Anda tangkap akan relevan.

Unix Janitor
sumber
Menambahkan "-e trace = network" memangkas beberapa output, dengan mengorbankan kehilangan data yang sebenarnya ditulis ke jaringan. Jika Anda hanya peduli dengan "jumlah soket yang dibuka" atau serupa, ini membuat segalanya lebih mudah.
dannysauer
3

Membangun jawaban dengan ioerror Saya kira Anda dapat menggunakaniptables --uid-owner untuk menetapkan penanda pada lalu lintas, dan kemudian Anda dapat meminta wireshark untuk menangkap hanya lalu lintas dengan penanda itu. Anda mungkin dapat menggunakan DSCP (penanda layanan diferensial), id aliran atau penanda qos.

Atau memang Anda bisa menggunakan ini untuk mengirim paket-paket itu keluar antarmuka yang berbeda, dan kemudian menangkap hanya pada antarmuka itu.

Poolie
sumber
-1

mungkin iptables dan ulog dapat bekerja? Bukannya saya punya resep yang tepat, tapi saya pikir iptables bisa cocok dengan proses, sekali cocok Anda bisa menggunakan ulog.


sumber
3
Sayangnya, iptables -m owner --pid-owner $PIDtelah dihapus di Linux 2.6.14: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook
-1

Saya pikir Anda dapat membuat skrip shell untuk mengulang melalui menjalankan netstat dan masuk ke file teks. Sesuatu seperti (langkah yang sangat kasar):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

Saya bukan seorang programmer, jadi saya tidak bisa memperbaiki ini. Tetapi seseorang di sini dapat mulai dari tempat saya tinggalkan dan membuat skrip yang berfungsi untuk Anda.

tinhed
sumber
Tidak cukup baik. Pertanyaannya adalah untuk menangkap semua lalu lintas jaringan, bukan hanya apa pun yang terjadi untuk menjadi aktif pada saat Anda memeriksa.
Reinier Post