我的本地网络中有两台Ubuntu 16.04机器“A”和“B”。“A”定期发送多播UDP数据包,目标是225.0.0.37。
在系统“B”上,我可以通过wireshark验证这些数据包是否命中我的NIC。我想写一个C程序,它创建一个SOCK_DGRAM
套接字,并在网络中不发送IGMP加入数据包的情况下监听这些数据包。如果我写这样一个程序,内核不允许这些数据包到达我的应用程序。它们在IP层3上被过滤(我的猜测)。
我不想让任何IGMP数据包离开我的系统,但仍然想捕获UDP流量。我知道一个可行的选择是使用SOCK_RAW
,但我只想从SOCK_DGRAM
实现这一点。
我知道操作系统在/proc/net/igmp
和/proc/net/dev_mcast
中保存了igmp订阅条目。只有当我从程序的接口发送IP_ADD_MEMBERSHIP
请求时,这些条目才会被创建。一旦程序终止,这些条目就会被清除。也许有一种方法可以欺骗内核来创建这个条目。
1条答案
按热度按时间kcwpcxri1#
你可以尝试两件事:
1.只需将接口切换到混杂模式,如下所示:
ip link set en123 promisc on
,或1.继续设置
IP_ADD_MEMBERSHIP
,但添加一个netfilter规则,以丢弃实际离开主机的IGMP数据包。通常,IGMP数据包离开您的系统不应该是一个问题。
所以,我很好奇你为什么有这个特殊的要求。