Bagaimana saya bisa memonitor semua permintaan / koneksi keluar dari mesin saya?

71

Mesin saya adalah server jadi saya ingin mengabaikan koneksi yang dibuat ke server saya (misalnya ketika seseorang mengunjungi situs web saya). Saya ingin melihat hanya koneksi / permintaan yang dibuat oleh server saya ke tempat lain.

Bagaimana saya hanya melihat koneksi keluar itu?

EDIT: Saya baru mengenal hal-hal semacam ini. Yang saya coba lakukan hanyalah melihat apakah ada sesuatu dari server saya yang dikirim selain data untuk aplikasi web saya. Misalnya, jika seseorang mengunjungi situs web saya, maka jelas server saya akan mengirimkan data ke browser klien. Tapi misalkan ada juga kode di suatu tempat dalam kerangka aplikasi web saya yang mengirimkan data statistik ke tempat lain yang tidak saya sadari. Saya ingin melihat tempat-tempat server saya mengirim data, jika ada. Ini mungkin tidak mungkin, tetapi anggaplah Anda memutuskan untuk menggunakan kerangka php atau nodejs yang tidak Anda tulis: ada kemungkinan kecil itu mungkin mengirim beberapa jenis data di suatu tempat. Jika demikian, itulah yang ingin saya lihat.

trusktr
sumber

Jawaban:

77

Gunakan netstat. Sebagai contoh

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

mendaftar semua koneksi keluar UDP ( u), TCP ( t) dan RAW ( w) (tidak menggunakan latau a) dalam bentuk numerik ( n, mencegah kemungkinan permintaan DNS yang sudah berjalan lama) dan termasuk program ( p) yang terkait dengan itu.

Pertimbangkan untuk menambahkan copsi agar output diperbarui terus menerus.

gertvdijk
sumber
Terima kasih. Itu info bagus. Bisakah Anda melihat pertanyaan saya yang diperbarui?
trusktr
1
Benar-benar tidak dibajak (kecuali bahwa jawaban ini googled dengan baik): Jawaban ini juga berfungsi dengan Windows. Untuk digunakan netstatdalam "mode berkelanjutan" di sana, -ctidak berfungsi. Anda menggunakan angka sebagai gantinya, ingin netstat -na 1 | find "[Scan_Host_IP_Addr]"untuk memperbarui setiap 1detik (dalam contoh ini). ( sumber ).
ruffin
4
Jajak pendapat ini, jadi itu tidak akan selalu menangkap semua koneksi.
reinierpost
Apakah ada cara untuk menampilkan lebih banyak informasi yang ramah pengguna seperti nama domain, info tentang ip? Mungkin menggunakan skrip khusus?
awm
@ Wah Yah, itu bisa dilakukan dengan stracepada proses, memfilter untuk pencarian server nama (tidak ada detail, ini bukan jawaban lengkap untuk itu). Atau, Anda dapat menunjukkan DNS terbalik dari IP yang terdaftar netstatdengan menghilangkan nopsi yang termasuk dalam jawaban saya.
gertvdijk
11

Jika Anda hanya ingin mencatat setiap upaya koneksi, yang termudah mungkin adalah iptables LOGtarget di Linux (atau fitur firewall logging yang setara pada sistem Anda).

Jika Anda memerlukan informasi lebih lanjut seperti durasi koneksi dan jumlah data yang dipertukarkan di kedua arah, maka conntrackd(di Linux) mungkin merupakan pilihan terbaik.

Namun perhatikan bahwa kedua di atas hanya mencatat lalu lintas yang melewati netfilter, yang umumnya semua lalu lintas tetapi tidak memperhitungkan lalu lintas yang dihasilkan dengan tumpukan IP di ruang pengguna (seperti mesin virtual atau apa pun yang menggunakan soket mentah) atau lalu lintas yang dijembatani.

Untuk solusi yang lebih umum, Anda dapat melihat hal-hal seperti argus, bro-ids, sancpatau ntopyang log segala macam informasi berdasarkan lalu lintas mereka mengendus pada sebuah antarmuka.

Stéphane Chazelas
sumber
9

Saya sudah mencoba sekelompok alat, termasuk iftop, ntop, iptraf, dan tentu saja sangat berguna built-in netstat -tupln(didukung pilihan yang OS-dependent), tetapi yang paling praktis untuk kasus penggunaan saya ternyata nethogs- agregat koneksi oleh penyelenggara asal aplikasi , dan paling tidak berisik dari semua.

Diinstal melalui:

sudo apt-get install nethogs

Jalankan sebagai root:

sudo nethogs

Jika tujuan Anda adalah melihat semua koneksi TCP yang diprakarsai oleh aplikasi apa pun maka Anda dapat menggunakan:

