Linux内置或开源程序加入组播组?

chr*_*irk 10 multicast udp netcat

我正在使用 tcpdump 来捕获多播数据包,并且必须编写一个自定义程序来加入多播源,以便 tcpdump 将“看到”数据包。只是想知道 netcat 或任何其他应用程序是否可以执行此功能?

use*_*686 10

您可以使用该ip maddr add命令执行此操作。


句法

ip maddr [ add | del ] MULTIADDR dev STRING 
Run Code Online (Sandbox Code Playgroud)

描述

它附加/分离静态链路层多播地址以在接口上侦听。注意静态加入协议组播组是不可能的。该命令只管理链路层地址。

address LLADDRESS (default)
    the link layer multicast address. 
dev NAME
    the device to join/leave this multicast address. 
Run Code Online (Sandbox Code Playgroud)

例子

有线连接示例:

ip maddr add ff02::fb dev eth0
Run Code Online (Sandbox Code Playgroud)

无线连接示例:

ip maddr add 224.0.0.251 dev wlan0
Run Code Online (Sandbox Code Playgroud)

  • 经过更多的挖掘,似乎`ip maddr` 只适用于_link-layer_ 多播地址,而不适用于_protocol-layer_ 多播地址。 (3认同)
  • 不幸的是这个答案并没有回答这个问题,因为它只适用于**链路层**即MAC地址。IPv6 示例失败,如第 1 条评论中所述,IPv4 示例失败但安静(即该组未加入或通过“ip maddr show”列出) (2认同)

小智 10

可以使用 socat 订阅组。这适用于 L2 和 L3 订阅:

socat STDIO  UDP4-DATAGRAM:239.101.1.68:8889,\
  ip-add-membership=239.0.1.68:10.100.201.1
Run Code Online (Sandbox Code Playgroud)

这将239.0.1.68使用带有 address 的接口订阅组10.100.201.1。该UDP4-DATAGRAM:239.101.1.68:8889位侦听不应接收任何数据的虚拟组和 udp 端口​​上的数据包,以防止 socat 也将所有内容输出到 stdout。相反,如果您想将有效负载定向到标准输出,请将该组和端口更改为您要订阅的实际组和端口。

ip-add-membership可以指定多个逗号分隔的指令来同时订阅多个组。当 socat 退出时,它似乎也清除了 IGMP 订阅。