【问题标题】:How to filter packets for a list of IP using Scapy如何使用 Scapy 过滤 IP 列表的数据包
【发布时间】:2018-01-20 15:07:49
【问题描述】:
我正在尝试在 Python 中过滤特定网站的数据包(使用 Scapy)。我有一个网站可能的 IP 列表(用于负载平衡)。我想过滤所有这些 IP 的数据包。我怎样才能做到这一点?
对于单个IP,我使用如下代码:
bpf_filter = "ip and host " + addr
sniff(timeout=10, prn=pkt_callback, store=0)
【问题讨论】:
标签:
python
scapy
packet-sniffers
bpf
【解决方案1】:
由于您使用的是 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 还不支持它。