Как спрятать свой сервис от посторонних глаз (Tor как туннель в белый интернет)

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Предисловие

Привет пользователям xss.is !

Сегодня я хочу рассказать о том, как можно взять и спрятать ваш любимый сервис (веб-приложение, игровой-сервер, сервис для обмена файлами - да что угодно!), чтобы им можно было пользоваться анонимно и основной сервер был недосягаем для многих. Если вы когда-нибудь играли с Tor, то наверняка знаете о hidden services. Благодаря им можно сделать так, что ваш сервис будет доступен по адресу вида abcdefg12345.onion, находящемуся где-то в сети Tor, при этом ни IP, ни физическая локация сервера не светятся. Но что если мы хотим распараллелить трафик через несколько таких onion-доменов, чтобы не забивать один-единственный Tor-туннель и прокинуть их в белый интернет? Или удобно сделать масштабируемый балансер? Тут вам на помощь придёт проект TORTCB - Tor TCP Chain Balancer. Ниже я опишу, что это такое, зачем оно нужно и как запустить.

Зачем мне это нужно?

Tor умеет многое:
  • Предоставлять анонимность. Хост-сервер, спрятанный за onion-адресом, не "светится" во внешнем Интернете напрямую.
  • Упрощать доступ к сервису без публичного IP и без проброса портов.
  • Защищать приватность: IP вашего сервера известен только вам, а внешне виден лишь onion-адрес.
Но есть нюанс: когда вы поднимаете обычный Tor Hidden Service, он пользуется одним Tor-процессом, одним туннелем. Если вам хочется повышенной устойчивости или расширения по нагрузке, неплохо создать несколько onion-адресов, независимых друг от друга, чтобы балансировать входящие подключения. Как раз это и делает TORTCB.

Что такое TORTCB?

TORTCB (Tor TCP Chain Balancer) - это, грубо говоря, два Docker-образа, которые вместе решают следующую задачу:

tor_forward:
  • Поднимает N штук тор-сервисов на вашем хосте.
  • Каждый сервис "передаёт" трафик дальше на локальный порт вашего приложения.
  • Создаёт domains.list - в нём перечисляются все сгенерированные .onion-домены и их порты.
haproxy_receiver:
  • Забирает список onion-адресов и поднимает отдельный Tor-клиент для каждого из них (т. е. у каждого onion-домена получается свой Tor-процесс).
  • Запускает socat для приёма трафика с каждого onion-адреса отдельно.
  • Создаёт HAProxy, который "снаружи" (на одном TCP-порте) балансирует трафик между всеми этими onion-туннелями.
В итоге мы получаем:
  • Множество onion-адресов, на каждый из которых можно приходить снаружи.
  • Единый точечный вход (порт HAProxy), объединяющий весь этот поток.
  • Разведение нагрузки по нескольким Tor-туннелям вместо одного.

Схема в общих чертах

1738664969359.png



  1. Трафик идёт через один или несколько onion-доменов (предназначенных для сервиса).
  2. tor_forward принимает этот трафик, прокидывает на localhost:5000 (или другой порт, где крутится ваш сервис).
  3. haproxy_receiver "заворачивает" каждый onion-домен во свой Tor-клиент и потом агрегирует потоки через HAProxy.
Но здесь важно понимать логику:
  • Если вы хотите иметь полноценное балансирование входящих onion-подключений, вам достаточно "ходить" на любой из сгенерированных onion-адресов (или дать пользователям список).
  • Порт 9080 в контейнере haproxy_receiver (или какой вы там зададите) будет вашим локальным (или внешним) "единым входом" наружу.

Краткая подготовка к запуску

Чтобы всё запустить, нам понадобится:
  • Docker и, желательно, docker compose (упрощает жизнь).
  • Сам проект TORTCB (доступен здесь: GitHub - keklick1337/tortcb).
  • Готовое приложение, которое мы хотим «засунуть» за Tor (например, локальный http-сервер, работающий на 5000 порту).
Давайте разберёмся, как разворачивать всё в деталях.

Шаг 1: Клонируем репозиторий

