为 tcpdump 捕获创建多播加入

Joh*_*ing 13 linux shell-script multicast tcpdump

我想编写一个 linux shell 脚本来捕获特定的多播流量。具体来说,我想创建一个 pcap 文件,其中包含一个特定多播组/端口的所有流量。

这是我用来查看流量的命令行:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234
Run Code Online (Sandbox Code Playgroud)

只要我已经建立了对该组的多播订阅,这就可以正常工作。例如,如果我在另一个控制台中运行它:

mdump 233.54.12.234 22001 10.13.252.51
Run Code Online (Sandbox Code Playgroud)

tcpdump会看到数据包。如果mdump没有运行,tcpdump则什么也看不到。

在开始捕获之前,是否有标准的 linux-y 方法来建立这些多播连接?我可以mdump用来建立这些连接,但这似乎很浪费,因为mdump将处理组上的所有数据,但我只是打算将其丢弃。

请注意,由于我的特定环境,我不鼓励将界面置于混杂模式。事实上,它可能被禁止。

Bri*_*ard 10

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

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

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

选项1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin
Run Code Online (Sandbox Code Playgroud)

选项 2:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 /dev/null &
Run Code Online (Sandbox Code Playgroud)

第一个选项需要 root,或者至少需要功能 CAP_NET_ADMIN。第二个选项不需要 root,但也希望在前台运行,因此可能不太利于脚本编写(尽管跟踪子进程 ID 并使用trapBASH 中的a 对其进行清理可能正是您正在寻找的。

一旦完成(但在我们疯狂测试我们的tcpdump/tshark命令之前)确保内核识别已加入正确 IGMP 组的接口。如果你感觉超级看上你可以去坚果解析六角出来的/proc/net/igmp,但我建议只是运行netstat -gn

一旦您确认您看到订阅了正确组的接口,就会启动您的 tcpdump 命令:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234
Run Code Online (Sandbox Code Playgroud)

另外,如果你不想完全走的tcpdump的路线(或偶然发现了这个答案,只是好奇,想看看多播在行动),你可以使用socat上面命令加入和呼应内容,STDOUT通过更换/dev/null具有STDOUT

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1
Run Code Online (Sandbox Code Playgroud)

然后,从另一台机器使用以下两个选项之一发送一些简单的测试数据:

选项1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001
Run Code Online (Sandbox Code Playgroud)

选项 2:

ncat  -u 233.54.12.234 22001
Run Code Online (Sandbox Code Playgroud)

当您运行其中任何一个命令时,它将以交互方式等待输入。只需输入一些内容,按回车键发送,然后CTRL+D当您完成发送EOF消息时。

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

注意如果您想使用ip addr add ...(选项 1)离开加入的多播组,您可以执行以下操作:

sudo ip addr del 233.54.12.234/32 dev eth1 autojoin
Run Code Online (Sandbox Code Playgroud)

  • 哇,花了四年才得到答案!我什至不再这样做了,而且确实没有办法测试,但我还是会接受。 (3认同)
  • 现在就派上用场了!:D 谢谢布莱恩 :) (2认同)