Multicast Proxy Server

Мой новый опенсорс проект. Быстрый гибрид реверс-прокси и Deep Packet Inspection (DPI) написанный на C.
В отличии от обычного реверс-прокси, он может редиректить клиентские запросы на множество бэкенд-серверов за одним(!) портом.
Нужный бэкенд-сервер выбирается на лету во время стадии «переговоров» по клиентскому протоколу. Для этого используется анализ ответов бэкенд-сервера. После выбора нужного бэкенд-сервера, MPServer работает как обычный реверс-прокси.
Если у вас существует только один бэкенд-сервер, MPServer может работать, если хотите, как обычный TCP или UDP реверс-прокси.
MPServer не является балансировщиком нагрузки, но может быть использован как его «тупой» аналог. Клиентские запросы будут перенаправлены на первый ответивший бэкенд-сервер.
MPServer, вероятно, может работать как мультиплексор протоколов SSLH.

Как это работает

MPServer дублирует клиентские запросы на все бэкенд-серверы. После, он начинает отфильтровывать бэкенд-серверы, ожидая первый валидный ответ от любого сервера (остальные серверы отфильтровываются). Фильтрация осуществляется на основе анализа содержимого пакета от бэкенд-сервера. Анализ осуществляется на основе регулярного выражения.
Обычно, вам нужно только описать такое регулярное выражение на основе спецификации клиентского протокола.
Примеры конфигов для протоколов OpenVPN(TCP и UDP), SOCKS5, HTTP и L2TP/IPSec можно найти в репозитории.

Пример для протокола SOCKS5

Задача: Аутентифицировать клиента на одном из бэкенд-серверов. Отфильтровать остальные серверы.

Клиент открывает соединение и посылает MPServer запрос по протоколу SOCKS5 (HEX):

050102 # 05 - Protocol version; 01 - Auth method count; 02 - Auth by user/pass

MPServer дублирует запрос ко всем бэкенд-серверам.
После, MPServer начинает принимать ответы от серверов. Представим, что все они ответили следующим образом:

0502 # 05 - Protocol version; 02 - Accepted auth method (user/pass)

Что означает, что все они поддерживают выбранный метод аутентификации и ждут логина и пароля от клиента.
Stage1
Клиент отсылает данные авторизации:

0104757365720470617373 # 01 - Subnegotiation Version; 0475736572 - user; 0470617373 - pass

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

0100 # 01 - Subnegotiation Version; 00 - Success

Что означает что клиент успешно аутентифицирован.
Нам не нужно ждать ответы остальных серверов — мы можем отфильтровать оставшиеся серверы используя следующее правило в конфиге:

[APPROVE_RULES]
auth_success ^0100

Stage1
Начиная с этого времени, клиентские запросы уходят только на один бэкенд-сервер, а MPServer работает как обычный реверс-прокси.

Больше информации здесь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *