【问题标题】: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 还不支持它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2022-07-08
      • 1970-01-01
      • 2021-06-03
      • 2021-11-30
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多