2017-08-12 67 views
4

我想在Python中使用Scapy過濾特定網站的數據包。我有一個可能的IP列表(用於負載平衡)的網站。我想過濾所有這些IP的數據包。我怎樣才能做到這一點?如何使用Scapy過濾數據包的IP列表

對於單個IP,我使用下面的代碼:

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

回答

2

由於您使用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。