如何使用 BPF 重新过滤 scapy 数据包?

How can I re-filter a scapy packet using BPF?

我正在编写一个需要重新过滤由 sniff() 捕获的数据包的程序。我想将 BPF 文件管理器应用于每个数据包,如果它匹配,return true,否则 return 错误。

谁能给我一些提示吗?谢谢!

作为记录,这是我在 issue you have opened:

上的回答

您不需要 BytesIO 对象,因为 sniff()offline 参数可以接受 PacketList 或单个 Packet

你可以这样做:

pkts=sniff(count=10)
pkts_icmp = sniff(offline=pkts, filter='icmp')

数据通过其标准输入传递到 tcpdump 进程,因此它不会触及您的硬盘驱动器,除非您使用的是 MacOS X(但这是 tcpdump / MacOS X 的限制,Scapy不能在这里做得更好)。

如果你想对每个数据包进行测试,你可以这样做:

pkts = sniff(count=10)
for pkt in pkts:
    if sniff(offline=pkt, filter='icmp'):
        print 'match!'

请注意,这将为每个数据包分叉一个 tcpdump 进程,这可能并不理想。

附带说明一下,如果您的测试就这么简单,您也可以改用 Scapy 测试(尽管它并不完全等同,但在某些情况下会有所帮助,并且不会为每个已处理的数据包分叉一个进程) :

pkts = sniff(count=10)
for pkt in pkts:
    if ICMP in pkt:
        print 'match!'