為 tcpdump 擷取創建多播連接
我想編寫一個 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
動詞的標誌可以很好地解決問題。不過,這引發了一些後續問題。我假設因為您將執行
tcpdump
或tshark
您具有 root 權限。 如果您不這樣做, 22001 是一個高編號埠,其他實用程序socat
也可以完成任務。不過,不要相信我的話。
socat
只是為了測試這一點,我們可以使用orncat
(通常通過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