2015-10-10 3 views
1

Я пишу модуль ядра, который должен выполнять фильтрацию пакетов на уровне IP. То, что мне нужно сделать, это перехватить все IP-пакеты и некоторые исходящие пакеты, я должен удержать их в течение небольшого промежутка времени (например, несколько десятков миллисекунд) для анализа перед отправкой их на своем пути.netfilter - как указать номер очереди в модуле ядра?

У меня есть модуль ядра и работает, в настоящий момент он принимает все входящие пакеты и возвращает NF_QUEUE во всех исходящих пакетах. Затем я могу собрать эти пакеты с использованием libnetfilter в пользовательском пространстве (например, с помощью скрипта Python и NetfilterQueue), но проблема в том, что библиотека Python принимает номер очереди, а мой модуль ядра ставит очередь пакетов в очереди # 0. Как это настроить?

Это то, что исходящий пакет крюк моего ядра модуля выглядит (мощеный вверх из различных источников):

Где указать, какие очереди пакетов будут в конечном итоге на? Каково значение номеров очередей? Я не могу обрабатывать случайные бродячие пакеты, поставленные в очередь другим крюком, чем мои, это уже сделано по умолчанию?

Спасибо! Кроме того, я использую Linux 3.x.

ответ

2

Используйте макрос NF_QUEUE_NR(x). Вы передаете ему один аргумент (номер очереди), и он построит для вас возвращаемое значение. В частности, он будет сдвигать влево номер очереди на 16 бит, а затем И с NF_QUEUE.

Если вы заинтересованы, реализация в include/uapi/linux/netfilter.h

+0

Извините за поздний принять, я потерял этот вопрос. Спасибо :) – Thomas

+0

Нет проблем. Надеюсь, это помогло. –

Смежные вопросы