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
tcpdump
akan melihat paket. Jika mdump
tidak berjalan, tcpdump
tidak melihat apa pun.
Apakah ada cara standar linux-y untuk membuat gabungan multicast ini sebelum memulai tangkapan? Saya bisa menggunakan mdump
untuk membangun mdump
gabungan 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.
sumber
-p
bendera, 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.mdump
berjalan di konsol lain),tcpdump
tidak melihat apa pun.Jawaban:
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 add
dan selesai dengan itu". Masalahnyaip maddress
hanya mempengaruhi alamat multicast lapisan tautan bukan protokol alamat multicast (man 8 ip-maddress
).Itu dikatakan menggunakan
autojoin
bendera dengan kata kerja alamat melakukan trik dengan baik.Ini menimbulkan beberapa pertanyaan selanjutnya. Saya berasumsi karena Anda akan menjalankan
tcpdump
atautshark
bahwa Anda memiliki izin root. Jika Anda tidak 22001 adalah port bernomor tinggi dan utilitas lain sepertisocat
juga akan menyelesaikan sesuatu.Jangan mengambil kata-kata saya untuk itu. Hanya untuk menguji ini kita dapat menghasilkan paket UDP multicast dengan
socat
atauncat
(umumnya dikemas melaluinmap
/nmap-ncat
).Pada sejumlah host, jalankan salah satu dari dua kombinasi berikut:
Pilihan 1:
Pilihan 2:
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 dengantrap
di BASH mungkin hanya apa yang Anda cari.Setelah selesai (tetapi sebelum kita mencoba pengujian
tcpdump
/tshark
perintah), 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 berlarinetstat -gn
.Setelah Anda memverifikasi bahwa Anda melihat antarmuka berlangganan grup yang benar jalankan perintah tcpdump Anda:
Atau, jika Anda tidak ingin sepenuhnya pergi ke rute tcpdump (atau menemukan jawaban ini dan hanya ingin tahu melihat tindakan multicast), Anda dapat menggunakan
socat
perintah di atas untuk bergabung dan menggemakan kontenSTDOUT
dengan mengganti/dev/null
denganSTDOUT
:Kemudian, dari komputer lain gunakan salah satu dari dua opsi berikut untuk mengirim beberapa data uji sederhana:
Pilihan 1:
Pilihan 2:
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+D
ketika Anda selesai mengirimEOF
pesan.Pada titik ini Anda seharusnya telah melihat tes ujung ke ujung dan dengan beberapa perintah membangun sistem obrolan terburuk, paling tidak aman di dunia.
sumber