@ashumkin
системный разработчик

Как проще осуществить подмену сырого TCP трафика (CentOS)?

Есть следующая ситуация:
Некий "железный" датчик общается с контроллером (программой, исходники которой утеряны - это проблема номер один ))) ) по "сырому" TCP: "пакет" состоит из маркер пакета,код [ответа ]операции, длина данных, данные, контрольная сумма.
Всё было хорошо, пока не добавили новый тип датчиков, по этому же протоколу, только длина данных увеличилась на один байт. Программа-контроллер не ожидает такого подвоха, и не воспринимает такие пакеты как правильные (ибо из-за ожидания определённой длины пакета, как минимум, не совпадает контрольная сумма, которая интерпретируется неверно).
Каким мне видится решение:
Повесить некий прокси, который будет подменять трафик, заменяя длину пакета на "правильную" и выкидывая этот лишний байт, и, в идеале, пересчитывать контрольную сумму (простое сложение байтов), но необязательно, т.к. этот лишний байт - пока что нулевой, т.е. на контрольную сумму не влияет.
Своего рода - атака MITM, только в целях "починить сломанное".

Вопрос:
Каким софтом можно осуществить задуманное? (крутится всё на CentOS 6.6)
Напомню: трафик сырой, не HTTP.
Также: контроллер ничего не знает про проксирование, коннектится напрямую по IP:port. Датчиков (и, соответственно, коннектов), в общем случае, несколько.
Смотрел/пробовал mitmproxy в режиме прозрачного прокси (iptables... --REDIRECT ..), но, как я понял, он заточен под HTTP, т.к. непонятно куда перенаправлять трафик (хотя использование скриптов на Python ох как доставляют!)
Почти подходит netsed, но у него очень простые замены: строка на строку, без PCRE (а пока допиливаю их к нему (слава open source!), решил задать вопрос сообществу)

З.Ы. Всё нужно срочно, переписывать программу-контроллер по новой ресурсов нет.
  • Вопрос задан
  • 1549 просмотров
Решения вопроса 1
@ashumkin Автор вопроса
системный разработчик
Всем спасибо за ответы.
В общем, был итоге был доработан netsed, чтобы в трафике можно было не только заменять строку на строку (в принципе, т.к. можно задавать шестнадцатиричные коды символов, то не только "строки"), но и добавлять (пока нужны только нулевые) и удалять байты в задаваемых местах.
Запускается в режиме прозрачного прокси, слушает порт NETSED_PORT и пробрасывает на порт датчиков (SENSOR_PORT; у всех датчиков он одинаковый и фиксированный).
netsed tcp NETSED_PORT 0 SENSOR_PORT s/.../.../ s/.../.../

Далее, как и было предложено dimoclus (почти: не DNAT, а REDIRECT)
iptables -t nat -A OUTPUT -p tcp --dport VIRT_PORT -j REDIRECT --to-port NETSED_PORT

В настройках "контроллера" в качестве порта датчика указывается VIRT_PORT.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
@alexxandr
you'll see in memory only 0xDEADFACE
напишите сами простую программу на С в виде прокси.
Ответ написан
@kshvakov
У вас же написанно "системный разработчик", возьмите любой язык к которому есть более менее простая библиотека для работы с tcp и напишите проксю ;)
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
по-быстрому я бы взял tcpdump, захватил бы им пакет в pcap, потом поправил (баш/питон/перл/что-угодно-чем-владеете), потом tcpreplay
tcpreplay
надо только контроллер заставить слушать или датчик - отправлять на разные порты.
Ответ написан
@dimoclus
Если написание TCP-прокси не вызывает проблем, то перенаправление трафика делается так:
iptables -t nat -A OUTPUT -p tcp --dst $DEST_IP --dport $DEST_PORT -j DNAT --to $PROXY_IP:$PROXY_PORT


Если же проблема в поиске/написании TCP-прокси — готового решения тут нет и, пожалуй, самым простым будет подмена вызовов read/readv/recv/recvmsg/write/writev/send/sendmsg (какие — рекомендую определить через strace) с помощью самописной библиотеки и LD_PRELOAD.
Ответ написан
Комментировать
Albibek
@Albibek
Вопросы есть? А если найду?
Если вы знаете python, лучше всего использовать scapy. Он достаточно простой, понятный, и точно умеет то, что вам нужно - ловить пакеты, разбирать, менять и пересылать куда надо.
Может быть, даже вообще обойдётесь hexinject-ом
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы