为tcpdump捕获创建多播联接


11

我想编写一个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它将处理组中的所有数据,但是我只是将其丢弃。

请注意,由于我的特定环境,我们不建议将接口置于混杂模式。实际上,它可能被禁止。


1
除非你正在运行的是非标准版的tcpdump,你把接口为混杂模式- -p旗,在tcpdump的标准版本,打开混杂模式关闭,因为它是默认情况下。在混杂模式下,无论您是否已建立订阅,它都应查看​​所有流量,包括多播流量-除非您位于交换网络上,并且必须建立订阅才能使交换机将流量转发给您。

1
@GuyHarris:感谢您的澄清。我在交换网络上。如果尚未建立订阅(即mdump在另一个控制台中运行),则tcpdump看不到任何内容。
John Dibling 2014年

而且,如果他们不希望您在混杂模式下运行,他们可能也不想让您(或什至不让您)在交换机上设置“镜像端口”(假设交换机甚至支持该端口)通过交换机的所有流量的副本(或者如果可能的话,通过特定端口的所有流量的副本)。

那么用脚本执行此操作有什么问题呢?重要的是是否完成工作,而不是有人是否认为它是“通常的方式”-脚本的“不寻常”是什么?

禁用Promiscious模式,因为启用它显然会影响主机上的其他VM。这是不希望的。我可以在交换机上设置一个镜像端口-这是40GB aristas-但我不确定我是否明白你的意思。
John Dibling 2014年

Answers:


5

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也可以完成任务。

不过不要相信我。为了进行测试,我们可以使用socatncat(通常通过nmap/ 打包nmap-ncat)生成多播UDP数据包。

在某些数量的主机上运行的一个下面的两个组合:

选项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并用trapBASH 清除它可能正是您要的内容。

一旦完成(但在进行测试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上面命令加入和呼应内容,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

当您运行这些命令中的任何一个时,它将交互地等待输入。只需输入一些内容,然后按Enter键即可发送,然后CTRL+D在完成发送EOF消息后输入。

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


1
哇,花了4年时间才得到答案!我什至没有这样做,并且确实没有办法进行测试,但是我仍然会接受。
John Dibling

1
立即派上用场!:D谢谢布赖恩:)
quaylar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.