Необходимые требования
Чтобы всё получилось нам понадобится:
- Сервер с Root доступом. Рекомендую вот этот
- Установленный Docker + Docker-Compose
- 10 - 20 минут времени
В двух словах про Medusa
Medusa является контейнером с обратным прокси, который представлен в виде HAProxy. В свою очередь помимо HAProxy в контейнере запускаются инстансы TOR к которым и подключается HAProxy

А с противоположной стороны к HAProxy прикручены http и socks5 прокси, к которым мы будем подключаться в качестве клиента, получая таким образом возможность пройти путь от HAProxy к TOR. Причём для получения http прокси используется Privoxy перед socks5 прокси.
Для старта Medusa мы должны будем задать несколько параметров, такие как количество голов(Heads) и количество сервисов TOR на каждую голову.
Подготовка
Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для Medusa
Сделаем нашего пользователя (не root !) владельцем этой директории
Конфигурация и запуск
Перейдём в директорию, которую мы создавали выше
Создадим фаил docker-compose.yml
И заполняем его таким таким содержанием. Данный конфиг подойдёт сразу под amd64 и arm64 архитектуры.
Рассмотрим основные параметры:
- 8800:8800 - порт мониторинга http прокси. Не обязательный, можно закомментировать. Покажет порты на которых у нас поднялась http прокся. Если хотите поменять на другой порт то меняйте только левую часть, правая должна быть статичной, например так 11223:8800
- 2090:2090 - Порт для веб интерфейса HAProxy. Также необязательный. В нём удобно смотреть статистику по всем проксям. Обратите внимание что для этого интерфейса задаётся логин и пароль, об этом ниже.
- 8888:8888 ... 8891:8891 - Порты для подключения http прокси каждый новый подключается к свой голове(Head).
- 1080:1080 - Порт для подключения socks5 прокси.
- HEADS=4 - Количество голов. По стандарту их 2, но мы запустим чуть больше. На каждой голове как принято у медуз, у нас будет по несколько инстансов тора, об этом ниже.
- TORS=4 - Количество инстансов на каждой голове.
- IP_CHANGE_SECONDS=180 - Название говорит само за себя. Как часто в секундах менять выходные ноды.
- HAPROXY_LOGIN=YOURUSER - Логин для веб панели HAProxy.
- HAPROXY_PASSWORD=YOURPASSWORD - Пароль для веб панели HAProxy.
С настройками разобрались. Стартуем контейнер:
Проверяем что всё ок
После того как стартанули контейнер можем сразу посмотреть логи
У меня это выглядит вот так

Убедились что всё ок, можем подключиться к нашей проксе. Тут нужно понимать что мы будем подключаться к какой то из голов медузы. В моих настройках в docker-compose.yml стоит что контейнер будет запускаться в 4 головы и по 4 инстанса тора на каждую голову.
Смотрим порты голов через веб интерфейс
Вспоминаем что у нас есть специальный порт зайдя на которой нам покажут адреса для каждой из голов. То есть
Выглядит это примерно так

Только нам конечно же нужно ещё заменить 127.0.0.1 на ip адрес своего сервера.
Подключение
Так как порты для подключения нам известны, а именно:
http://Ваш.ip.адрес.сервера:8889
http://Ваш.ip.адрес.сервера:8890
http://Ваш.ip.адрес.сервера:8891
То для проверки работы нам необходимо просто подключиться к ним. Для этого я буду использовать плагин FoxyProxy standart для Firefox с такими настройками

После чего активируем данную прокси в плагине и проверяем результат например на whoer

