我的本地网络中有 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
请求时,才会创建这些条目。一旦程序终止,这些条目就会被清除。也许有一种方法可以欺骗内核来创建这个条目。
您可以尝试 2 件事:
ip link set en123 promisc on
,或IP_ADD_MEMBERSHIP
,但添加一个 netfilter 规则以丢弃生成的 IGMP 数据包,避免实际离开您的主机。通常,IGMP 数据包离开您的系统不应该成为问题。
因此,我很好奇你为什么有这个特殊要求。