Мне нужно фильтровать и изменять сетевой трафик с помощью Linux kernel libnetfilter_queue (именно привязки python) и dpkt, и я пытаюсь реализовать задержанный пакет вперед.
Обычная фильтрация работает очень хорошо, но если я пытаюсь отложить пакеты с функцией вроде этого
def setVerdict(pkt, nf_payload):
nf_payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(pkt), len(pkt))
t = threading.Timer(10, setVerdict, [pkt, nf_payload])
t.start()
Он разбивается, не вызывая никаких исключений (конечно, это крах низкого уровня). Могу ли я реализовать задержку, используя прямое libnetfilter, подобное этому, или я должен скопировать pkt, удалить его и отправить копию, используя стандартный socket.socket.send()
?
Спасибо
Извините за поздний ответ, но мне нужно было сделать что-то подобное, хотя и немного сложнее. Я использовал версию библиотеки C-, и я скопировал пакеты в буфер внутри моей программы, а затем выпустил вердикт DROP. После тайм-аута, связанного с вашей задержкой, я повторно запускаю пакет, используя сырой сокет. Это прекрасно работает и кажется довольно эффективным.
Я думаю, что причина вашего краха была связана с тем, что вы не выпустили вердикт достаточно быстро.
Я не могу ответить на ваш вопрос, но почему бы не использовать модуль очереди "netem" traffic- на исходящем интерфейсе для задержки пакета?
Можно настроить tc queues для применения различных политик к пакетам, которые "помечены" каким-то образом; обычным способом маркировки таких пакетов является модуль netfilter (например, iptables или nfqueue).