Membuat multicast join untuk menangkap tcpdump

11

Saya ingin menulis skrip shell linux yang akan menangkap lalu lintas multicast tertentu. Khusus seperti dalam, saya ingin membuat file pcap yang memiliki semua lalu lintas untuk satu grup / port multicast tertentu.

Inilah baris perintah yang saya gunakan untuk melihat lalu lintas:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Ini berfungsi dengan baik selama saya memiliki langganan multicast ke grup yang sudah ada. Misalnya, jika saya menjalankan ini di konsol lain:

mdump 233.54.12.234 22001 10.13.252.51

tcpdumpakan melihat paket. Jika mdumptidak berjalan, tcpdumptidak melihat apa pun.

Apakah ada cara standar linux-y untuk membuat gabungan multicast ini sebelum memulai tangkapan? Saya bisa menggunakan mdumpuntuk membangun mdumpgabungan ini, tetapi itu tampaknya sia-sia karena akan memproses semua data pada grup, tetapi saya hanya akan membuangnya.

Perhatikan bahwa karena lingkungan spesifik saya, saya tidak disarankan untuk meletakkan antarmuka ke mode promiscuous. Bahkan mungkin dilarang.

John Dibling
sumber
1
Kecuali Anda menjalankan versi non-standar tcpdump, Anda akan menempatkan interface kedalam modus promiscuous - yang -pbendera, dalam versi standar tcpdump, ternyata modus promiscuous off , karena itu pada default. Dalam mode promiscuous, ia akan melihat semua lalu lintas, termasuk lalu lintas multicast, terlepas dari apakah Anda memiliki langganan yang ditetapkan - kecuali Anda berada di jaringan yang diaktifkan dan langganan harus dibuat agar peralihan Anda meneruskan lalu lintas.
1
@GuyHarris: Terima kasih atas klarifikasi. Saya berada di jaringan yang diaktifkan. Tanpa berlangganan sudah ditetapkan (yaitu dengan mdumpberjalan di konsol lain), tcpdumptidak melihat apa pun.
John Dibling
Dan jika mereka tidak ingin Anda menjalankan dalam mode promiscuous, mereka mungkin juga tidak ingin Anda (atau bahkan tidak akan membiarkan Anda) mengatur "port mirrored" pada switch (dengan asumsi switch mendukungnya) untuk mendapatkan salinan semua lalu lintas melalui sakelar (atau semua lalu lintas melalui porta tertentu, jika memungkinkan).
Jadi apa yang salah dengan melakukan ini dengan skrip? Yang penting adalah apakah itu menyelesaikan pekerjaan, bukan apakah seseorang menganggapnya "cara biasa" - apa "tidak biasa" tentang naskah?
Mode Promiscious dinonaktifkan karena mengaktifkannya, tampaknya, akan berdampak pada VM lain pada host. Ini tidak diinginkan. Saya dapat mengatur port mirroring di saklar - ini adalah arista 40GB - tapi saya tidak yakin saya mengerti maksud Anda.
John Dibling

Jawaban:

5

TL; DR - Pilih satu:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

socat STDIO UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 > /dev/null


Pada awalnya saya akan mengatakan "hanya menggunakan ip maddress adddan selesai dengan itu". Masalahnya ip maddresshanya mempengaruhi alamat multicast lapisan tautan bukan protokol alamat multicast ( man 8 ip-maddress).

Itu dikatakan menggunakan autojoinbendera dengan kata kerja alamat melakukan trik dengan baik.

Ini menimbulkan beberapa pertanyaan selanjutnya. Saya berasumsi karena Anda akan menjalankan tcpdumpatau tsharkbahwa Anda memiliki izin root. Jika Anda tidak 22001 adalah port bernomor tinggi dan utilitas lain seperti socatjuga akan menyelesaikan sesuatu.

Jangan mengambil kata-kata saya untuk itu. Hanya untuk menguji ini kita dapat menghasilkan paket UDP multicast dengan socatatau ncat(umumnya dikemas melalui nmap/ nmap-ncat).

Pada sejumlah host, jalankan salah satu dari dua kombinasi berikut:

Pilihan 1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

Pilihan 2:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 /dev/null &

Opsi pertama akan membutuhkan root, atau setidaknya kemampuan CAP_NET_ADMIN . Opsi kedua tidak memerlukan root, tetapi juga mengharapkan untuk berjalan di latar depan dan dengan demikian mungkin kurang kondusif untuk skrip (meskipun melacak ID proses anak dan membersihkannya dengan trapdi BASH mungkin hanya apa yang Anda cari.

Setelah selesai (tetapi sebelum kita mencoba pengujian tcpdump/ tsharkperintah), pastikan bahwa kernel mengenali antarmuka setelah bergabung dengan grup IGMP yang benar. Jika Anda merasa super mewah, Anda bisa membuat hex keluar /proc/net/igmp, tapi saya sarankan hanya berlari netstat -gn.

Setelah Anda memverifikasi bahwa Anda melihat antarmuka berlangganan grup yang benar jalankan perintah tcpdump Anda:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Atau, jika Anda tidak ingin sepenuhnya pergi ke rute tcpdump (atau menemukan jawaban ini dan hanya ingin tahu melihat tindakan multicast), Anda dapat menggunakan socatperintah di atas untuk bergabung dan menggemakan konten STDOUTdengan mengganti /dev/nulldengan STDOUT:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1

Kemudian, dari komputer lain gunakan salah satu dari dua opsi berikut untuk mengirim beberapa data uji sederhana:

Pilihan 1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

Pilihan 2:

ncat  -u 233.54.12.234 22001

Ketika Anda menjalankan salah satu dari perintah itu maka ia akan secara interaktif menunggu input. Cukup ketik beberapa hal, tekan enter untuk mengirim, lalu CTRL+Dketika Anda selesai mengirim EOFpesan.

Pada titik ini Anda seharusnya telah melihat tes ujung ke ujung dan dengan beberapa perintah membangun sistem obrolan terburuk, paling tidak aman di dunia.

Brian Redbeard
sumber
1
Wow, butuh 4 tahun untuk mendapatkan jawaban! Saya bahkan tidak melakukan ini lagi, dan benar-benar tidak memiliki cara untuk menguji, tetapi saya akan menerimanya.
John Dibling
1
Sangat berguna saat ini juga! : D Terima kasih Brian :)
quaylar