繁体   English   中英

如何使用Scapy过滤IP列表的数据包

[英]How to filter packets for a list of IP using Scapy

我试图用Python过滤特定网站的数据包(使用Scapy)。 我有一个网站可能的IP列表(用于负载平衡)。 我想过滤所有这些IP的数据包。 我怎样才能做到这一点?

对于单个IP,我使用以下代码:

bpf_filter = "ip and host " + addr
sniff(timeout=10, prn=pkt_callback, store=0)

由于您使用的是cBPF(经典BPF),因此过滤一组IP地址的唯一方法是将它们全部列出:

bpf_filter = "ip and ("
for addr in addresses[:-1]:
    bpf_filter = "%shost %s or " % (bpf_filter, addr)
bpf_filter = "%shost %s)" % (bpf_filter, addresses[-1])

对于一组IP地址[10.0.0.1, 10.0.0.2, 10.0.0.3] ,将返回:

ip and (host 10.0.0.1 or host 10.0.0.2 or host 10.0.0.3)

注意:您的集合中至少需要一个IP地址才能使上述工作正常。


为什么这是cBPF的限制?

然后,您为Scapy提供的过滤器表达式将编译为BPF字节码 BPF字节码不允许向后跳转(因此循环)。 此限制是一种确保过滤器在内核中执行时最终会暂停的简单方法。

如果允许向后跳转,您可以通过一组IP地址编写一些更智能的查找。 例如,您可以将它们存储在哈希表中,并根据O(1)中的哈希表检查数据包。 这实际上可以用eBPF来实现,据我所知,目前还没有得到Scapy的支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM