Da Sie cBPF (klassische BPF), der einzige Weg, einen Satz verwenden filtern von IP-Adressen ist, sie Auflistung:
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])
Welche, für eine Reihe von IP-Adressen [10.0.0.1, 10.0.0.2, 10.0.0.3]
, kehrt:
ip and (host 10.0.0.1 or host 10.0.0.2 or host 10.0.0.3)
Hinweis: Sie benötigen mindestens eine IP-Adresse in Ihrem Gerät, damit das oben genannte funktioniert.
Warum ist dies eine Einschränkung der cBPF?
Der Filterausdruck, den Sie Scapy geben, wird dann zu BPF bytecode kompiliert. Der BPF-Bytecode lässt Rückwärtssprünge (und somit Schleifen) nicht zu. Diese Einschränkung stellt eine einfache Möglichkeit dar, um sicherzustellen, dass der Filter bei der Ausführung im Kernel gestoppt wird.
Wenn Rückwärtssprünge erlaubt waren, könnten Sie eine intelligentere Suche über Ihre IP-Adressen schreiben. Sie könnten sie beispielsweise in einer Hash-Tabelle speichern und das Paket gegen die Hash-Tabelle in O (1) prüfen. Dies ist tatsächlich möglich mit eBPF, die, soweit ich weiß, von Scapy noch nicht unterstützt wird.