来自多播指南:
IP_添加_会员。
回想一下,您需要告诉内核您对哪些多播组感兴趣。如果没有进程对某个组感兴趣,则到达主机的发往该组的数据包将被丢弃。
如果你不这样做,你将看不到带有的那些数据包tcpdump
。
- 是否可以订阅所有多播流量,以便我可以对所有现有流量进行 tcpdump?我认为 IGMP 不允许这样做,所以可能不行……但也许您可以配置交换机以仍然发送所有多播流量。这可能吗?
- 是否可以使用命令行工具进行订阅(针对特定 IP)?(注:我知道如何用 C 来实现这一点..但更愿意使用现有的工具而不是为此编译单独的程序)
答案1
这取决于您的多播基础设施:例如,您可以拥有许多多播路由器,并且在交换机上设置各种规则(使订阅静态、动态,甚至在某些端口/节点上被禁止)。
但是,如果您想订阅多播组...只需订阅即可。通过某些基础设施发送 IGMP JOIN 数据包,这些基础设施显然已启用 IGMP 侦听。您可以使用各种工具生成 IGMP 数据包。
迈向更高层次,使用防火墙订阅任何多播组。如果您的网络基础设施不是太复杂,并且您“允许”订阅任何多播组,然后使用以下命令:
iperf -s -u -B 239.100.100.100
其中 239.100.100.100 是您的多播组地址。
同时运行 tcpdump 来获取详细报告。
请注意,我相信 iperf 仅支持 IGMP v1 和 v2。如果您想制作 IGMP v3 JOIN 数据包,那么编写程序应该不会太难,正如您所说。但可能会有更多工具可以做同样的事情。
答案2
多播 HOWTO 的链接页面没有提及任何有关 tcpdump 的内容。
Tcpdump 使用 libpcap 来捕获网络数据包,在以太网上,libpcap 支持以下两者:
混杂模式,网络适配器会将看到的每个数据包传送给主机,而不管目标地址是什么,网络堆栈会将通过过滤器的每个数据包传送给捕获机制,并且
非混杂模式,在该模式下,网络适配器将其配置为传送的单播数据包、广播数据包和多播数据包传送到主机,然后网络堆栈将所有通过捕获过滤器的数据包传送到捕获机制。
Tcpdump 默认请求混杂模式;在该模式下,您甚至会看到未发送到您的主机的单播数据包(只要您不在交换网络上或在交换网络上但插入获取所有流量的“镜像”端口)。
如果您将标志传递给 tcpdump -p
,它将请求非混杂模式,在这种情况下,您只会看到您的机器“应该”获得的数据包;在这种情况下,如果没有进程注册对特定多播组的兴趣,您将看不到发送到该组的多播地址的数据包,但是,在这种情况下,这不是错误,而是一个功能,因为您的机器没有对这些数据包执行任何操作。
因此,如果您想查看所有数据包(发往所有主机的单播数据包、发往所有多播地址的多播数据包以及广播数据包),请在混杂模式下运行 tcpdump(或 Wireshark 或其他程序),如果您在交换网络上,请在“镜像端口”或“SPAN 端口”或交换机供应商所称的任何端口上运行(如果它支持“镜像端口”)。
看有关以太网数据包捕获的 Wireshark Wiki 页面有关混杂模式和交换网络的大量详细信息;该页面上的信息适用于所有数据包嗅探器,包括 tcpdump,而不仅仅是 Wireshark。