Apa cara termudah untuk mengendus data lalu lintas TCP di Linux?

79

Saya ingin cara sederhana untuk menunjukkan semua data TCP (bukan header TCP atau apa pun) melalui antarmuka apa pun di kotak Linux saya.

Sebagai contoh, saya ingin perintah ajaib yang jika saya lakukan:

magic_commmand_I_want port=1234

maka jika ada server mendengarkan pada port 1234 di komputer saya, dan seseorang melakukannya:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Maka perintah magis hanya akan mencetak:

hello

Saya sudah mencoba "tcpdump", "ethereal", "tethereal", "tshark", dan lainnya, tetapi tidak jelas bagaimana Anda membuatnya:

  • tidak menunjukkan alamat IP atau metadata lainnya
  • hanya menunjukkan "data" yang dikirim, bukan paket individual dan headernya
  • cetak data apa adanya, bukan dalam hex, dan tidak dengan marker packet-offset
  • hirup semua lalu lintas jaringan (apakah itu pada eth0 atau eth1 atau lo , dll ...)

Ya, Anda mungkin bisa merangkai satu set perintah unix untuk melakukan ini, tapi itu tidak mudah diingat untuk waktu berikutnya :)

Jika Anda memiliki contoh sederhana dari baris perintah persis yang melakukan ini, itulah yang saya inginkan.

Dustin Boswell
sumber
2
tcpdump adalah perintah ajaib yang Anda inginkan. Wireshark adalah GUI yang bagus di atas perpustakaan menggunakan tcpdump
Vinko Vrsalovic
3
Saya tahu ini adalah pertanyaan lama tapi saya ingin tahu mengapa menggunakan nc untuk "sisi server" juga bukan pilihan? "nc-l 1234" menciptakan server yang mendengarkan pada port 1234 dan mencetak apa pun yang dikirim dan menutup koneksi. Jika Anda ingin menjaga koneksi tetap hidup dan tidak memutuskan, Anda dapat menambahkan opsi "-k".
StFS
2
@ STFS karena dia ingin mengendus port yang sedang berjalan dan nc akan mengeluh.
infoclogged

Jawaban:

106

Memperbarui:

Seperti yang ditunjukkan oleh Michal dalam komentar: Dari tcpflow versi 1.3 opsi -e digunakan untuk menentukan nama pemindai. Jadi kesalahan "Nama pemindai tidak sah '8983'" dicetak. Perintah yang benar adalah

sudo tcpflow -i any -C -J port 1234

(juga -Jtelah diubah menjadi -gdalam rilis terbaru)


Terima kasih kepada Yves karena mengarahkan saya ke " tcpflow ". Inilah baris perintah:

tcpflow -i any -C -e port 1234  # as root, or with sudo

Ini melakukan semua yang saya inginkan

  • menampilkan data byte-for-byte saat masuk
  • tidak menampilkan metadata lainnya
  • mendengarkan semua antarmuka (sehingga menangkap data yang berasal dari dalam mesin dan dari luar)

" -C" Memberitahukannya untuk melakukan dump ke konsol alih-alih file. " -e" Memungkinkan warna sehingga klien -> server dan server -> klien secara visual berbeda.

Saya menginstal tcpflow hanya dengan melakukan

sudo apt-get install tcpflow
Dustin Boswell
sumber
2
Wow. tcpflow luar biasa, terima kasih! Menyelamatkan saya BANYAK rasa sakit yang saya alami dengan wireshark. Wireshark, tcpdump, dll memiliki terlalu banyak info dan tidak benar-benar melakukan apa yang diminta pertanyaan aslinya. tcpflow sangat cocok untuk ini.
Russ
10
Dari tcpflow versi 1.3 -eopsi digunakan untuk menentukan nama pemindai. Jadi kesalahan "Nama pemindai tidak sah '8983'" dicetak. Perintah yang benar adalahsudo tcpflow -i any -C -J port 1234
Michal Kováč
6
Catatan yang -Jtelah diubah menjadi -gdalam rilis terbaru.
tvon
2
Seseorang perlu menjelaskan kepada penulis alat apa arti istilah "kompatibilitas mundur"!
Sridhar Sarnobat
Ini mencetak "hal-hal" dua kali, bagi saya. Mengapa demikian ? lpaste.net/3984129577801744384
user1198559
29

