如何使用Scapy过滤数据包的IP列表
问题描述:
我想在Python中使用Scapy过滤特定网站的数据包。我有一个可能的IP列表(用于负载平衡)的网站。我想过滤所有这些IP的数据包。我怎样才能做到这一点?如何使用Scapy过滤数据包的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 bytecode。 BPF字节码不允许反向跳转(因此循环)。此限制是确保过滤器在内核中执行时最终停止的简单方法。
如果允许向后跳转,可以通过一组IP地址进行更智能的查找。例如,您可以将它们存储在散列表中,并根据O(1)中的散列表检查数据包。这实际上可能与eBPF,据我所知,它不支持Scapy。