Мой новый опенсорс проект. Быстрый гибрид реверс-прокси и 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)
Что означает, что все они поддерживают выбранный метод аутентификации и ждут логина и пароля от клиента.
Клиент отсылает данные авторизации:
0104757365720470617373 # 01 - Subnegotiation Version; 0475736572 - user; 0470617373 - pass
MPServer вновь дублирует клиентский пакет и посылает его всем бэкенд-серверам.
Представим, что первый сервер ответил следующим образом:
0100 # 01 - Subnegotiation Version; 00 - Success
Что означает что клиент успешно аутентифицирован.
Нам не нужно ждать ответы остальных серверов — мы можем отфильтровать оставшиеся серверы используя следующее правило в конфиге:
[APPROVE_RULES] auth_success ^0100
Начиная с этого времени, клиентские запросы уходят только на один бэкенд-сервер, а MPServer работает как обычный реверс-прокси
Больше информации здесь.