Scapy BPF 过滤器不工作

Posted

技术标签:

【中文标题】Scapy BPF 过滤器不工作【英文标题】:Scapy BPF filter not working 【发布时间】:2012-08-14 05:09:22 【问题描述】:

我正在使用 Scapy,并希望根据目标 mac 地址进行过滤。

但是,我收到的数据包显示的目标 MAC 地址不是过滤器中指定的地址。

这是一个代码片段:

from scapy.all import *

sniff(iface="eth1", filter="ether dst host 91:e0:f0:01:00:00", 
      count=3, prn=lambda x: x.show())

我正在运行 Scapy 2.2.0

对这里的问题有什么想法吗?

【问题讨论】:

考虑格式化您的代码。 格式化代码并没有解决问题。 在我的系统上尝试了代码,相同版本的 scapy。过滤器起作用了。哪些类型的 MAC 地址正在通过过滤器? 【参考方案1】:

Scapy 需要许多不同系统的大量依赖项。很可能您没有 BPF 过滤器工作所需的依赖项。

http://www.secdev.org/projects/scapy/portability.html

【讨论】:

【参考方案2】:

这是scapy 错!!!似乎scapy 在应用 BPF 过滤器之前开始接收数据包(sniff 函数的filter 参数)。需要一段时间才能正常工作! 摆脱这种情况的两种方法:

    使用lfilter 在脚本中定义过滤函数。它在繁忙的链接上效率不高,因为在您的脚本中应用了过滤器,而不是内核。考虑使用pypy 来加快速度。 对于某些第一个数据包,请检查脚本中的目标 MAC 地址,然后不再检查;即在嗅探开始时检查数据包的正确性以通过scapy的不稳定阶段,然后依靠scapy过滤不需要的数据包。

【讨论】:

当然,升级它似乎可以解决问题【参考方案3】:

安装 tcpdump 为我解决了这个问题 - 现在嗅探上的过滤器可以工作了

【讨论】:

【参考方案4】:

在我的情况下,升级到 2.3.3dev(github 版本),修复它

【讨论】:

以上是关于Scapy BPF 过滤器不工作的主要内容,如果未能解决你的问题,请参考以下文章

Linux 上的经典 BPF:过滤器不起作用

scapy中嗅探功能的过滤器无法正常工作

Linux内核BPF的简单工作原理

XDP/eBPF — BPF

XDP/eBPF — BPF

scapy中嗅探功能的过滤器选项