在C语言中过滤Linux上的UDP环回
我有一个绑定到eth0的应用程序,将端口A上的UDP数据包发送到255.255.255.255。同时,我有一个绑定到eth0、0.0.0.0和端口a的UDP服务器 我想做的是确保服务器不会接收应用程序生成的消息(纯粹由内核在软件中处理),而是接收网络中其他主机生成的消息 我不能更改UDP数据包的有效负载,也不能向其中添加任何头 我已经实现了一个解决方案,使用RTNETLINK获取我所在机器的所有IP地址(并根据recvfrom()中的地址进行过滤),但我想知道是否有更简单、更干净的解决方案 编辑:我考虑了一些类似于标记skb的事情——标记在离开物理界面后会消失,但如果它只是在软件中路由,则不会消失在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()中的地址进行过滤),但我想知道是否有更简单、更干净的解决方案 编辑
有什么想法吗?您可以计算有效负载上的校验和或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