在C语言中过滤Linux上的UDP环回

在C语言中过滤Linux上的UDP环回,c,linux,sockets,udp,C,Linux,Sockets,Udp,我有一个绑定到eth0的应用程序,将端口A上的UDP数据包发送到255.255.255.255。同时,我有一个绑定到eth0、0.0.0.0和端口a的UDP服务器 我想做的是确保服务器不会接收应用程序生成的消息(纯粹由内核在软件中处理),而是接收网络中其他主机生成的消息 我不能更改UDP数据包的有效负载,也不能向其中添加任何头 我已经实现了一个解决方案,使用RTNETLINK获取我所在机器的所有IP地址(并根据recvfrom()中的地址进行过滤),但我想知道是否有更简单、更干净的解决方案 编辑

我有一个绑定到eth0的应用程序,将端口A上的UDP数据包发送到255.255.255.255。同时,我有一个绑定到eth0、0.0.0.0和端口a的UDP服务器

我想做的是确保服务器不会接收应用程序生成的消息(纯粹由内核在软件中处理),而是接收网络中其他主机生成的消息

我不能更改UDP数据包的有效负载,也不能向其中添加任何头

我已经实现了一个解决方案,使用RTNETLINK获取我所在机器的所有IP地址(并根据recvfrom()中的地址进行过滤),但我想知道是否有更简单、更干净的解决方案

编辑:我考虑了一些类似于标记skb的事情——标记在离开物理界面后会消失,但如果它只是在软件中路由,则不会消失


有什么想法吗?

您可以计算有效负载上的校验和或CRC(更好),并根据此进行过滤。

您可以计算校验和或CRC(更好)通过有效负载并对此进行过滤。

您可以在防火墙级别通过将数据包丢弃到源地址为
eth0
的广播地址端口A来完成此操作。如果您可以修补您的应用程序,您可以在防火墙级别通过将数据包丢弃到源地址为
eth0
的广播地址端口A来完成此操作在Linux内核中,您可以使用
setsockopt()
选项来选择是否要回送正在发送的广播数据包

这就可以重复使用
IP\u MULTICAST\u LOOP
选项


此外,您可以轻松添加自己的
setsockopt()
选项,也可以称之为
IP\u广播\u NO\u循环
,而不是将
IP\u多播\u循环
弄得一团糟。这将保证您不会更改任何其他应用程序的行为。

如果您可以修补Linux内核,您可以使用
setsockopt()
选项来选择是否要回送发送的广播数据包

这就可以重复使用
IP\u MULTICAST\u LOOP
选项



此外,您可以轻松添加自己的
setsockopt()
选项,也可以称之为
IP\u广播\u NO\u循环
,而不是将
IP\u多播\u循环
弄得一团糟。这将保证您不会更改任何其他应用程序的行为。

这比我当前的解决方案更糟糕,因为这需要根权限和其他配置。事实上,我已经在我的软件中安装了防火墙。嗯,防火墙不是用户的事,不是一般情况。在内核中实现网络堆栈是有原因的。这就是表现。在您的设置中,每个数据包在堆栈上下移动,并且至少有两个副本。您可以使用一个简单的防火墙规则将“up”部分与拷贝一起剪切回用户空间。看起来您的应用程序可以使用更好的设计。您提出的设计要求具有根权限,并确保我的防火墙规则不会干扰系统的其余部分-如果有一个进程也发送广播并希望拥有环回,该怎么办?当然,为了设计的纯粹性,我可以使用高级netfilter匹配、破解内核等等,但我更喜欢简单和通用的解决方案。此外,说到设计,系统范围的防火墙不是实现某些用户空间程序所需功能的地方,但这只是我的拙见。重新发明轮子总是很有趣:)…而且激怒网上的人而不解决他们的争论也很有趣:)无论如何,谢谢你的时间。这比我目前的解决方法更糟糕,因为这需要根权限和其他配置。事实上,我已经在我的软件中安装了防火墙。嗯,防火墙不是用户的事,不是一般情况。在内核中实现网络堆栈是有原因的。这就是表现。在您的设置中,每个数据包在堆栈上下移动,并且至少有两个副本。您可以使用一个简单的防火墙规则将“up”部分与拷贝一起剪切回用户空间。看起来您的应用程序可以使用更好的设计。您提出的设计要求具有根权限,并确保我的防火墙规则不会干扰系统的其余部分-如果有一个进程也发送广播并希望拥有环回,该怎么办?当然,为了设计的纯粹性,我可以使用高级netfilter匹配、破解内核等等,但我更喜欢简单和通用的解决方案。此外,就设计而言,系统范围的防火墙不是实现某些用户空间程序所需功能的地方,但这只是我的拙见。重新发明轮子总是很有趣的:)…在网上激怒人们而不解决他们的争论也是很有趣的:)无论如何,谢谢你的时间。这可能会导致无效的行为-我很可能收到与我刚发送的内容相同的内容,但是来自远程主机。@Pawel:看来你面临着一个巨大的挑战至少可以说是“不友好”协议。祝你好运。这可能会导致无效行为-我很可能收到与刚才发送的内容相同的内容,但来自远程主机。@Pawel:看来你面临着“不友好”协议“至少可以这么说。祝你好运。在Linux上似乎仍然不可能:在Linux上似乎仍然不可能:我一直在等待的答案!非常感谢你!然而,我已经在一周前找到了这个补丁-请看我的评论:p我等待的答案!非常感谢你!然而,我已经在一周前找到了这个补丁-请参阅我的评论:P