如何在不实际发送 IGMP 请求的情况下接收到达 NIC 的多播数据包?

问题描述 投票:0回答:1

我的本地网络中有 2 台 Ubuntu 16.04 机器“A”和“B”。 “A”定期发送组播UDP数据包,目标地址为225.0.0.37。

在系统“B”上,我可以通过wireshark验证这些数据包是否到达了我的网卡。我想编写一个 C 程序,它创建一个

SOCK_DGRAM
套接字并侦听这些数据包,而不在网络中发送 IGMP 加入数据包。如果我编写这样的程序,内核将不允许这些数据包到达我的应用程序。它们在 IP 第 3 层被过滤(这是我的猜测)。

有办法实现这一点吗?我不希望任何 IGMP 数据包离开我的系统,但仍想捕获 UDP 流量。我知道有效的一个选择是使用

SOCK_RAW
,但我只想从
SOCK_DGRAM
实现这一点。

我知道 os 将 igmp 订阅条目保留在

/proc/net/igmp
/proc/net/dev_mcast
中。仅当我从程序的接口发送
IP_ADD_MEMBERSHIP
请求时,才会创建这些条目。一旦程序终止,这些条目就会被清除。也许有一种方法可以欺骗内核来创建这个条目。

linux sockets networking udp multicast
1个回答
0
投票

您可以尝试 2 件事:

  1. 只需将您的界面切换到混杂模式,如下所示:
    ip link set en123 promisc on
    ,或
  2. 继续设置
    IP_ADD_MEMBERSHIP
    ,但添加一个 netfilter 规则以丢弃生成的 IGMP 数据包,避免实际离开您的主机。

通常,IGMP 数据包离开您的系统不应该成为问题。

因此,我很好奇你为什么有这个特殊要求。

© www.soinside.com 2019 - 2024. All rights reserved.