[英]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.