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

StackOverflow https://stackoverflow.com/questions/4283043

  •  28-09-2019
  •  | 
  •  

Вопрос

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

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

  • Получение пакетов в очереди от подсистемы Kernel NFNetLink_Queue
  • Выдача вердиктов и / или Reebjecting измененные пакеты к подсистеме Kernel NFNetLink_Queue

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

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

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

Это было полезно?

Решение

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

Я не посмотрел на функциональный прототип правильно. Оказывается в функции «Вердикт» (описана ниже),

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 Пакет и пропустите соответственно модифицированный пакет обратно в ядро.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top