socat adalah alat yang Anda minta. Itu dapat bertindak sebagai proxy:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

maka aplikasi Anda harus menghubungkan port 4444 bukannya langsung terhubung ke 1234

Opsi -v adalah untuk socat untuk mencetak semua yang diterimanya pada kesalahan standar (stderr).

Memperbarui:

Jika socat tidak tersedia di mesin Anda, Anda mungkin masih meniru seperti itu dengan netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

peringatan: opsi ini searah. contoh netcat kedua akan mencetak respons dari server Anda ke output standar. Anda masih dapat melakukannya:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
yves Baumes
sumber
Misalkan saya tidak memiliki kontrol atas klien dan server, (atau saya tidak ingin menghentikannya), jadi saya tidak dapat mengubah port mana yang terlibat atau memotong lalu lintas. Lalu apa?
20

Coba Wireshark . Ini adalah penganalisa protokol yang sangat baik yang ditargetkan untuk Linux dan Windows.

Kevin Boyd
sumber
3
Pengalaman saya adalah bahwa antarmuka benar-benar payah di linux.
Joe Phillips
sialan, Anda sampai di sana sebelum saya, +1 di wireshark
Bisakah Anda memberi contoh command-line?
Lihat tautan ini wiki.wireshark.org/Tools Ini memberikan daftar alat baris perintah untuk wireshark. Carilah Dumpcap.
Kevin Boyd
13

tcpflow adalah apa yang Anda inginkan. Ekstrak dari halaman manual:

DESCRIPTION
tcpflow adalah program yang menangkap data yang dikirim sebagai bagian dari koneksi TCP (arus), dan menyimpan data dengan cara yang nyaman untuk analisis protokol atau debugging. Sebuah program seperti tcpdump (4) menunjukkan ringkasan paket yang terlihat pada kabel, tetapi biasanya tidak menyimpan data yang sebenarnya sedang dikirim. Sebaliknya, tcpflow merekonstruksi aliran data aktual dan menyimpan setiap aliran dalam file terpisah untuk analisis selanjutnya. tcpflow memahami nomor urutan TCP dan akan merekonstruksi aliran data dengan benar terlepas dari pengiriman ulang atau pengiriman yang tidak sesuai pesanan.

tcpflow menyimpan semua data yang diambil dalam file yang memiliki nama formulir

192.168.101.102.02345-010.011.012.013.45103

di mana isi file di atas akan menjadi data yang ditransmisikan dari host 192.168.101.102 port 2345, untuk host 10.11.12.13 port 45103.

Siapkan koneksi dari aplikasi aplikasi Anda ke server Anda. Saat koneksi aktif dan berjalan, tcpflow masih dapat mengambil data darinya Sebagai contoh:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Setiap data akan disimpan dalam file bernama 127.000.000.001.48842-127.000.000.001.05555.

Anda masih dapat mengarahkan ini pada output standar dengan opsi -Cs. Baca halaman manual untuk bermain dengan ekspresi untuk menyetel paquets yang Anda ingin tcpflow tangkap.

Yves Baume
sumber
2

ngrepsangat bagus untuk ini. Dibutuhkan string BPF dan string opsional untuk mencari di dalam paket, dan kemudian membuang konten paket ke layar dalam format yang sangat berguna. Opsinya juga membuang ke file pcap_dump yang dapat Anda periksa lebih dekat di Wireshark nanti.

hobbs
sumber
0

Lihatlah Chaosreader . Meskipun sedikit lebih banyak dari yang Anda minta dan sedikit berbeda, mungkin Anda bisa memodifikasi kode untuk melakukan apa yang Anda inginkan.

Andrew Y
sumber
-1

Mungkin Anda dapat menulis pembungkus untuk tcpdump, misalnya, yang akan menghapus semua informasi yang berlebihan

dimba
sumber