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

  • 18.06.2017
  • 3 640
  • 0
  • 18.03.2019
  • 1
  • 1
  • 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 рабочих дня.