sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &f, sizeof (f))
使用这个简单的 BPF/LPF 附加代码,当我尝试在套接字上接收数据包时,会收到一些与过滤器不匹配的错误数据包。似乎这些数据包在我调用 setsockopt() 之前就进入了套接字。
似乎应该首先创建 AF_PACKET SOCK_RAW 套接字,然后附加过滤器,然后刷新套接字以摆脱那些错误的数据包。
那么问题是,如何刷新这些数据包?
您所描述的“错误”是真实存在的,我在职业生涯中曾在多家公司看到过它。围绕这个错误有一种类似于“口头传统”的东西,它从一个网络工程师传递给另一个网络工程师。以下是常见的修复方法:
- 只需致电
recv
在套接字上直到它为空
- 通过在用户模式下过滤数据包以及使用 bpf 进行双重过滤
- 使用零 bpf 技术,就像 libpcap 一样,首先应用一个空 bpf,然后清空套接字,然后应用真正的 bpf。
我在我的博客上详细讨论了这个问题 https://natanyellin.com/posts/ebpf-filtering-done-right/尝试将围绕此错误的口头传统编入具体的建议和最佳实践。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)