我想写一个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
).
用自动连接标志和地址动词说的就是诀窍.
这引发了一些后续问题.我假设你将运行tcpdump或tshark,你有root权限.如果你没有22001是一个高编号的端口,而像socat这样的其他工具也可以完成任务.
尽管如此,不要相信我的话.为了测试这一点,我们可以使用socat或ncat生成多播UDP数据包(通常通过nmap / 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或至少capability CAP_NET_ADMIN.第二个选项不需要root,但也希望在前台运行,因此可能不太有利于编写脚本(虽然跟踪子进程ID并使用BASH中的trap
进行清理可能正是您正在寻找的内容.
一旦完成(但在我们开始测试我们的tcpdump / tshark命令之前)确保内核识别出已加入正确IGMP组的接口.如果你感觉非常喜欢你可以解析/ proc / net / igmp中的十六进制,但我建议只运行netstat -gn.
一旦您确认您看到订阅了正确组的接口启动了您的tcpdump命令:
tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234
或者,如果你不想完全走tcpdump的路径(或者偶然发现这个答案并且只是好奇地看到多播在行动中)你可以使用上面的socat命令通过替换/ dev /来加入内容并将其回显到STDOUT STDOUT为null:
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
当您运行其中任何一个命令时,它将以交互方式等待输入.只需键入一些内容,按Enter键发送,然后在完成发送EOF消息时按CTRL D.
在这一点上,您应该已经看到了端到端测试,并且使用一些命令构建了世界上最糟糕,最不安全的聊天系统.