Изменяем содержимое tcp пакетов "на лету"
- AJIekceu4
- 18.06.2017
- 6 888
- 0
- 29.01.2021
- 6
- 6
- 0
- Содержание статьи
Возникла необходимость заменить несколько различных слов в 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 выводит дополнительную информацию в процессе работы, например, что пришел пакет или что произошла успешная замена. Она удобна на этапе отладки работы, потом ее можно и упустить, чтобы не захламляла вывод.
Теперь необходимо добавить правило для 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.
Добавить комментарий