sudo tcpdump -i lo -A | grep Host:
ccpizza
sumber
6

Apa yang saya pikir ingin Anda lakukan adalah mendapatkan daftar port mendengarkan dan kemudian menghapusnya dari koneksi TCP lainnya, maka itu akan menjadi semua koneksi keluar. Perintah ss (status soket) menampilkan kolom "Alamat Lokal: Port" dan "Alamat Peer: Port", kita perlu menghapus port mendengarkan dari kolom "Alamat Lokal: Port" dan bukan kolom "Alamat Peer: Port", jika tidak, Anda mungkin kehilangan beberapa koneksi keluar. Jadi untuk mencapai itu saya menggunakan di \s{2}+belakang string ": $ port" di grep agar sesuai dengan spasi yang ada di belakang kolom "Alamat Lokal: Port"; kolom itu memiliki dua atau lebih spasi putih di belakangnya, di mana "Peer Address: Port" memiliki satu spasi dan kemudian baris baru (grrr ... seharusnya hanya memiliki baris baru, IMO,\s+\s{2}+.) Biasanya saya mungkin mencoba menggunakan fungsi pemfilteran ss, seperti dengan ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Tapi sepertinya ada batasan berapa lama string itu, itu meledak pada sistem di mana saya punya banyak port mendengarkan. Jadi saya mencoba melakukan hal yang sama dengan grep. Saya percaya yang berikut ini akan berhasil:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Catatan ini tergantung pada versi ss yang Anda gunakan, versi yang lebih lama (seperti: ss utility, iproute2-ss111117) memiliki format output yang berbeda, jadi Anda mungkin harus menggunakan $ 3 bukannya $ 4 di awk. Perhatikan juga ss -tlndan ss -tn state listeningmemberi Anda output yang berbeda, yang sedikit kontra-intuitif bagi saya. YMMV.

Saya menemukan solusi yang sedikit lebih elegan yang tidak perlu mengetahui IP host, ss -tn state established dst :*berfungsi dengan baik, saya memodifikasi baris perintah di atas.

Lembah
sumber
Tolong tambahkan penjelasan bagaimana cara kerjanya? ( Edit jawabannya; jangan memposting informasi yang mengklarifikasi sebagai komentar.) Saya pikir saya sudah sebagian mengetahuinya. Sepertinya mungkin perlu sedikit lebih banyak pekerjaan. Saya berlari ss -tn state listeningpada sebuah host yang menjalankan server FTP, dan secara alami perintah menunjukkan bahwa mesin sedang mendengarkan pada port 21. Jadi tidak berarti bahwa egrep -vakan menyaring semua host remote yang alamat IPnya termasuk "21" (termasuk "210 "," 211 "," 212 ", ...)? Juga, apakah asortbenar - benar perlu, atau hanya ganti jendela?
G-Man
Saya harus memperbaiki semuanya, naskah yang diperbaiki ada di atas.
Dale
Pada akhirnya, akan jauh lebih baik jika ss atau netstat hanya akan menyertakan fungsi ini di dalamnya. Lakukan ss --outuntuk mendapatkan daftar koneksi keluar.
Dale
Bagus, saya suka jawaban ini. Saya akan mencobanya ketika saya kembali untuk meningkatkan keamanan di server saya. : D
trusktr
Sepertinya ini bisa digunakan untuk UDP juga, tetapi Anda hanya harus menggunakan flag dan status yang berbeda, tentu saja.
Dale
4

tcpdumpmemungkinkan Anda untuk melihat semua lalu lintas IP yang mengalir ke / dari antarmuka tertentu dengan kemampuan untuk memfilter berdasarkan kriteria tertentu. tcpdumpbiasanya diinstal pada kebanyakan sistem * nix secara default, jika tidak biasanya ada port di suatu tempat untuk mengambilnya untuk distro spesifik Anda.

txtechhelp
sumber
2

netstat adalah pilihan yang baik. Gunakan parameter sesuai kebutuhan. (lihat halaman manualnya) Sebagai contoh

netstat -antup

Di sini ia dapat memonitor semua (a) mendengarkan numerik (n) tcp (t) dan udp (u) proses (p).

Anda juga dapat mencoba ssperintahnya. Untuk penggunaan referensi:

SS Linux TCP / UDP Network dan Socket Information

Kratos
sumber
1

Jika Anda menjalankan Solaris atau turunan, lihat conntrack

Jlliagre
sumber
Bagus, itu juga tersedia di Arch Linux: archlinux.org/packages/community/i686/conntrack-tools - Bisakah Anda memberikan contoh bagaimana Anda akan menggunakan conntrack untuk melihat hanya koneksi yang dimulai dari lokal tetapi tidak koneksi dimulai dari tempat lain?
trusktr