Переписать сетевые пакеты на лету с помощью libnetfilter_queue
-
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, …)
?