Сделайте что-то вроде
Bash: Скопировать в буфер обмена
Код:
git clone https://github.com/keklick1337/tortcb.git
cd tortcb
Внутри вы увидите директории tor_forward/ и haproxy_receiver/, а также README.md с документацией.

Шаг 2: Настраиваем tor_forward

tor_forward
- это контейнер, который поднимает несколько Tor hidden services. По умолчанию он:
  • Слушает трафик на onion-адресах и переадресует его на HOST_IP:HOST_PORT (нужно указать, где запущен ваш сервис).
  • Создаёт domains.list (список ваших onion-доменов).
2.1. Сборка контейнера
Bash: Скопировать в буфер обмена
Код:
cd tor_forward
docker build -t tor_forward .

2.2. Запуск
Bash: Скопировать в буфер обмена
Код:
docker run -d \
  --name tor_forward \
  -e HOST_IP=host.docker.internal \
  -e HOST_PORT=5000 \
  -e TOR_INSTANCES=3 \
  -e RANDOM_PORT_START=20000 \
  -v $(pwd)/data/tor_forward:/var/lib/tor/hidden_services \
  tor_forward

Основные параметры:
  • HOST_IP и HOST_PORT - это адрес и порт вашего приложения. На Mac/Windows можно указать host.docker.internal. На Linux иногда придётся прописать что-то вроде 172.17.0.1 или localhost.
  • TOR_INSTANCES: сколько onion-доменов вы хотите создать. Например, 3 или 5. (Каждый процесс использует ресурсы процессора, выбирайте количество доменов исходя из ресурсов сервера)
  • RANDOM_PORT_START: c какого порта начнёт Tor перенаправлять. По умолчанию 20000, затем 20001, 20002 и т. д.
В результате в каталоге ./data/tor_forward/ появятся сгенерированные файлы Tor (ключи и хостнеймы). Там же контейнер создаст файл domains.list, в котором лежат строки типа:
Код: Скопировать в буфер обмена
Код:
abcde12345.onion:20000
fghij67890.onion:20001
...
Это значит, что у нас есть onion-домен abcde12345.onion, слушающий на порту 20000, и т. д.

Шаг 3: Настраиваем haproxy_receiver

haproxy_receiver
- это контейнер, который поднимает целый "зоопарк" Tor-клиентов (по одному на каждую строку из domains.list), а затем сводит всё в единый HAProxy (который вы сами можете открыть "наружу").

3.1. Сборка контейнера
Bash: Скопировать в буфер обмена
Код:
cd ../haproxy_receiver
docker build -t haproxy_receiver .

3.2. Запуск
Bash: Скопировать в буфер обмена
Код:
docker run -d \
  --name haproxy_receiver \
  -e HAPROXY_LISTEN_PORT=9080 \
  -e BASE_LOCAL_PORT=30000 \
  -e BASE_SOCKS_PORT=9050 \
  -e STATS_PORT=9090 \
  -e STATS_USER=admin \
  -e STATS_PASS=mypassword \
  -v path_to_domains_list/domains.list:/etc/domains.list:ro \
  -p 9080:9080 \
  -p 9090:9090 \
  haproxy_receiver
Здесь:
  • -v path_to_domains_list/domains.list:/etc/domains.list:ro - прокидываем файл, созданный первым контейнером.
  • HAPROXY_LISTEN_PORT=9080 - это порт внутри контейнера, который, благодаря -p 9080:9080, будет доступен снаружи.
  • STATS_PORT=9090, STATS_USER=admin, STATS_PASS=mypassword - можно включить панель статистики HAProxy, чтобы видеть подключения, загрузку и т. п.
После запуска, если заглянуть в логи, вы увидите, что haproxy_receiver для каждой строки в domains.list поднимает по одному Tor-клиенту (используя порты 9050, 9051, 9052… по порядку) и socat (30000, 30001, 30002…). Наконец, эти все порты объединяются в единый frontend HAProxy на 9080.

