linux – 为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).

用自动连接标志和地址动词说的就是诀窍.

这引发了一些后续问题.我假设你将运行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.

在这一点上,您应该已经看到了端到端测试,并且使用一些命令构建了世界上最糟糕,最不安全的聊天系统.

上一篇:tcpdump的使用总结


下一篇:Android 使用DexClassLoader要执行其他apk方法