Назад | Перейти на главную страницу

Как повторно закачать пакет в Iptables?

У меня есть пакет внутри пакета 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. Необходимо настроить две части:

  1. Ваш iptables/ netfilter правила для отправки пакетов пользователю, и
  2. ваша пользовательская программа, которая будет обрабатывать пакеты по желанию и затем возвращать их в 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 есть пример кода, на который я ссылался), но основная идея заключается в том, что ваша программа будет:

  • читать каждый пакет, отправленный в очередь,
  • внести желаемые изменения в пакет,
  • и, наконец, укажите "вердикт" netfilter, говорящий, следует ли ПРИНЯТЬ или ОТКАЗАТЬ пакет. Предположительно, в большинстве случаев вы будете ПРИНЯТЬ.

Я лично не использовал этот API, но, как я читал в документации, ПРИНЯТИЕ пакета на самом деле означает его повторное внедрение в измененном виде обратно в netfilter, чтобы продолжить обход iptables наборы правил. Я могу ошибаться в этом вопросе, поэтому, возможно, вы захотите продолжить исследование, прежде чем переходить к этому курсу разработки.

IIRC, чтобы повторно ввести (хотя и в начало цепочки!), Используйте NF_REPEAT как приговор.

Похоже, libipq был устарел по libnetfilter_queue. В документации указано:

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

похоже на то, что вы ищете ...