Поскольку вы используете 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 а>. Байт-код BPF запрещает переходы назад (и, следовательно, циклы). Это ограничение — простой способ гарантировать, что фильтр в конечном итоге остановится при выполнении в ядре.
Если бы обратные переходы были разрешены, вы могли бы написать более умный поиск по вашему набору IP-адресов. Вы можете, например, сохранить их в хеш-таблице и проверить пакет по хеш-таблице за O(1). На самом деле это возможно с eBPF, который, насколько я знаю, еще не поддерживается Scapy.
person
pchaigno
schedule
12.08.2017