Linux libnetfilter_queue проблема с задержкой пакета - PullRequest
1 голос
/ 04 июня 2011

Мне нужно отфильтровать и изменить сетевой трафик, используя ядро ​​Linux 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()?

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 июля 2011

Извините за поздний ответ, но мне нужно было сделать что-то вроде этого, хотя и немного сложнее. Я использовал C-версию библиотеки и скопировал пакеты в буфер внутри моей программы, а затем вынес вердикт DROP. После истечения времени ожидания, связанного с вашей задержкой, я повторно внедряю пакет, используя необработанный сокет. Это прекрасно работает и кажется довольно эффективным.

Я думаю, что причиной вашего краха было то, что вы не вынесли приговор достаточно быстро.

0 голосов
/ 04 июня 2011

Я не могу ответить на ваш вопрос, но почему бы не использовать модуль очереди трафика "netem" на исходящем интерфейсе для задержки пакета?

Можно настроить очереди tc для применения различных политик к пакетам, которые каким-то образом «помечены»; обычный способ пометить такие пакеты - использовать модуль сетевого фильтра (например, iptables или nfqueue).

...