Шаг 4: Проверка и использование
  1. Проверьте, что сервис, который вы хотели спрятать, реально запущен на HOST_IP:HOST_PORT. Скажем, это может быть локальный веб-сервис на localhost:5000.
  2. Посмотрите файл ./data/tor_forward/domains.list и выберите один из onion-доменов, например abcde12345.onion:20000.
  3. Подключитесь к вашему onion-домену через Tor Browser или консольный curl с socks5-прокси на 9050 (если вы знаете, как это делать). Если всё в порядке, вы будете доставлены к вашему скрытому сервису.
    Одновременно вы можете проверить "внешний порт" 9080, который haproxy_receiver открыл снаружи. В реальной боевой настройке вы можете, например, прокидывать этот 9080 на любой другой сервер, прятать его за VPN, либо использовать как привычный порт на 80 или 443 (делая какие-то доп. настройки).
  4. HAProxy Stats. Перейдите по ссылке http://<ваш_docker_host>:9090/stats и введите admin/mypassword. Увидите живую статистику.

Пример с docker-compose.yml

Если вам лениво гонять всё вручную, можно написать docker-compose:
YAML: Скопировать в буфер обмена
Код:
version: "3.8"

services:
  tor_forward:
    build: ./tor_forward
    container_name: tor_forward
    environment:
      - HOST_IP=host.docker.internal
      - HOST_PORT=5000
      - TOR_INSTANCES=5
      - RANDOM_PORT_START=20000
    volumes:
      - ./data/tor_forward:/var/lib/tor/hidden_services

YAML: Скопировать в буфер обмена
Код:
version: "3.8"

services:
  haproxy_receiver:
    build: ./haproxy_receiver
    container_name: haproxy_receiver
    environment:
      - HAPROXY_LISTEN_PORT=9080
      - BASE_LOCAL_PORT=30000
      - BASE_SOCKS_PORT=9050
      - STATS_PORT=9090
      - STATS_USER=admin
      - STATS_PASS=mypassword
    volumes:
      - path_to_domains_list/domains.list:/etc/domains.list:ro
    ports:
      - "9080:9080"
      - "9090:9090"

После этого на каждом из серверов:
Bash: Скопировать в буфер обмена
docker-compose up -d --build
Контейнер tor_forward сгенерирует domains.list, затем haproxy_receiver прочтёт его и развернёт для каждого onion-домена отдельный Tor + socat. У вас будут onion-домены, а снаружи единый порт 9080.

Подводные камни и полезные советы
  1. host.docker.internal в Linux может не работать (в отличие от Mac/Windows). Тогда используйте реальный IP (например, 172.17.0.1) или запускайте контейнеры в режиме network host.
  2. Если вы указываете несколько Tor-сервисов (TOR_INSTANCES=10, например), они создадут 10 onion-доменов и 10 соответствующих портов. Проследите, чтобы ваша система тянула такую нагрузку. Tor + socat на каждом домене могут подъедать ресурсы.
  3. При каждом запуске контейнера tor_forward в одну и ту же директорию data/tor_forward onion-адреса сохраняются. Если вам нужно, чтобы они не менялись, не удаляйте файлы, не сбрасывайте том.
  4. Безопасность: поскольку HAProxy консолидирует трафик и открывается наружу, убедитесь, что у вас нет утечек IP. Если вы хотите, чтобы внешний мир доступался только через onion-домены, вам не обязательно маппить порт 9080 наружу. Вы можете использовать docker network и т.п.
Итоги

Мы получили "комбайн" из нескольких Tor hidden services и HAProxy. Теперь трафик на сервис распределяется по нескольким Tor-туннелям, что повышает отказоустойчивость при высоких нагрузках и делает скрытый сервис более гибким.
  • Масштабируемость: хотите больше onion-доменов - поднимайте больше экземпляров.
  • Простота: весь механизм запускается через пару Docker-контейнеров или docker-compose.
Если вам нужно спрятать свой сервис (будь то веб, SSH, база данных с доступом для друзей и т.д.) и при этом вы хотите, чтобы нагрузка распределялась по нескольким "луковым" точкам, TORTCB - отличный инструмент.
Мой репозиторий с проектом: TORTCB - GitHub.
Если возникнут вопросы, пишите issues.
Анонимных вам сервисов и быстрых Tor-соединений!



п.с. буду раз звёздочкам на гитхабе. Это будет лучшая благодарность мне за такой простой и удобный продукт






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