У меня есть пакет внутри пакета a.k.a туннелирования. По сути, он имеет следующую форму: [IP HEADER 1][IP HEADER 2][PAYLOAD]
После прочтения первого заголовка (сделанного библиотекой) я получу пакет:
[IP HEADER 2][PAYLOAD]
в цепочке INPUT файла iptables. Я хочу повторно ввести пакет в начало iptables, то есть в цепочке PREROUTING. Конечная цель - перенаправить пакет на удаленный хост (поэтому я хочу, чтобы пакет находился в цепочке PREROUTING). Я кое-что читал о libipq, но не уверен, что это лучший способ сделать это. Любое дикое предложение тоже поможет.
Я уже публиковал этот вопрос в «stackoverflow», но поскольку ответов не было, я подумал, что он лучше подходит для «serverfault».
Я согласен с ответом господина Шунца. Использовать libnetfilter_queue. Для его использования вам понадобится ядро Linux версии 2.6.14 или более поздней версии, построенное с поддержкой nfnetlink_queue. Необходимо настроить две части:
iptables
/ netfilter правила для отправки пакетов пользователю, иВ iptables
правило может выглядеть примерно так:
IN_INTERFACE=eth0
SOURCE_NETWORK=192.168.66.0/24
QUEUE_NUM=1
iptables -t raw -A PREROUTING -i $IN_INTERFACE -s $SOURCE_NETWORK -j NFQUEUE --queue-num $QUEUE_NUM
Это отправит все пакеты, входящие через определенный интерфейс из определенной сети, в ваш пользовательский процесс, который прослушивает очередь номер 1.
Ваша программа, которая, вероятно, будет написана на C или C ++, будет использовать libnetfilter_queue API. Извините, я не собираюсь писать здесь какой-либо код (в документации API есть пример кода, на который я ссылался), но основная идея заключается в том, что ваша программа будет:
Я лично не использовал этот API, но, как я читал в документации, ПРИНЯТИЕ пакета на самом деле означает его повторное внедрение в измененном виде обратно в netfilter, чтобы продолжить обход iptables
наборы правил. Я могу ошибаться в этом вопросе, поэтому, возможно, вы захотите продолжить исследование, прежде чем переходить к этому курсу разработки.
IIRC, чтобы повторно ввести (хотя и в начало цепочки!), Используйте NF_REPEAT
как приговор.
Похоже, libipq был устарел по libnetfilter_queue. В документации указано:
вынесение приговоров и / или повторное введение измененные пакеты в подсистему ядра nfnetlink_queue
похоже на то, что вы ищете ...