Saya ingin melacak proses yang memulai koneksi keluar pada desktop Linux. Yang terbaik yang bisa saya pikirkan adalah ini:
iptables -A OUTPUT -m state --state NEW -j LOG --log-uid
Ini mencatat uid / gid yang memulai koneksi, tetapi bukan nama proses / perintah atau bahkan pid. Jika saya bisa mendapatkan pid, saya mungkin bisa membuat skrip yang menarik nama proses ketika log ditulis, tetapi sepertinya itu bahkan tidak mungkin.
Idealnya saya juga ingin mencatat proses yang menerima koneksi masuk juga.
Adakah ide bagaimana ini mungkin dengan iptables [atau apa pun] pada kotak Linux?
Jawaban:
Anda dapat menulis sebuah program untuk memonitor / proc / net / tcp, yang hasilnya terlihat seperti ini:
Anda kemudian dapat menghubungkan port yang terbuka ke inode, yang dapat dihubungkan kembali ke proses dan deskriptor file dengan melakukan readlink pada deskriptor file yang terdaftar untuk setiap proses:
Lihat di sini bahwa inode 4847458 sesuai dengan soket tcp pertama dalam daftar di atas. Output dari netstat -tapn memverifikasi ini untuk saya (dan ingat 0x50 == 80):
Saat program monitor melihat adanya perubahan pada / proc / net / tcp, parsing data dan tentukan apakah perubahan tersebut merupakan soket yang baru dibuka. Kemudian Anda bisa menghitung semua deskriptor file untuk setiap proses yang terdaftar di / proc, melakukan readlink pada masing-masing untuk menemukan inode yang cocok. Setelah Anda menemukan itu, Anda memiliki pid yang memiliki, dari mana Anda bisa mendapatkan apa pun yang Anda inginkan, terutama jika Anda memiliki proses akuntansi.
Jika Anda tidak memerlukan pemberitahuan Anda secara instan, maka program monitor Anda dapat menggunakan jajak pendapat lambat (mungkin periode 50 ms atau 100 ms, atau bahkan 1000 ms).
sumber
Anda ingin modul kecocokan pemilik, yang hanya berfungsi pada rantai OUTPUT (dan mungkin PREROUTING ...?). Baca dokumen, tetapi akan berfungsi seperti ini:
sumber
Tidak ada hubungannya dengan iptables atau logging; tapi di sini ada antarmuka seperti "atas" yang memilih direktori / proc / dan menampilkan bandwidth per program / pid:
http://sourceforge.net/projects/nethogs
"NetHogs adalah alat 'net top' kecil. Alih-alih memecah traffic per protokol atau per subnet, seperti kebanyakan alat, NetHogs mengelompokkan bandwidth berdasarkan proses. NetHogs tidak bergantung pada modul kernel khusus yang akan dimuat."
sumber
Saat saya melihat pertanyaan serupa, mencoba untuk mempercepat skype, saya telah menemukan
adalah cara yang baik untuk menghubungkan nomor port ke pid / cmd, sekarang pid-pemilik / cmd-pemilik tidak lagi didukung secara langsung dalam iptables; Anda harus mem-parsing hasilnya, lalu menambahkan aturan iptables sesuai dengan port; secara alami Anda akan memerlukan beberapa kode pembersihan setelah / pada saat sistem shutdown / restart, dll; simpan nomor port ke file untuk referensi pada waktu pembersihan
sebenarnya jawaban yang bagus untuk pertanyaan nomor port adalah
Anda mungkin perlu menyesuaikan elemen grep tcp sesuai dengan kebutuhan Anda
maka untuk keperluan saya, itu paling sederhana untuk menambahkan tc u32 filter sesuai dengan nomor port, entri iptables sesuai dengan nomor port yang sama
sumber