LINUX.ORG.RU
ФорумAdmin

HAProxy + TCP

 ,


0

1

Доброго времени суток!
Необходимо сделать дублирование tcp-траффика, приходящего в систему, на разные сервера. Ничего, кроме дублирования (например, управления нагрузкой и т.д.), делать не нужно.
Я хочу попробовать использовать HAProxy.
Подскажите, какие готовые решения подойдут для решения этой задачи?
Есть ли решение более подходящее, чем HAProxy?
Не могли бы помочь с конфигами для решения данной задачи?

iptables tee, ssh+tcpdump+remote wireshark, любой сниффер + sshfs, клиент-серверный сниффер.
xinetd + bash tee + socat

Аппаратное решение: port mirroring .

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ktulhu666

1. iptables tee - я так понял, что надо устроить пляски с бубном, чтобы это поднять; 2. ssh+tcpdump+remote wireshark - будет жрать ресурсы за счет ssh; 3. любой сниффер + sshfs - будет жрать ресурсы за счет ssh; 4. клиент-серверный сниффер - какой например? 5. xinetd + bash tee + socat - можно просто socat, но он многопроцессный, что тоже не хорошо. Это дублирование нужно не для отладки, а для работе в продакшн. А эти решения достаточно ресурсоемкие. Так же нужно сохранить разделение на tcp-соединения при ретрансляции. Могут ли эти решения это обеспечить? Получается, что придется все-таки писать что-то свое?

anonymous ()
Ответ на: комментарий от anonymous

1. Нет, ты просто не понял, как гуглом пользоваться.
2. Вам никто не мешает использовать socat или xinted как враппер stdout для tcpdump.
3. Аналогично 2.
4. go to google
5. Не для продакшн.

Для продашена используется port mirroring.

Так же нужно сохранить разделение на tcp-соединения при ретрансляции.

What!?

А эти решения достаточно ресурсоемкие.

iptables tee - нисколько.

Могут ли эти решения это обеспечить?

iptables tee точно может, за другие не могу сказать.

Получается, что придется все-таки писать что-то свое?

Получается, что придется все-таки погуглить по поводу того, что Вам выше написали и удивится, что обычно для этого используются свитчи с mirror port.
Но особенно комично данное утверждение смотрится с этим:

я так понял, что надо устроить пляски с бубном, чтобы это поднять

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ktulhu666

По поводу сохранения разделения соединений.
К программе ретрансляции будут коннектиться клиенты. Эти tcp-соединения - долгоживущие. Серверная программа, которая уже есть, обрабатывает эти соединения по принципу 1 клиент - 1 соединение. Другая программа, которую нужно добавить в систему и которая будет получать с ретранслятора те же данные, так же должна получать данные от внешних tcp-клиентов по отдельным tcp-соединениям. То есть ретранслятор не должен данные с входящих в него tcp-соединений скидывать в одно соединение для каждого сервера.
Можно ли описанными выше способами (кроме аппаратного), так сделать?

ares4322 ()
Ответ на: комментарий от ares4322

Вы каким-то общими терминами оперируете и много воды льете (windows-админ, чтоли?).

Я так понял, что Вы имеете в виду, что к программе с одного IP коннектится только один клиент используя только одно соединение, при этом клиентов (с разных IP) может быть много. Вероятно, программа создает нить на соединение (или там, как в апаче, главный процесс и дети?). Если так, то зачем это было писать? Достаточно сказать, что программа поддерживает несколько одновременных входящих соединений и жесткий учет (анализ и выделение) каждого потока не особо нужно. Все вышеуказанные методы, кроме inetd нна входе это поддерживают.
Точнее xinetd будет работать, но будет форкать по процессу-перехватчику на поток.

Если Вы потом без траха хотите анализировать траффик, то смотрите в сторону wireshark-интегрированых решений или iptables tee.

Если Вам нужен не полный дамп для последующего аудита безопасности или анализа багов, а только подробная статистика (кто куда когда по какому порту подключился и сколько накачал), то для этого есть netflow.

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ktulhu666

В том-то и дело, что я не админ, а разработчик серверной программы, которая уже существует) И я хочу разобраться, можно ли решить задачу дублирования клиентского трафика без переделки моего сервера. Я понял, что можно решить эту задачу аппаратно с помощью port forwarding. Но меня интересуют программные решения, потому что скорее всего наш хостер не сможет нам обеспечить аппаратное решение (я им вопрос задал, но пока не ответили).Все это нужно это того, чтобы второй сервер, на который будут дублироваться данные, перекодировал данные в другой формат и передавал в другую внешнюю систему.

anonymous ()
Ответ на: комментарий от anonymous

Port forwarding делать будете на своем роутере дома, а тут port mirroring.

