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

  • Автор:
  • Опубликовано:
  • Изменено:
  • Просмотры: 486
  • Комментарии: 0
  • Рейтинг: 100,00%
  • Голосов: 1

Возникла необходимость заменить несколько различных слов в 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.

Оценить статью

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)

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

Ваш e-mail не будет опубликован.