Дублирующий TCP-трафик с прокси - PullRequest
26 голосов
/ 30 августа 2011

Мне нужно отправлять (дублировать) трафик с одной машины (порта) и на две разные машины (порты).Мне нужно также позаботиться о сеансе TCP.

В начале я использовал em-proxy , но мне кажется, что накладные расходы довольно большие (они превышают 50%ЦПУ).Затем я установил haproxy и мне удалось перенаправить трафик (не дублировать).Накладные расходы являются разумными (менее 5%).

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

Код Em-proxy для этого довольно прост, но мне кажется, что EventMachine генерирует много служебных данных.

До того, как япокопайтесь в коде haproxy и попытайтесь изменить (дублировать трафик). Хотелось бы узнать, есть ли что-то подобное?

Спасибо.

Ответы [ 5 ]

23 голосов
/ 25 сентября 2013

Я создал прокси только для этой цели.

https://github.com/chrislusf/teeproxy

Использование

./teeProxy -l :8888 -a localhost:9000 -b localhost:9001

tee-proxy - это обратный прокси. Для каждого входящего запроса он клонирует запрос на 2, а затем перенаправляет их на 2 сервера. Результаты с сервера a возвращаются как обычно, но результаты с сервера b игнорируются.

tee-proxy обрабатывает как GET, POST, так и другие методы HTTP.

9 голосов
/ 31 августа 2011

Как насчет экспериментальной программы iptables ROUTE target? У него есть опция "тройник" для зеркалирования трафика:

http://www.netfilter.org/projects/patch-o-matic/pom-external.html#pom-external-ROUTE

Что позволит вам отражать трафик с помощью чего-то вроде:

iptables -A PREROUTING -t mangle -p tcp --dport 80 -j ROUTE --gw 1.2.3.4 --tee
iptables -A POSTROUTING -t mangle -p tcp --sport 80 -j ROUTE --gw 1.2.3.4 --tee

Второй компьютер должен находиться в той же подсети и должен либо прослушивать целевой IP-адрес (а не отвечать на arps), либо беспорядочно прослушивать.

3 голосов
/ 08 мая 2015

Попробуйте https://github.com/agnoster/duplicator.

Я пытался teeproxy , но получил странные результаты с некоторыми запросами, отличными от GET.

0 голосов
/ 15 февраля 2019

Мне нужно было что-то, что могло бы также передавать трафик TCP, но не было навязчивым, поэтому я не мог поместить что-то промежуточное в качестве обратного прокси-сервера, например.

Что я сделал, так это сделал в основном использование логики tcpdump / wireshark (перехват пакетов) в процессе Go, который вы можете настроить для выполнения некоторых задач.

Для кого может быть полезным код можно найти здесь: https://github.com/RobinUS2/teecp

0 голосов
/ 23 июля 2018

Я также написал обратный прокси / балансировщик нагрузки для аналогичной цели с Node.js (это просто для удовольствия, пока не готово к производству).

https://github.com/losnir/ampel

Он очень самоуверенный и в настоящее время поддерживает:

  • GET Использование циклического выбора (1: 1)
  • POST Использование разделения запроса. Понятий «мастер» и «тень» не существует - первым отвечающим является тот, который будет обслуживать запрос клиента, а затем все остальные ответы будут отброшены.

Если кто-то находит это полезным, я могу улучшить его, чтобы сделать его более гибким.

...