Как фильтровать пакеты по списку IP с помощью Scapy

Я пытаюсь фильтровать пакеты определенного веб-сайта в Python (используя Scapy). У меня есть список возможных IP-адресов (используемых для балансировки нагрузки) веб-сайта. Я хочу фильтровать пакеты для всех этих IP-адресов. Как я могу это сделать?

Для одного IP я использую следующий код:

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

person tarun14110    schedule 12.08.2017    source источник


Ответы (1)


Поскольку вы используете 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