Дублировать TCP-трафик с помощью прокси-сервера
Мне нужно отправить (дублировать) трафик с одного компьютера (порт) и на два разных компьютера (порты). Мне также нужно позаботиться о сеансе TCP.
В начале я использовал em-proxy, но мне кажется, что накладные расходы довольно велики (он превышает 50% процессора).
Затем я установил haproxy, и мне удалось перенаправить трафик (не дублировать). Накладные расходы являются разумными (менее 5%).
Проблема заключается в том, что я не могу сказать в файле конфигурации haproxy следующее:
- прослушивание по определенному адресу: порт и все, что вы найдете, отправляете на двух разных машины: порты и отбросить ответы от одного из них.
Эм-прокси-код для этого довольно прост, но мне кажется, что EventMachine генерирует
много накладных расходов.
Прежде чем я выкопаю код haproxy и попытаюсь изменить (дублировать трафик), я бы хотел
знать, есть ли что-то подобное там?
Спасибо.
Ответы
Ответ 1
Я создал прокси только для этой цели.
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.
Ответ 2
Как насчет эксперимента 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-адресе (а не отвечать на арпы) или слушать беспорядочно.
Ответ 3
Попробуйте https://github.com/agnoster/duplicator.
Я попробовал teeproxy, но получил странные результаты с некоторыми запросами, отличными от GET.
Ответ 4
Я также написал обратный прокси/балансировщик нагрузки для аналогичной цели с Node.js (это просто для удовольствия, пока не готово к производству).
https://github.com/losnir/ampel
Он очень самоуверенный и в настоящее время поддерживает:
-
GET
Использование кругового выбора (1:1) -
POST
Использование разделения запросов. Понятий "мастер" и "тень" не существует - первым отвечающим является тот сервер, который будет обслуживать запрос клиента, а затем все другие ответы будут отброшены.
Если кто-то найдет это полезным, я могу улучшить его, чтобы сделать его более гибким.
Ответ 5
Я думаю, что ngx_http_mirror_module будет хорошим решением в таком случае. Вот небольшой обзор этого.