Linux

為 tcpdump 擷取創建多播連接

  • September 7, 2020

我想編寫一個 linux shell 腳本來擷取特定的多播流量。具體而言,我想創建一個 pcap 文件,其中包含一個特定多播組/埠的所有流量。

這是我用來查看流量的命令行:

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

只要我已經建立了對該組的多播訂閱,這就可以正常工作。例如,如果我在另一個控制台中執行它:

mdump 233.54.12.234 22001 10.13.252.51

tcpdump會看到數據包。如果mdump沒有執行,tcpdump則什麼也看不到。

在開始擷取之前是否有標準的 linux-y 方法來建立這些多播連接?我可以mdump用來建立這些連接,但這似乎很浪費,因為mdump將處理組上的所有數據,但我只是要把它扔掉。

請注意,由於我的特定環境,我一直不鼓勵將界面置於混雜模式。事實上,它可能是被禁止的。

TL;DR - 選擇一個:

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


起初我想說“只是使用ip maddress add它並完成它”。問題ip maddress僅影響鏈路層多播地址而不是協議多播地址(man 8 ip-maddress)。

話雖如此,使用帶有地址autojoin動詞的標誌可以很好地解決問題。

不過,這引發了一些後續問題。我假設因為您將執行tcpdumptshark您具有 root 權限。 如果您不這樣做, 22001 是一個高編號埠,其他實用程序socat也可以完成任務。

不過,不要相信我的話。socat只是為了測試這一點,我們可以使用or ncat(通常通過nmap/打包)生成多播 UDP 數據包nmap-ncat

在一些主機上執行以下兩種組合之一:

選項1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

選項 2:

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

第一個選項需要 root,或者至少需要能力 CAP_NET_ADMIN。第二個選項不需要root,但也希望在前台執行,因此可能不利於腳本編寫(儘管跟踪子程序ID並用BASH中的a清理它trap可能正是您正在尋找的。

一旦完成(但在我們開始測試tcpdump/tshark命令之前),請確保核心辨識出已加入正確 IGMP 組的介面。如果你覺得超級花哨,你可以瘋狂地解析出 hex /proc/net/igmp,但我建議只是執行netstat -gn.

一旦您確認您看到訂閱了正確組的介面,就會啟動您的 tcpdump 命令:

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

或者,如果您不想完全走 tcpdump 的路線(或者偶然發現了這個答案,只是好奇地想看看多播的實際效果),您可以使用socat上面的命令來加入並STDOUT通過替換/dev/null為來回顯內容STDOUT

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

然後,從另一台機器使用以下兩個選項之一發送一些簡單的測試數據:

選項1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

選項 2:

ncat  -u 233.54.12.234 22001

當您執行其中任何一個命令時,它將以互動方式等待輸入。只需輸入一些內容,按輸入鍵發送,CTRL+D完成後發送EOF消息。

至此,您應該已經看到了端到端的測試,並通過一些命令建構了世界上最糟糕、最不安全的聊天系統。

注意 如果您想離開使用ip addr add ...(選項 1)加入的多播組,您可以這樣做:

sudo ip addr del 233.54.12.234/32 dev eth1 autojoin

引用自:https://unix.stackexchange.com/questions/140384