no-style

Поднимаем десятки backconnect TOR proxy в докер контейнере

Поднимаем десятки backconnect TOR proxy в докер контейнере
Недавно понадобилось произвести некоторые "тесты" в сети TOR. Но привычный инструмент, программа advor ни в какую не хотела подключаться к TOR. Как уже потом выяснилось сейчас для подключения нужно настраивать мосты. После поисков нашёл для себя отличную замену и поднял целую сеть бекконнект прокси TOR. Подробности внутри.


Необходимые требования

Чтобы всё получилось нам понадобится:







В двух словах про Medusa

Medusa является контейнером с обратным прокси, который представлен в виде HAProxy. В свою очередь помимо HAProxy в контейнере запускаются инстансы TOR к которым и подключается HAProxy

medusa container

А с противоположной стороны к HAProxy прикручены http и socks5 прокси, к которым мы будем подключаться в качестве клиента, получая таким образом возможность пройти путь от HAProxy к TOR. Причём для получения http прокси используется Privoxy перед socks5 прокси.

Для старта Medusa мы должны будем задать несколько параметров, такие как количество голов(Heads) и количество сервисов TOR на каждую голову.







Подготовка

Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём необходимые директории для Medusa

sudo mkdir -p /app/proxy/medusa-proxy

Сделаем нашего пользователя (не root !) владельцем этой директории

sudo chown -R $USER:$USER /app/proxy/medusa-proxy






Конфигурация и запуск

Перейдём в директорию, которую мы создавали выше

cd /app/proxy/medusa-proxy

Создадим фаил docker-compose.yml

nano 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.




С настройками разобрались. Стартуем контейнер:

sudo docker-compose up -d







Проверяем что всё ок

После того как стартанули контейнер можем сразу посмотреть логи

sudo docker logs medusa-proxy

У меня это выглядит вот так

docker logs medusa-proxy

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







Смотрим порты голов через веб интерфейс

Вспоминаем что у нас есть специальный порт зайдя на которой нам покажут адреса для каждой из голов. То есть

http://Ваш.ip.адрес.сервера:8800/

Выглядит это примерно так

medusa head ports for http

Только нам конечно же нужно ещё заменить 127.0.0.1 на ip адрес своего сервера.







Подключение

Так как порты для подключения нам известны, а именно:

http://Ваш.ip.адрес.сервера:8888
http://Ваш.ip.адрес.сервера:8889
http://Ваш.ip.адрес.сервера:8890
http://Ваш.ip.адрес.сервера:8891

То для проверки работы нам необходимо просто подключиться к ним. Для этого я буду использовать плагин FoxyProxy standart для Firefox с такими настройками

medusa foxyproxy http

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

medusa foxyproxy 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

FWaas-1


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

FWaas 2


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

FWaas 3


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

FWaas 4


Что касается правила для порта 8800, то я советую его вообще не добавлять. И вдобавок его можно закомментировать в docker-compose.yml

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

В конечном итоге всё должно выглядеть вот так

FWaas 5

обязательно проверьте эти правила, например сначала проверьте что всё работает с вашим ip адресом, а потом в правилах FWaas вместо своего ip напишите чужой и проверьте снова - если у вас пропал доступ на чужом ip и восстановился на своём, то это говорит о том что всё прекрасно работает.







Стабильность

Как оказалось со стабильностью тоже иногда бывают траблы. Если запрос через инстанс TOR завершается неудачей, то в HAProxy эта голова пометиться как не рабочая, не смотря на то, что другие инстансы тора на этой голове в порядке. По прошествию какого то времени доступ к голове восстановиться.

Но иногда случается так что все 4 головы одновременно становятся недоступными из за таких коллизий. Тогда сразу все прокси отказывают.

Я придумал воркэраунд. Создадим в директории с docker-compose.yml скрипт medusa-check.py.

В основном скрипте используется отправка в Telegram, но вам он может не подойти, т.к. отправка в этом скрипте идёт в группу ботом, причем не просто в группу - а именно в топик группы. Поэтому если вам не нужен функционал отправки в группу, то воспользуйтесь скриптом без отправки в тг.

Суть работы скрипта заключается в том что мы вписываем адреса для проверки(уже вписаны) и необходимые прокси для проверки. Если вы поднимали контейнер со значениями по умолчанию, то все прокси также вписаны в скрипт. Далее указав информацию, скрипт заходит под разными проксями на ссылки для проверки, и если эти ссылки не открывается то перезагружает контейнер. В случае первого скрипта ещё пишет в тг.

Остается только добавить это всё в крон

sudo crontab -e

Я добавил такую запись - выполнять каждые 7 минут

# check medusa is running
*/7 * * * * cd /app/proxy/medusa-proxy && python3 medusa-check.py

Тут тоже обратите внимание что перед выполнением скрипт заходит в папку где лежит docker-compose.yml, если вы в процессе установки что то поменяли, то тут надо это тоже отразить.

Ну что ж теперь всё работает как надо, безопасно и стабильно...







Доп инфо

github.com/datawookie/docker-tor-privoxy

medusa multi headed tor proxy


Mission completed!

Комментарии