Перезапись сетевых пакетов на лету с использованием libnetfilter_queue - PullRequest
6 голосов
/ 26 ноября 2010

Я пытаюсь написать приложение пользовательского пространства, которое может подключиться к сетевому стеку операционной системы, перехватывать пролетающие мимо пакеты и редактировать те, которые ей интересны.

После долгих поисков, мне кажется, что самое простое (все же достаточно надежный) способ сделать это (на любой платформе) - проект Linux libnetfilter_queue.Однако у меня возникают проблемы с поиском какой-либо разумной документации для проекта, за исключением ограниченной официальной документации.Его основные характеристики (как указано в первой ссылке):

  • получение пакетов из ядра подсистемы nfnetlink_queue
  • выдача вердиктов и / или повторное внедрение измененных пакетов подсистема ядра nfnetlink_queue

Акцент мой.Как именно я имею в виду пойти по этому поводу?Я попытался изменить предоставленный код sample , но, возможно, я что-то неправильно понимаю.Код работает в режиме NFQNL_COPY_PACKET, поэтому я получаю весь пакет - но мои изменения в нем, похоже, ограничены моим собственным приложением - как и следовало ожидать, учитывая "копию"семантика.

У меня такое ощущение, что я должен каким-то образом использовать NF_QUEUE, но я не совсем понял.Любые указатели?

(Если для этого есть более простой механизм, к тому же кроссплатформенный, я бы хотел услышать об этом!)

Ответы [ 2 ]

12 голосов
/ 26 ноября 2010

Не могу поверить, что пропустил это раньше. Как бы я ни старался публиковать вопросы по SO, я думал, что никогда не смогу решить этот вопрос самостоятельно. :)

Я не посмотрел прототип функции должным образом. Оказывается в функции «вердикт» (обрисовано в общих чертах ниже)

int nfq_set_verdict(struct nfq_q_handle *qh,
    u_int32_t id,
    u_int32_t verdict,
    u_int32_t data_len,
    const unsigned char *buf     
)

Последние два параметра для данных должны быть возвращены в сетевой стек. Оглядываясь назад, я полностью упустил это, поскольку функция print_pkt не принимает пакетные данные как параметр, а извлекает их из struct nfq_data.

Ключ к NF_ACCEPT пакету и передаче соответственно измененного пакета обратно в ядро.

0 голосов
/ 26 ноября 2010

Просто дикая догадка от копания в исходном коде: попробуйте явно добавить искаженную полезную нагрузку, используя nfnl_addattr_l(…, NFQA_PAYLOAD, …)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...