4
我想在Python中使用Scapy過濾特定網站的數據包。我有一個可能的IP列表(用於負載平衡)的網站。我想過濾所有這些IP的數據包。我怎樣才能做到這一點?如何使用Scapy過濾數據包的IP列表
對於單個IP,我使用下面的代碼:
bpf_filter = "ip and host " + addr
sniff(timeout=10, prn=pkt_callback, store=0)
我想在Python中使用Scapy過濾特定網站的數據包。我有一個可能的IP列表(用於負載平衡)的網站。我想過濾所有這些IP的數據包。我怎樣才能做到這一點?如何使用Scapy過濾數據包的IP列表
對於單個IP,我使用下面的代碼:
bpf_filter = "ip and host " + addr
sniff(timeout=10, prn=pkt_callback, store=0)
由於您使用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。