2017-08-12 139 views
4

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

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

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

回答

2

由于您使用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 bytecode。 BPF字节码不允许反向跳转(因此循环)。此限制是确保过滤器在内核中执行时最终停止的简单方法。

如果允许向后跳转,可以通过一组IP地址进行更智能的查找。例如,您可以将它们存储在散列表中,并根据O(1)中的散列表检查数据包。这实际上可能与eBPF,据我所知,它不支持Scapy。