Я уже третий раз Вас пишу, что можно, и что самый малонакладный вариант - iptables tee с определенного интерфейса. Самый простой (и при этом более детальный (L2, a не L3) - это tcpdump/dumpcap+ssh(или socat, если траффика много)+wireshark.

wiki.wireshark.org/CaptureSetup/Pipes вот тут однострочник внизу лежит.
Не забудьте исключить соответствующий траффик сниффера при фильтрации, если будете передавать через тот же интерфейс, что сниффаете.


Скажите, ради интереса, а какую ОС Вы на десктопе используете?

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ktulhu666

Использую Ubuntu.
Я с socat начал разбираться. Я понял, что для него указывается входящий адрес и один исходящий адрес. Но нужно-то 2 исходящих адреса сделать. Как это сделать, я не знаю.

ares4322 ()
Ответ на: комментарий от ares4322

Входящий и исходящий ПОТОК. А не адрес. Мало того, потоки могуть дуплексными. Читайте манул. Попробуйте сначала по ssh, возможно, что Вам хватит.

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ktulhu666

Я так понял, что можно принимать данные из сокета, передавать их, например, в stdout, далее передавать в tee, а tee соединять еще с 2мя socat, каждый из которых будет передавать на свой сервер. Наверное, я что-то перемудрил. Но проблема в том, что данные нужно пересылать в оба конца для первого сервера, а как такая схема это решает - непонятно.

ares4322 ()
Ответ на: комментарий от ktulhu666

Потихоньку начал разбираться с iptables tee.
Не подскажите, правильно ли я пишу правило?
sudo iptables -t mangle -A PREROUTING -i eth0 -j TEE --gateway 192.168.49.100
192.168.49.100 - машина, на которую будут транслироваться данные.

ares4322 ()
Ответ на: комментарий от ares4322

Расщиплять дуплексное соединение, делать два tee, сводить два полудуплексных в дуплексное :) tee будет отправлять в два разных потока и вот тут не могу сказать, как правильно (безопасно, а не через одновременную запись дампа в один дескриптор/сокет) делать.Только учтите, что xinetd-реализация будет только L5-данные писать, и это очень криво.

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ares4322

-i будет значить, что только ВХОДЯЩИЕ пакеты будут подходить под правило. Нужен также -о для зеркалирования исходящих (оформите отдельным правилом). Также в исходящем правиле добавьте ! -d gw_ip (вроде так, погуглите), иначе (если создатели tee, конечно, не предусмотрели встроенный костыль, который сам исключает попадание пакетов от tee в mangle iptables) будут дубликаты исходящих данных и возможен эффект лавинных ретрансляций (ретрансляция, ретрансляция ретрансляции, ретрансляция ретрансляции ретрансяции)
.
Также нужно учитывать, что (в отличии от tcpdump, wireshark и т.д.) будут проблемы с передачей по глобальной сети, т.к. передача будет возможна только внутри одного широковещательного домена. Тогда уже нужно будет использовать openvpn, что уменьшает нужность.

Может, Вы, таки, раскроете суть вашей проблемы? А то, может, у Вас там потоки в пару мегабит или вообще можно запустить wireshark прям на сервере с пробросом исков или в Xvfb (+x11vnc).

Меня не покидает мысль, что Вы не совсем понимаете, как использовать микроскоп и пытаетесь забивать им гвозди.

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ktulhu666

Проблема в том, как добавить в систему функцию репликации клиентского трафика на другой сервер без переделку существующей серверной программы. tcp-соединения долгоживущие. Прикладной протокол, который работает поверх tcp и которые поддерживает сервер, с подтверждением (это еще до меня придумали). Протокол оптимизирован по размеру. Каждый пакет от клиента с учетом заголовка - от 16 до 400 байт. Сейчас клиентов порядка 450, но их количество медленно, но верно растет. В плане нагрузки я не знаю, много это или нет.

ares4322 ()
Ответ на: комментарий от ares4322

Нагрузка измеряется в pps и мегабитах/сек (хотя, если размер пакета статичен и известен, то долстаточно и одного параметра), а не в клиентах.

Что за приложение и сколько процентов жрет проца (это важно) и в чем проблема доставить иксовые либы + wireshark, либо tcpdump->socat->tcp, tcp->socat->wireshark? Если вообще ничего прогать нельзя, то tcpdump + nc или ssh. Я потому и спрашиваю, что если у Вас ресурсов достаточно, то предпочтительнее использовать этот вариант.

А вообще тут основной момент в том, что Ваш админ - идиот. Не будь он таковым, использовал бы виртуализацию. Сниффер можно было бы поставить в виртулке рядом (br настроить на 0 arp-записей) или хосте.

ktulhu666 ☆☆☆ ()
Ответ на: комментарий от ktulhu666

Приложение - многопоточный tcp-сервер на С (1 поток на соединение). Нагрузку на CPU сильно не создает так как его задача прнять данные, разобрать, положить в БД и отослать ответ клиенту.
Все.
Прогать можно (можно делать что угодно), но не хотелось бы.
По-поводу админа, Вы будете удивлены, но у нас его нет. почему - все вопросы к начальству.

ares4322 ()
Ответ на: комментарий от ktulhu666

Посмотрел трафик на сервере с помощью iptraf - в среднем в сумме на прием и передачу - 750 кбит/сек.

ares4322 ()
Ответ на: комментарий от ares4322

Уважаемый, я рекомендую Вам приобрести головной мозг.
Вы столько времени потратили и моей и своего, хотя я с самого начала сказал, что при маленьких нагрузках и трафике нужно использовать wireshark + tcpdump via ssh. Выше, в одной из ссылок есть команда, но всё гуглиться на раз.

В следующий раз сразу выкладывайте все карты, и не тратьте чужое и своё время.

ktulhu666 ☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.