2017-08-12 4 views
4

Ich versuche, Pakete einer bestimmten Website in Python (mit Scapy) zu filtern. Ich habe eine Liste von möglichen IPs (die für den Lastenausgleich verwendet werden) der Website. Ich möchte Pakete für all diese IPs filtern. Wie kann ich das machen?So filtern Sie Pakete für eine Liste von IP mit Scapy

Für eine einzelne IP, ich den folgenden Code verwenden:

bpf_filter = "ip and host " + addr 
sniff(timeout=10, prn=pkt_callback, store=0) 

Antwort

2

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.