Простой способ «отредактировать» трафик с хоста tcp (linux)

9

Мне нужно сделать небольшую модификацию входящего трафика от известного хоста tcp: порт, прежде чем процесс, обрабатывающий соединение, получит поток.

Например, пусть 192.168.1.88 будет удаленным хостом, на котором работает веб-сервер.
Мне нужно , что, когда процесс на моем локальном хосте принимает данные от 192.168.1.88:80 (например , браузера), данные сначала изменен путем замену text-Aс text-B, как это:

  • 127.0.0.1: ... подключается к 192.168.1.88:80
  • 127.0.0.1: ... отправляет на 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 отправляет на 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Эти данные несколько перехватываются системой и передаются программе, вывод которой:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • система передает измененные данные процессу, обрабатывающему 127.0.0.1: ..., как если бы он исходил из 192.168.1.88:80.

Предполагая, что у меня есть потоковый способ внести эти изменения (используя, sedнапример), какой самый простой способ предварительно обработать входящий поток tcp?

Я предполагаю, что это будет связано iptables, но я не очень хорош в этом.

Обратите внимание, что приложение должно иметь дело с исходным хостом, поэтому настройка прокси вряд ли является решением.

etuardu
источник
Это HTTP-запросы?
полином
Ваш вопрос недостаточно ясен. Вы должны предоставить более подробную информацию.
Халед
1
Вы не можете сделать это на уровне пакета. Один пакет может содержать «text-», а следующий может содержать «A». Вам нужно будет разработать невидимый прокси, который следует протоколу. (Вы должны следовать протоколу, потому что, если вы получаете «text-» и это часть «text-A», вам нужно подождать следующего блока, прежде чем передать его, или ваш фильтр не будет работать. Но если это конец логического сообщения, вы не можете ждать, потому что вы будете ждать вечно.) Я считаю, что нет простого способа сделать это.
Дэвид Шварц
Уже существуют системы проверки пакетов с отслеживанием состояния, которые могут, например, переписывать трафик FTP, чтобы он работал через NAT. Это то место, с которого нужно начинать.
pjc50
Мне нужно, чтобы он работал в первую очередь с http-ответом, но было бы хорошо, если бы он работал на любом прикладном уровне.
etuardu

Ответы:

21

Используйте netsed и iptables прокси.

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

Затем запустите:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSED - это небольшая и удобная утилита, предназначенная для изменения в реальном времени содержимого пакетов, пересылаемых через вашу сеть. Это действительно полезно для изменения сетевых пакетов, подделки или манипуляций. NetSED поддерживает:

  • аудит протокола черного ящика - всякий раз, когда два или более запатентованных ящика общаются с использованием какого-либо недокументированного протокола. Применив изменения в текущих передачах, вы сможете проверить, может ли проверяемое приложение быть защищенным.

  • эксперименты с нечеткой генерацией, тесты целостности - всякий раз, когда вы проводите тесты стабильности приложения, чтобы увидеть, как оно заботится о целостности данных;

  • другие распространенные сценарии использования: вводящие в заблуждение передачи, фильтрация содержимого, преобразование протоколов - все, что лучше всего подходит под вашу задачу.

DFC
источник
Это действительно просто и круто.
mbrownnyc
Я не знал netsed, это почти идеально подходит для моих целей. Единственное, что я не получаю, это как настроить «локальный прозрачный прокси» (см. Вопрос). Возможно, я должен настроить другой (виртуальный) сетевой интерфейс, чтобы получить это. Кстати, пока это самый удовлетворительный ответ.
etuardu
Вы используете универсальное ядро ​​дистрибутива? Если вы используете iptables, поддержка, вероятно, уже скомпилирована. Чтобы настроить прозрачный прокси-сервер, вам просто нужно заполнить соответствующую информацию для вашего хоста / портов. Взгляните на readme и посмотрите, заполняет ли он некоторые детали. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
DFC
Я думал, что netsed будет работать только на один пакет за раз? Таким образом, если запрос http был разделен на два пакета, регулярное выражение для замены не будет совпадать, и запрос будет передан на сервер без изменений.
Паулос
1
Хорошо, теперь, на случай, если кому-то понадобится это однажды: не то, чтобы я полностью это понял, но для того, чтобы действительно изменить пакеты OUTGOING (что операционная система НЕ хотела делать), вам придется изменить OUTPUT, а не PREROUTING. Кроме того, -Dвариант должен был быть -A для меня. Кроме того, для -jварианта, я должен был использовать DNAT --to-destination (ip) или REDIRECT --to-port. Наконец, я НЕ смог исправить ошибку сегментации netsed. см. также: ubuntuforums.org/showthread.php?t=2337389
phil294
3

iptables+ использование libnetfilter_qu - это еще один вариант, который будет делать то, что вы хотите:

«... [повторно внедрить] измененные пакеты в подсистему ядра nfnetlink_queue.»

Скорее всего, это даст вам большую расширяемость, так как это зависит от вас, чтобы написать программное обеспечение.

Также доступна оболочка для Python .

mbrownnyc
источник
2
Пример приложения, использующего netfilter_queue: github.com/rgerganov/nfqsed
rgerganov