Переписывание сетевых пакетов на лету с помощью libnetfilter_queue

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

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

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

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

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

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


person Sedate Alien    schedule 26.11.2010    source источник


Ответы (2)


Не могу поверить, что пропустил это раньше. Как бы я ни стеснялся публиковать вопросы на 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 пакет и передача соответствующим образом измененного пакета обратно в ядро.

person Sedate Alien    schedule 26.11.2010
comment
Sedate, есть ли у вас опыт использования этого через Java (JNI)? Мне любопытно, снижает ли это производительность. - person Tina J; 25.05.2014
comment
@TinaJasmin К сожалению, у меня нет опыта работы с JNI, поэтому я не уверен, насколько это повлияет на производительность. Извините, я не могу быть более полезным. - person Sedate Alien; 25.05.2014

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

person ephemient    schedule 26.11.2010