Как видно всё отработало отлично. Теперь нажмите сочитание клавишь "CTRL" "F5" - заметили? ip адрес поменялся, всё это потому что голова к которой мы подключены на порту 8888 в свою очередь подключена к 4 инстансам тора, а HAProxy в свою очередь каждый следующий запрос передаёт с помощью алгоритма round-robin на следуюший инстанс тора.
Получается что мы имеем одну строку ip:port за которой у нас 4 разных ip адреса. Ну и каждая такая строка это голова, которых у нас 4 штуки. Выходит что всего у нас сейчас 4*4 = 16 ip адресов тора.
И вроде бы на этом можно было закончить но все ещё есть 2 важных момента о которых хотелось бы поговорить...
Безопасность
Как может показаться на первый взгляд она тут есть, ведь мы же вводили логин и пароль для веб интерфейса HAProxy. Но это не то. Автор почему то не предусмотрел этот момент. Получается что в данный момент весь мир может использовать наш мост к сети тор) Разумеется такой вариант не подходит, поэтому нужно думать...
Этот вопрос можно решить с помощью фаервола. А у докера "особые отношения" с фаерволами, да и сами фаерволы бывают разные iptables, nftables и т.д. Тогда надо будет давать сразу кучу инструкций. Поэтому я придумал тут более универсальный вариант - а именно воспользоваться хостингом с FWaas(FireWall as a Service). То есть хостинг на котором дополнительный и отдельный фаервол, который можно редактировать через веб интерфейс.
FWaas встречается довольно часто, например у amazon, oracle, linode, и многих других. Но я буду рассматривать на примере вот этого хостинга. Если у вас какой то другой хостинг с FWaas - просто сделайте "по образу и подобию" моих настроек.
- Заходим в раздел Firewall и добавляем новый.
- Из двух режимов выбираем - разрешить трафик
- В пункте Входящий трафик добавляем правила
- Все добавляемые правила будут для подсети
- Если вы хотите открыть доступ только для своего ip адреса используйте маску/32 - Например правило для ip адреса google будет выгдядеть вот так 8.8.8.8/32
- Пожалуй я везде буду использовать ip адрес гугла, а вы поменяйте на свой.
Итак, добавляем наше первое правило для SSH

Теперь добавим правила для веб интерфейса HAProxy

Правила для socks5 proxy

И наконец правила для http proxy голов

Что касается правила для порта 8800, то я советую его вообще не добавлять. И вдобавок его можно закомментировать в docker-compose.yml
Итак - все необходимые правила были добавлены. На счёт правил для Исходящего трафика не переживайте - это поле оставляем пустым и всё будет работать как надо. Далее выбираем сервер к которому хотим чтобы эти правила применялись, опционально выбираем имя для фаервола и нажимаем Создать.
В конечном итоге всё должно выглядеть вот так

обязательно проверьте эти правила, например сначала проверьте что всё работает с вашим ip адресом, а потом в правилах FWaas вместо своего ip напишите чужой и проверьте снова - если у вас пропал доступ на чужом ip и восстановился на своём, то это говорит о том что всё прекрасно работает.
Стабильность
Как оказалось со стабильностью тоже иногда бывают траблы. Если запрос через инстанс TOR завершается неудачей, то в HAProxy эта голова пометиться как не рабочая, не смотря на то, что другие инстансы тора на этой голове в порядке. По прошествию какого то времени доступ к голове восстановиться.
Но иногда случается так что все 4 головы одновременно становятся недоступными из за таких коллизий. Тогда сразу все прокси отказывают.
Я придумал воркэраунд. Создадим в директории с docker-compose.yml скрипт medusa-check.py.
В основном скрипте используется отправка в Telegram, но вам он может не подойти, т.к. отправка в этом скрипте идёт в группу ботом, причем не просто в группу - а именно в топик группы. Поэтому если вам не нужен функционал отправки в группу, то воспользуйтесь скриптом без отправки в тг.
Суть работы скрипта заключается в том что мы вписываем адреса для проверки(уже вписаны) и необходимые прокси для проверки. Если вы поднимали контейнер со значениями по умолчанию, то все прокси также вписаны в скрипт. Далее указав информацию, скрипт заходит под разными проксями на ссылки для проверки, и если эти ссылки не открывается то перезагружает контейнер. В случае первого скрипта ещё пишет в тг.
Остается только добавить это всё в крон
Я добавил такую запись - выполнять каждые 7 минут
*/7 * * * * cd /app/proxy/medusa-proxy && python3 medusa-check.py
Тут тоже обратите внимание что перед выполнением скрипт заходит в папку где лежит docker-compose.yml, если вы в процессе установки что то поменяли, то тут надо это тоже отразить.
Ну что ж теперь всё работает как надо, безопасно и стабильно...
Доп инфо
github.com/datawookie/docker-tor-privoxy
Mission completed!
Отправить комментарий