У меня есть программа на C ++, использующая libnetfilter_queue библиотека, предназначенная для работы в системе Linux.
Мне нужно будет фильтровать только пакеты прикладного уровня (следовательно, пакеты, включая полезную нагрузку для прикладного уровня хоста).
Я знаю, что это невозможно с iptables
, без перестройки ядра.
Поскольку я не могу сделать это на конечном хост-устройстве, я работаю с моей программой на С ++.
Моя цель состоит в том, чтобы напрямую принимать пакеты уровня приложения и обрабатывать пакеты уровня 7.
Я пытался использовать nfq_get_payload функция, возвращающая -1
если ошибка (следовательно, я полагаю, нет полезной нагрузки), если найден.
ret = nfq_get_payload(tb, &data);
if (ret < 0) { /* accept packet */ }
else { /* process packet */ }
Я знаю что nfq_get_payload
функция зависит от «принятого режима» (см. nfq_set_mode функция), но это не работает для меня.
Как я могу отличить пакеты прикладного уровня от пакетов «нижнего уровня»?
Зная, что ip_src
Байт находится в data + 12
(смотрите также Вот), поскольку размер слоя TCP 64
байт, полезная нагрузка должна быть найдена, если она доступна, в позиции data + 12 + 64
,
unsigned char* pkt_payload = (buffer + 12 + 64));
Тем не менее, если я попытаюсь напечатать pkt_payload
переменная, она не соответствует ожидаемым результатам.
Как я могу решить это?
Задача ещё не решена.
Других решений пока нет …