Изменяем содержимое tcp пакетов "на лету"

  • 18.06.2017
  • 6 888
  • 0
  • 29.01.2021
  • 6
  • 6
  • 0
Изменяем содержимое tcp пакетов на лету

Возникла необходимость заменить несколько различных слов в tcp пакетах, которые конечно передаются не в зашифрованном виде и проходят через шлюз на ОС Linux (или же через haproxy в моем случае), на другие слова. После штурма гугла, нашелся очень простой и замечательный способ это сделать и о нем я сейчас напишу подробней.

Описание

Для начала нам необходимо скачать и скомпилировать утилиту, которая и будет делать замену одних символов на другие прямо "на лету". Для этого воспользуемся следующими командами:

sudo apt-get install libnetfilter-queue-dev
git clone https://github.com/rgerganov/nfqsed.git
cd nfqsed
make

Если все прошло успешно, то переходим ко второму пункту - запуску nfqsed и написанию правил преобразования. Пример:

./nfqsed -s /oldstring1/newstring1 -s /oldstring2/newstring2 -s /oldstring3/newstring3 -v

Небольшое объяснение: Как видно из параметров выше, строка oldstring1 будет заменена в tcp пакете на newstring1, oldstring2 на newstring2, а oldstring3 на newstring3. Ключ -v выводит дополнительную информацию в процессе работы, например, что пришел пакет или что произошла успешная замена. Она удобна на этапе отладки работы, потом ее можно и упустить, чтобы не захламляла вывод.

Количество символов в строке для поиска должно равняться количеству символов в строке для замены. Если необходимо, чтобы количество символов не совпадало, то нужно использовать утилиту hexinject, которая позволяет заменять значения и не требует, чтобы они были одинаковыми по длине.

Теперь необходимо добавить правило для iptables, которое будет отправлять нужные нам пакеты в nfqsed, где они будут немного "модифицироваться" ;)

iptables -A OUTPUT -p tcp --dport 1234 -j NFQUEUE

Все исходящие пакеты на порт 1234 будут проходить через nfqsed и в случае, если будет совпадение, то доходить до адресата уже измененными, где вместо oldstring1, будет newstring1 и т.д.

В том случае, если мы не хотим посылать в nfqsed все пакеты, а хотим отправлять туда только те, в которых необходимо произвести замену, нам на помощь придут следующие правила для iptables (дефолтная политика DROP):

iptables -A OUTPUT -p tcp --dport 1234 -m string --string "oldstring1" --algo kmp -j NFQUEUE
iptables -A OUTPUT -p tcp --dport 1234 -j ACCEPT

Где string "oldstring1" означает, что мы ищем в tcp пакете строку oldstring1, если она найдена, то перенаправляем её в nfqsed, который производит замену. Если такая строка не найдена, то срабатывает следующее правило, которое не изменяет tcp пакет (т.к. строки для замены в нем все-равно не найдено) и отправляет его как есть, тем самым снижая нагрузку на cpu.

Была ли эта статья Вам полезна?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Напоминаем Вам, что Ваше сообщение будет опубликовано только после проверки администратором сайта. Обычно это занимает 1-2 рабочих дня.