Все системы работают Амстердам · Париж · Рейкьявик +5 Оплата через Криптовалюта
Сети и self-hostingСредний уровень29 мин чтенияОбновлено 2026-09-14

Разместите .onion-сайт на VPS, не выдав расположение сервера

Onion-адрес — это не домен со странным окончанием. Нет регистратора, который мог бы его приостановить, нет DNS, который можно отравить, нет удостоверяющего центра, которому нужно доверять, и нет входящего порта, который можно атаковать, — адрес и есть открытый ключ, а ваш сервер сам выходит на связь со своими посетителями. Эта часть занимает десять минут. А тщательного подхода требует всё остальное на машине, которая по-прежнему знает, где она находится.

Разместите .onion-сайт на VPS, не выдав расположение сервера
На этой странице
  1. Что onion-сервис убирает из стека
  2. Узел, мост, выходной узел, onion-сервис: четыре разные задачи
  3. Утечки почти никогда не происходят из-за Tor
  4. Сначала решите: расположение сервера — это секрет?
  5. Пошаговая инструкция
  6. Один и тот же сайт в клирнете и в виде onion
  7. Клиентская авторизация: когда адрес — это учётные данные
  8. Как не дать сервису упасть: DoS, часы и аптайм
  9. Честные пределы
  10. Часто задаваемые вопросы

Каждый сайт, который вы когда-либо создавали, держится на целом стеке чужих разрешений. Реестр сдаёт вам имя в аренду. Регистратор может его отключить. Удостоверяющий центр ручается за вас. Резолвер обязан отвечать честно, а порт должен быть открыт на публичном адресе, где его может найти, снять отпечаток и атаковать кто угодно. Каждая из этих сторон — это тот, на кого можно надавить, и поверхность, которую можно атаковать.

Onion-сервис убирает их все. Регистратора нет, потому что адрес выводится из сгенерированного вами ключа. DNS нет, потому что имя никто не резолвит. Удостоверяющего центра нет, потому что адрес и есть открытый ключ, и соединение само себя аутентифицирует по этому ключу. А входящего порта нет вообще — ваш сервер сам выходит на связь со своими посетителями, так что он может сидеть за файрволом, который отбрасывает всё подряд, и всё равно быть доступным из любой точки Земли.

Настройка занимает около десяти минут и три строки конфигурации. Тщательного подхода требует остальная часть машины, потому что веб-сервер за Tor понятия не имеет, что должен быть скрытым, и с готовностью сообщит собственное имя хоста, собственный IP и собственного двойника в клирнете всякому, кто задаст правильный вопрос. Это руководство сначала разбирается с десятью минутами, а затем — с той частью, которая на самом деле решает, сработало это или нет.

Что onion-сервис убирает из стека

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

  • Нет регистратора и нет реестра. Onion-адрес v3 — это base32-кодировка открытого ключа ed25519 плюс контрольная сумма и байт версии — пятьдесят шесть символов, сгенерированных на вашей же машине за долю секунды. Никто вам его не продавал, поэтому никто не может его отобрать, и у него нет даты продления. Это полная противоположность модели риска из нашего руководства по приватной регистрации домена.
  • Нет DNS. Имя .onion не резолвит никто. Клиент запрашивает у сети Tor подписанный дескриптор, опубликованный под этим ключом, так что нет резолвера, которого можно отравить, нет зоны, которая может утечь, и нет сервера имён, который можно вывести из строя.
  • Нет удостоверяющего центра. Адрес — это и есть открытый ключ, поэтому клиент проверяет сервис по тому имени, которое сам ввёл. Именно это означает «самоаутентификация»: никакая третья сторона не ручается за подлинность, потому что подлинность и адрес — один и тот же объект.
  • Нет входящего порта. Сервис открывает исходящие цепочки к нескольким точкам представления и ждёт там. Ваш файрвол может отбрасывать каждый входящий пакет, а сайт всё равно будет работать. На публичном адресе никто ничего не слушает, поэтому нечего сканировать, нечего снимать отпечаток и нечем затопить напрямую.

Одно историческое замечание, которое до сих пор вызывает путаницу: старые шестнадцатисимвольные адреса ушли в прошлое. Поддержка onion-сервисов второй версии была убрана из Tor в октябре 2021 года, такие адреса больше нигде не работают, и всё, что вы найдёте с их описанием, безнадёжно устарело. Всё, о чём говорится ниже, — это v3, и других вариантов больше не существует.

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

Узел, мост, выходной узел, onion-сервис: четыре разные задачи

Люди приходят в Tor, чтобы сделать одну из четырёх совершенно разных вещей, и профили риска у них совершенно несопоставимы. Стоит понимать, на что именно вы подписываетесь.

  • Промежуточный узел передаёт зашифрованный трафик между другими узлами. Он несёт чужие данные, но никогда не выходит от их имени в открытый интернет, поэтому не вызывает жалоб.
  • Мост — это непубличная точка входа для тех, кому доступ к Tor заблокирован. Профиль трафика тот же, что и у промежуточного узла, но адрес не публикуется в открытом каталоге.
  • Выходной узел — это точка, где чужой трафик покидает Tor и попадает в обычный интернет уже под вашим IP-адресом. Именно он порождает письма о злоупотреблениях и юридическую переписку, и с ним нужно обращаться осознанно — наше руководство по Tor-узлам раскрывает это как следует.
  • Onion-сервис публикует. Он несёт только собственный трафик, никогда не обращается к клирнету от чьего-либо имени и потому вообще не порождает жалоб на злоупотребления в адрес вашего IP. У него нет выхода, поэтому и выходить неоткуда.

Последний пункт стоит осмыслить отдельно, потому что его регулярно понимают неправильно. С операционной точки зрения запуск onion-сервиса — это самое тихое, что можно сделать в сети Tor. Ваш сервер устанавливает исходящие соединения, которые выглядят как обычный трафик Tor-клиента; он никогда не выступает источником соединения к чужому серверу; а то, чего большинство опасается — что чьё-то чужое поведение отразится на вашем IP — структурно невозможно.

Кроме того, чтобы запустить onion-сервис, вам не нужно держать узел, и эти две роли лучше не смешивать. Узлу нужны полоса пропускания, публичный ORPort и опубликованный ContactInfo. Сервису не нужно ничего из этого. Если хотите заниматься и тем, и другим, разнесите это по двум серверам.

Утечки почти никогда не происходят из-за Tor

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

Вот каналы утечки, примерно в том порядке, в каком на них попадаются чаще всего:

  • Тот же контент на публичном IP. Если ваш веб-сервер вдобавок слушает на 0.0.0.0, любой, кто сканирует интернет, увидит идентичную страницу и по IP-адресу, и по onion-адресу. Сканеры, индексирующие весь интернет, непрерывно опрашивают каждый открытый порт, и их результаты можно искать по хешу тела страницы и по хешу favicon. Один запрос — и оба адреса связаны. Это самый распространённый способ демаскировки onion-сервиса, и это ошибка в одну строчку конфигурации.
  • Баннеры сервера и страницы по умолчанию. Стандартная установка nginx или apache2 отвечает на неизвестные имена хостов страницей по умолчанию, печатает свою версию в заголовке Server и нередко раскрывает настоящее имя хоста машины в выводе ошибок. Каждая из этих деталей — зацепка для сопоставления.
  • Абсолютные URL. Редиректы, canonical-теги, карты сайта, RSS-ленты, теги Open Graph и письма для сброса пароля — все они обожают выдавать полный клирнет-URL. Достаточно, чтобы один из них оказался внутри onion-версии страницы.
  • Исходящие запросы, которые делает приложение. Аналитика, веб-шрифты, ресурсы CDN, сервисы аватаров, картографические тайлы, вебхуки и проверки обновлений — всё это исходит с настоящего IP сервера, и часть из них сообщает третьей стороне, какая именно страница отображалась в этот момент. У самостоятельно размещённого сайта, подключающего шрифт с чужого домена, появляется аудиторский след, которого он не планировал оставлять.
  • Почта. Всё, что отправляет машина, впечатывает её настоящий IP в заголовки Received. Если сервису нужно отправлять почту, это архитектурная проблема, которую нужно решать осознанно — начните с нашего руководства по почтовому серверу, а по умолчанию исходите из того, что сервис не должен отправлять вообще ничего.
  • Повторно используемые ключи и отпечатки. Один и тот же SSH host key, отвечающий и на публичном IP, и на onion-адресе, связывает их навсегда. То же самое делают одинаковый TLS-сертификат, одинаковый favicon, одинаковый идентификатор аналитики или одна и та же характерная страница ошибки в двух разных проектах.
  • Certificate Transparency. Если та же машина хоть раз обслужит клирнет-домен по HTTPS, сертификат для этого домена навсегда попадёт в публичные, доступные только для добавления журналы. Это называет машину, а не onion-адрес, — но она называет машину.

Общая форма у всех этих утечек одна и та же: Tor скрыл адрес, а что-то ещё на сервере его опубликовало. Шаг восемь ниже — это чек-лист для того, чтобы найти их раньше, чем это сделает кто-то другой.

Сначала решите: расположение сервера — это секрет?

Прежде чем что-либо устанавливать, ответьте на один вопрос, потому что от него зависит всё остальное: физическое расположение этого сервера — это секрет, который вы пытаетесь сохранить?

Есть три честных ответа, и они ведут к совершенно разным конфигурациям.

  • Да, расположение — это и есть смысл. Тогда эта машина делает ровно одну работу. Никакого клирнет-сайта, никакой публичной DNS-записи, указывающей на её IP, никакой почты, никакого другого сервиса, слушающего хоть что-нибудь. Оплачивайте её так, чтобы не привязать своё имя — наш разбор оплаты через Monero раскрывает механику, а аккаунты без KYC означают, что передавать нечего, кроме адреса доставки. Сохраняйте полную трёххоповую конфигурацию. Все ускорения ниже, что меняют анонимность на скорость, для вас закрыты, и это нормально, потому что вы оптимизируете не под скорость.
  • Нет, сервер и так публичен. Вы держите обычный сайт и хотите вдобавок onion-адрес — для читателей за цензурой, для тех, кто предпочёл бы не резолвить ваш домен, или просто потому, что хотите его предложить. Скрывать нечего, так что можно использовать однохоповый onion-сервис, сократив цепочку с шести хопов до трёх, и анонсировать адрес с клирнет-сайта через заголовок Onion-Location. Это функция доступности, и это совершенно законная причина оказаться здесь.
  • Что-то среднее. Именно здесь на самом деле находится большинство, и это опасный вариант, потому что «отчасти скрытый» — это не то свойство, которое может быть у сервера. Выберите сторону. Если расположение действительно имеет значение, стройте так, будто оно имеет значение. Если нет — перестаньте платить задержкой за свойство анонимности, которое вы всё равно не поддерживаете.

Запишите ответ, прежде чем продолжить. Почти каждая ошибка в теме этого руководства происходит от того, что систему строят под первый случай, а эксплуатируют так, будто это второй.

Пошаговая инструкция

  1. Выберите сервер и решите, что ещё будет на нём жить

    Onion-сервис дёшев в эксплуатации. Сам Tor использует очень мало CPU, пока не занимается ретрансляцией, а нагрузка — это ровно то, во что и так обошёлся бы ваш сайт, так что подбирайте размер под приложение, а не под Tor. Статичному сайту или небольшому самостоятельно развёрнутому приложению вполне комфортно на 1 vCPU и 2 ГБ; дайте 2 vCPU и 4 ГБ, если задействованы база данных или языковой рантайм. В нашей линейке это тариф Cub (1 vCPU, 2 ГБ RAM, 40 ГБ) за $5/мес или Scout (2 vCPU, 4 ГБ RAM, 70 ГБ) за $9/мес — оба на полностью NVMe с безлимитным трафиком на скорости 1 Гбит/с.

    Важное решение — не тариф. Важно то решение, о котором говорилось в разделе выше: если расположение этой машины должно оставаться приватным, она делает одну работу и только одну. Никакого другого сайта на ней, никакой DNS-записи где бы то ни было, указывающей на её адрес, никакой почты, ничего другого, что бы слушало порты. Соблазн добавить «ещё одну мелочь» на машину, за которую вы и так уже платите, — это ровно то, из-за чего и происходит сопоставление.

    Оплачивайте её соответствующим образом. Здешним аккаунтам нужен только адрес электронной почты для доставки — и больше ничего, а оплата на кассе проходит в блокчейне — разбор оплаты через Monero и покупка без карты раскрывают это с нуля. Начните с минимального образа Debian или Ubuntu; каждая команда ниже предполагает Debian 12 или новее, выполняемую от root.

  2. Установите Tor из репозитория Tor Project

    Используйте собственный репозиторий Tor Project, а не пакет из дистрибутива. Сборка в дистрибутиве отстаёт по версии, а две настройки из этого руководства — ограничитель частоты запросов на точках представления и защита через proof-of-work — есть только в свежих релизах.

    apt update && apt install -y apt-transport-https curl gpg lsb-release
    
    curl -s https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc \
      | gpg --dearmor | tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/null
    
    echo "deb [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] \
    https://deb.torproject.org/torproject.org $(lsb_release -cs) main" \
      > /etc/apt/sources.list.d/tor.list
    
    apt update && apt install -y tor deb.torproject.org-keyring
    tor --version

    Пакет deb.torproject.org-keyring держит подписывающий ключ актуальным, так что это разовая работа, а не то, что сломается через год. Всё начиная с версии 0.4.8 и выше поддерживает все опции, используемые ниже.

    Пока ничего не настраивайте. На этом этапе Tor работает как клиент, а это всё, что нужно для проверки на следующем шаге.

  3. Разместите веб-сервер на loopback — и больше нигде

    Это шаг, который чаще всего пропускают и который чаще всего портит весь результат. Веб-сервер должен быть доступен с самой машины — и больше ниоткуда. Установите nginx, затем опишите виртуальный хост, который слушает только loopback:

    # /etc/nginx/sites-available/onion
    server {
        listen 127.0.0.1:8080;
        server_name _;
        server_tokens off;
        root /var/www/onion;
        index index.html;
        access_log off;
    }

    server_tokens off убирает версию из заголовка Server и со страниц ошибок. Отключение лога доступа — это осознанный выбор, а не лень: каждый запрос через Tor приходит с 127.0.0.1, так что лог не фиксирует о посетителях ничего полезного, зато фиксирует немало такого, что лучше не хранить.

    Затем добавьте catch-all, который отвечает на публичном адресе и вообще ничего не сообщает. Код 444 в nginx закрывает соединение без ответа — это самый тихий из возможных ответов сканеру:

    # /etc/nginx/sites-available/deny-direct
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        return 444;
    }

    Включите оба конфига, удалите стандартный сайт по умолчанию и проверьте, что на самом деле слушает порты:

    rm -f /etc/nginx/sites-enabled/default
    ln -s /etc/nginx/sites-available/onion /etc/nginx/sites-enabled/
    ln -s /etc/nginx/sites-available/deny-direct /etc/nginx/sites-enabled/
    mkdir -p /var/www/onion && echo 'it works' > /var/www/onion/index.html
    nginx -t && systemctl reload nginx
    ss -ltnp

    Внимательно прочитайте вывод ss. Единственная запись, привязанная к 0.0.0.0 или ::, должна быть той, что вы сознательно оставили — SSH, а также catch-all с 444, если вы решили его использовать. Всё остальное должно быть на 127.0.0.1. Если размещаемое приложение поставляется с собственным слушателем, проверьте и его; немало фреймворков по умолчанию слушают все интерфейсы и никак об этом не сообщают.

  4. Объявите onion-сервис в torrc

    Сервис создают три строки. Добавьте их в /etc/tor/torrc вместе с двумя защитами, которые куда проще включить сейчас, чем во время инцидента:

    # /etc/tor/torrc
    HiddenServiceDir /var/lib/tor/onion-site/
    HiddenServicePort 80 127.0.0.1:8080
    
    # rate-limit floods at the introduction points
    HiddenServiceEnableIntroDoSDefense 1
    
    # make each connection attempt cost the client a little work
    HiddenServicePoWDefensesEnabled 1

    Внимательно прочитайте строку с портом, потому что эти два числа выполняют разные задачи. Первое — это порт, который посетители будут использовать в onion-URL — оставьте его равным 80, чтобы никому не пришлось вводить номер порта. Второе — это то, куда Tor перенаправляет запрос локально, то есть loopback-слушатель из предыдущего шага. Совпадать они не обязаны, и зачастую понятнее, когда они как раз не совпадают.

    Если вы хотите убрать даже loopback-сокет TCP, Tor может вместо этого общаться через unix-сокет, а значит, порт не будет слушать вообще ничего. Направьте сервис на сокет и настройте nginx слушать его:

    HiddenServicePort 80 unix:/run/onion-site.sock

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

  5. Запустите Tor и прочитайте свой адрес

    Перезапустите Tor, дождитесь, пока он поднимется, и заберите свой адрес:

    systemctl restart tor@default
    journalctl -u tor@default -n 20 --no-pager
    cat /var/lib/tor/onion-site/hostname

    В этом файле — пятьдесят шесть символов base32, за которыми следует .onion, и это ваш адрес — он живой с того момента, когда Tor запишет в лог, что опубликовал свой дескриптор, обычно в течение минуты. Здесь нечего регистрировать, нечему распространяться и нечего ждать.

    Посмотрите, что ещё создал Tor, потому что два из этих файлов важнее всего остального на машине:

    ls -l /var/lib/tor/onion-site/

    Вы должны увидеть hostname, hs_ed25519_public_key и hs_ed25519_secret_key в каталоге, принадлежащем debian-tor, с правами 0700. Секретный ключ — это не учётные данные для адреса; он и есть адрес. Скопируйте его на другую машину — и эта машина станет вашим сервисом. Удалите его без резервной копии — и адрес уже никто и никогда не сможет воссоздать, включая вас самих. Шаг девять разбирается с этим как следует — не пропускайте его.

    Если файл hostname не появился, ответ почти всегда в логе: каталог, которым Tor не может владеть, режим доступа, который он отказывается принять, или опечатка в строке с портом.

  6. Откройте сервис и докажите, что это ваша машина

    Очевидный тест — открыть адрес в Tor Browser, и это стоит сделать. Полезный тест — из командной строки, где видны заголовки:

    apt install -y torsocks
    torsocks curl -sI http://<your-address>.onion/
    torsocks curl -s  http://<your-address>.onion/ | head

    Докажите, что это действительно ваш сервер. Адрес, который вы набираете вручную, — это пятьдесят шесть символов base32, и один переставленный символ может привести на чужой сервис. Запишите на сервере случайный токен, затем заберите этот же путь через Tor и сравните:

    head -c 16 /dev/urandom | base32 | tr -d '=' > /var/www/onion/token.txt
    cat /var/www/onion/token.txt
    torsocks curl -s http://<your-address>.onion/token.txt

    Две одинаковые строки означают, что вы достучались до собственной машины. После этого удалите файл.

    Понимайте, что этот тест показывает, а что нет. Запуск с самого сервера доказывает, что сервис опубликован и доступен, а это именно то, что вы хотели узнать. Он ничего не доказывает про анонимность, поскольку оба конца — это одна и та же машина. Для этого тестируйте из совершенно другой сети — а если в вашем регионе заблокирован сам Tor, ответом будет мост, и это раскрывает наше руководство по обходу блокировок DPI.

  7. Закройте порты, которые сервису не нужны

    Теперь можно собрать награду. Onion-сервису не нужно ни одного входящего порта, так что файрвол может быть максимально прямолинейным: отбрасывайте всё входящее, разрешайте установленные соединения и всё, что нужно для администрирования машины. В нашем руководстве по защите Debian есть полный набор правил nftables; примените его, а затем убедитесь, что единственное оставшееся входящее исключение — это SSH.

    А затем подумайте, не убрать ли и это исключение. SSH — последний публичный порт на в остальном невидимой машине, и это вовсе не обязательно. Дайте ему собственный onion-адрес:

    # /etc/tor/torrc
    HiddenServiceDir /var/lib/tor/onion-ssh/
    HiddenServicePort 22 127.0.0.1:22

    Перезапустите Tor, прочитайте новый hostname и подключайтесь через локальный SOCKS-порт Tor. Это добавляется в ~/.ssh/config на вашем ноутбуке:

    Host onionbox
        HostName <ssh-address>.onion
        User root
        ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %p

    Как только это заработает, задайте ListenAddress 127.0.0.1 в sshd_config и уберите входящее правило. Теперь на машине вообще ничего не слушает на публичном адресе.

    Две предосторожности. Тщательно протестируйте onion-маршрут, прежде чем закрывать за собой дверь, и держите под рукой доступ к консоли от провайдера, чтобы ошибка стоила перезагрузки, а не самого сервера — у нас это делается через панель управления. И ни в коем случае не допускайте, чтобы один и тот же SSH host key отвечал и на публичном IP, и на onion-адресе, потому что отпечаток в обоих местах будет идентичен — а это именно та связь, которую вы пытаетесь не создавать.

  8. Найдите утечки, прежде чем публиковать адрес

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

    Ничего неожиданного не слушает порты. Каждая строка должна быть loopback либо портом, который вы сознательно решили оставить открытым:

    ss -ltnp

    Публичный IP не отдаёт ничего. Спросите его напрямую, обоими протоколами, откуда-то ещё. Вам нужны пустые ответы или отказы в соединении; ваш контент — это то, чего быть не должно:

    curl -sI --max-time 5 http://203.0.113.10/
    curl -skI --max-time 5 https://203.0.113.10/

    Внутри того, что вы отдаёте, нет ни одного клирнет-URL. Заберите страницу через Tor и перечислите в ней все абсолютные ссылки. Всё, что указывает на контролируемый вами домен, CDN, хостинг шрифтов или эндпоинт аналитики, — это утечка или зацепка для сопоставления:

    torsocks curl -s http://<your-address>.onion/ \
      | grep -Eo 'https?://[^ "]+' | sort -u

    Заголовки и страницы ошибок ничего не сообщают. Проверьте настоящую страницу и заведомо несуществующую, и поищите строки версий, имена хостов, пути к файлам и трассировки стека:

    torsocks curl -sI http://<your-address>.onion/
    torsocks curl -s  http://<your-address>.onion/nothing-here | head -20

    Приложение не звонит домой. Этот пункт — не команда, а сверка по списку. Отключите аналитику. Разместите шрифты, иконки и скрипты самостоятельно. Отключите загрузку аватаров и превью. Уберите проверки обновлений, которые обращаются наружу по расписанию. Направьте любую настройку с абсолютным URL — адрес сайта, канонический хост, домен отправителя почты — на onion-адрес, а не на клирнет-адрес.

    Уборка по мелочам. Переведите машину на UTC командой timedatectl set-timezone UTC, чтобы временные метки ничего не выдавали о том, где можете находиться она или вы. Убедитесь, что /server-status, /.git, резервные копии и файлы автосохранения редактора недоступны. А если эта же машина обслуживает ещё и клирнет-сайт, вернитесь и перечитайте третий раздел ещё раз, потому что чек-лист выше не спасёт систему, для которой так и не решили, какова её позиция.

  9. Сделайте резервную копию ключа, потому что ключ и есть адрес

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

    Остановите Tor, чтобы файлы были в согласованном состоянии, заархивируйте весь каталог сервиса и зашифруйте его, прежде чем он покинет машину:

    systemctl stop tor@default
    tar -C /var/lib/tor -czf - onion-site \
      | gpg -c --cipher-algo AES256 -o onion-site-$(date +%F).tar.gz.gpg
    systemctl start tor@default

    Перенесите зашифрованный архив куда-нибудь за пределы этого сервера — весь смысл в том, чтобы он пережил саму машину. Наше руководство по зашифрованным бэкапам рассказывает, как делать это по расписанию, отправляя копии в хранилище с доступом только на добавление в другой стране, — это подходящее место для такого архива.

    Восстановление — это то же самое в обратном порядке, и права доступа здесь не опциональны: Tor откажется запускаться, если режим неверный, что раздражает в моменте, но это ровно то поведение, которое вам нужно.

    gpg -d onion-site-2026-09-14.tar.gz.gpg | tar -C /var/lib/tor -xzf -
    chown -R debian-tor:debian-tor /var/lib/tor/onion-site
    chmod 700 /var/lib/tor/onion-site
    chmod 600 /var/lib/tor/onion-site/hs_ed25519_secret_key
    systemctl restart tor@default
    cat /var/lib/tor/onion-site/hostname

    Последняя строка — это и есть проверка. Тот же адрес на другой машине означает, что резервная копия настоящая. Прогоните это один раз прямо сейчас, на одноразовом сервере — непроверенная резервная копия незаменимого ключа — это история про ключ, который у вас когда-то был. Здесь действует та же дисциплина, что и в нашем руководстве по миграции: вы на самом деле платите именно за восстановление.

  10. Опубликуйте адрес так, чтобы ему можно было доверять

    Теперь у вас есть пятьдесят шесть символов, которые никто не может прочитать, запомнить или сверить на глаз. Это реальная проблема удобства использования, и она же — проблема безопасности, потому что посетитель не отличит ваш адрес от почти идентичной подделки. Распространение адреса — часть проекта, а не что-то, о чём думают в последнюю очередь.

    Публикуйте адрес там, где читатель уже вам доверяет. Если у вас есть клирнет-сайт, разместите адрес в подвале и отдавайте заголовок Onion-Location, как описано в разделе ниже. В противном случае используйте любой канал, который ваша аудитория уже связывает с вами — существующий аккаунт, подписанное сообщение, напечатанную карточку. Адрес наследует ровно столько доверия, сколько есть у места, где вы его опубликовали.

    Подпишите его, если ставки того стоят. Подпись под адресом, которую можно проверить по ключу, уже имеющемуся у людей, — единственный способ убедиться, что адрес правильный, не полагаясь на доверие к каналу, по которому он пришёл.

    Не полагайтесь на каталоги или поисковые системы. Onion-индексы существуют, они неполны, и у нескольких из них есть история публикации фишинговых копий популярных адресов рядом с настоящими. Быть находимым там — это бонус, а не план распространения.

    Vanity-префикс немного помогает. Инструмент mkp224o перебирает ключи, пока один из них не даст адрес, начинающийся со строки, которую вы выбрали, — это делает его узнаваемым с первого взгляда:

    apt install -y gcc libc6-dev libsodium-dev make autoconf
    git clone https://github.com/cathugger/mkp224o && cd mkp224o
    ./autogen.sh && ./configure && make
    ./mkp224o -d ./keys -n 1 wolf

    Затраты растут экспоненциально с длиной: несколько символов занимают секунды, семь-восемь требуют реального времени на реальном железе, а что-то длиннее уже практически недостижимо. Будьте честны в том, что это на самом деле даёт — атакующий может перебором получить тот же префикс, а привычка доверять адресу по совпадению первых нескольких символов — это ровно то, из-за чего люди кликают не по той ссылке. Относитесь к этому как к брендингу, а не как к аутентификации. Сгенерированный каталог подключается напрямую как HiddenServiceDir: поправьте владельца и права доступа так же, как на предыдущем шаге, и генерируйте его там, где вы доверяете окружению, потому что тот, кто запускает инструмент, держит в руках ключ.

Один и тот же сайт в клирнете и в виде onion

Если расположение сервера не секрет, держать оба варианта одновременно просто и по-настоящему полезно — именно так поступают крупные новостные организации, Debian и несколько поисковых систем. Нужно понимать два механизма и один компромисс.

Анонсируйте его через Onion-Location. Один-единственный заголовок на клирнет-сайте заставляет Tor Browser показать в адресной строке кнопку «доступна версия .onion» и предложить переключиться. Заголовок учитывается только на страницах, отдаваемых по HTTPS, и значением обязательно должен быть корректный onion-URL:

add_header Onion-Location "http://<your-address>.onion$request_uri" always;

Для хостингов, где заголовки задать нельзя, есть HTML-эквивалент с тем же требованием к HTTPS:

<meta http-equiv="onion-location" content="http://<your-address>.onion">

Также разместите адрес там, где его прочитает человек, — в подвале сайта или на странице «о нас». Заголовок достигает только тех, кто уже пользуется Tor Browser; подвал сайта достигает всех остальных.

Рассмотрите однохоповый onion-сервис. Обычное onion-соединение — это шесть хопов — три от клиента и три от сервиса — и три хопа сервиса существуют исключительно для того, чтобы скрыть, где он находится. Если это не секрет, их можно убрать. Улучшение задержки заметно сразу и очень существенно. Конфигурация намеренно прямолинейна:

# /etc/tor/torrc — these are INSTANCE-WIDE, not per service
HiddenServiceNonAnonymousMode 1
HiddenServiceSingleHopMode 1
SOCKSPort 0

Обе опции обязательны только вместе, SOCKS-порт должен быть отключён, и они применяются ко всем onion-сервисам на этом инстансе Tor — отдельного отказа для конкретного сервиса не предусмотрено. Tor откажется запускаться, если вы зададите одну опцию без другой, — и в этом программа делает вам одолжение. Если один инстанс обслуживает один сервис с публичным расположением и другой — со скрытым, запустите два инстанса, а лучше — два сервера.

И примите компромисс. Публикация обоих адресов сама по себе заявляет, что за ними стоит один и тот же оператор, а отдача идентичного контента с обоих делает их тривиально связываемыми в любом случае. Такова сделка, и для публичного сайта она ничего не стоит. Но гигиену всё равно соблюдайте: никаких абсолютных клирнет-URL внутри onion-версии, куки, привязанные к хосту, чтобы сессия не перетекала между версиями, и политика безопасности контента, которая не подтягивает ресурсы с чужой стороны.

Клиентская авторизация: когда адрес — это учётные данные

По умолчанию сервис доступен всем, кто знает ваш адрес. Клиентская авторизация меняет это на сетевом уровне, а не на уровне приложения, и разница важнее, чем может показаться.

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

Сгенерируйте пару ключей x25519 для каждого клиента. Все нужные инструменты уже есть на любой машине с Debian:

openssl genpkey -algorithm x25519 -out alice.prv.pem

# private key — goes to the client, never to the server
grep -v 'PRIVATE KEY' alice.prv.pem | base64 -d | tail -c 32 | base32 | tr -d '='

# public key — goes on the server
openssl pkey -in alice.prv.pem -pubout | grep -v 'PUBLIC KEY' \
  | base64 -d | tail -c 32 | base32 | tr -d '='

На сервере поместите публичный ключ в каталог authorized_clients внутри каталога сервиса. Имя файла произвольное, лишь бы оно заканчивалось на .auth — тогда отзыв доступа сводится к удалению одного файла:

mkdir -p /var/lib/tor/onion-site/authorized_clients
echo "descriptor:x25519:<ALICE-PUBLIC-KEY>" \
  > /var/lib/tor/onion-site/authorized_clients/alice.auth
chown -R debian-tor:debian-tor /var/lib/tor/onion-site
systemctl reload tor@default

На клиенте приватный ключ помещается в каталог, заданный ClientOnionAuthDir, в файл с окончанием .auth_private, где также повторяется адрес. У Tor Browser для этого есть собственный каталог в папке данных, и он сам предложит ввести ключ, если наткнётся на сервис, которому он нужен:

# /var/lib/tor/onion-auth/mysite.auth_private
<address-without-the-.onion>:descriptor:x25519:<ALICE-PRIVATE-KEY>

Это подходящий инструмент для тестового сайта, админ-панели, приватного хранилища файлов или самостоятельно развёрнутого Nextcloud, которым пользуетесь только вы — всего, где честный ответ на вопрос «кто должен видеть, что это вообще существует?» — «никто, кроме нас». Цена реальна и она административная: ключи нужно передавать людям по каналу, которому вы доверяете, и не забывать отзывать их потом.

Как не дать сервису упасть: DoS, часы и аптайм

Onion-сервисы отказывают по-своему, и ни один из этих отказов не похож на обычный простой. Есть четыре вещи, которые стоит настроить заранее, до того как они понадобятся.

Настоящая эксплуатационная проблема — это отказ в обслуживании (DoS). Поскольку фильтровать по IP-адресу нечего, обычные средства защиты не работают, а отправить целенаправленный поток запросов на точки представления дёшево. У Tor есть два ответа, оба задаются для каждого сервиса в torrc: HiddenServiceEnableIntroDoSDefense 1 ограничивает частоту запросов на точках представления, а HiddenServicePoWDefensesEnabled 1 заставляет клиентов решать небольшую головоломку на основе proof-of-work, сложность которой растёт под нагрузкой, — так легитимные посетители ждут секунду-другую, а флуд становится дорогим удовольствием. Включайте обе опции сразу; цена, пока вас никто не атакует, ничтожна.

Следите за точностью часов. Дескрипторы публикуются и разыскиваются относительно временных периодов, вычисляемых из общего для сети значения. Сервер с сильно уплывшими часами публикует дескриптор не туда и становится недоступным, при этом в собственных логах выглядя совершенно здоровым. Убедитесь, что запущен клиент NTP, держите машину на UTC и проверяйте часы в первую очередь, если сервис необъяснимо перестал резолвиться.

Мониторинг обязан идти через Tor. Ни один коммерческий сервис проверки аптайма не может опросить адрес .onion, а значит, привычное решение вам недоступно. Проводите проверку сами со второй машины, отличной от той, что хостит сервис — задачи cron с torsocks curl -s --max-time 60 к известному URL и сравнения результата с известной строкой вполне достаточно, и это ничего не стоит.

Если аптайм важен, планируйте больше одного инстанса. OnionBalance позволяет нескольким бэкенд-серверам делить один onion-адрес: фронтенд-инстанс хранит ключ, которому принадлежит адрес, и публикует дескриптор, указывающий на точки представления бэкендов, так что вы получаете распределение нагрузки и отказоустойчивость без изменения адреса. Это больше движущихся частей, чем нужно большинству сайтов, но это официально поддерживаемое решение, и стоит знать о его существовании ещё до того, как вы загоните себя в угол единственной машины.

И последняя эксплуатационная привычка: перезапуск Tor уводит сервис в офлайн на несколько секунд, пока он заново публикует дескриптор, а переустановка, стирающая /var/lib/tor, уводит его в офлайн навсегда. Обращайтесь с этим каталогом так же, как обращались бы с приватным ключом, — потому что это он и есть.

Честные пределы

Onion-адрес убирает регистратора, резолвер, удостоверяющий центр и открытый порт. Больше он не убирает ничего, и именно точность в отношении всего остального отличает полезный инструмент от ложного чувства безопасности.

Он не чинит приложение. Уязвимое веб-приложение за onion-сервисом остаётся уязвимым веб-приложением; первое, что делают многие атакующие, получив исполнение кода, — отправляют исходящий запрос, который раскрывает настоящий адрес сервера. Дайте машине десятиминутный курс из нашего руководства по защите Debian, держите её пропатченной и считайте её открытой наружу, даже если на ней ничего не слушает.

Он не скрывает сервер от тех, кто его администрирует. Мы знаем, что сервер существует, когда он был развёрнут и какой у него IP-адрес, потому что именно мы его выделили. Это верно для любого хостинга, где угодно, и всякий, кто утверждает обратное, вам что-то продаёт. Что мы можем сказать точно — так это что именно мы делаем с этим знанием, и это изложено в нашем честном разборе того, что на самом деле скрывает VPS, оплаченный криптой.

Он сам по себе не остановит терпеливого и хорошо обеспеченного ресурсами противника. Объём и тайминг трафика видны на границах сети, а сервис, который замолкает именно тогда, когда конкретный человек спит, кое-что о себе сообщает. Не поможет это и в том случае, если вас выдаёт сам контент: тот же стиль письма, тот же PGP-ключ, тот же аватар или тот же ник на форуме, что и у публичной личности, замыкает цепочку независимо от того, насколько хорош транспорт.

Что до нас самих — чтобы вам было с чем сверяться: onion-сервисы приветствуются на любом тарифе и не требуют от нас ничего особенного, потому что не открывают портов и не порождают трафика злоупотреблений. Мы держим аккаунты без KYC, для которых нужен только адрес для доставки учётных данных. Обычную переписку по поводу авторских прав мы рассматриваем как операционный вопрос, а не повод для автоматического удаления, мы реагируем на действительные судебные постановления в юрисдикции, где расположен сервер, а жёсткий минимум абсолютен и действует здесь точно так же, как и везде: никакого CSAM, никакого контента, связанного с терроризмом, без исключений. Прочитайте политику допустимого использования и то, как мы обрабатываем жалобы на злоупотребления, прежде чем строить что-то, что вам было бы жаль переносить. Тарифные рекомендации есть на нашей странице о Tor-дружественном VPS.

Часто задаваемые вопросы

Нужно ли доменное имя, чтобы запустить .onion-сайт?

Нет, и в этом почти вся суть. Адрес генерируется из ключа на вашем собственном сервере за долю секунды, так что нет регистратора, у которого его нужно покупать, нет продления, которое можно пропустить, нет записи WHOIS и нет никого, кто мог бы его приостановить. Чем вы жертвуете — так это удобочитаемостью: onion-адрес — это пятьдесят шесть символов, которые никто не запомнит и не наберёт, он открывается только в Tor Browser или в клиенте с поддержкой Tor, а поисковые системы в основном его не индексируют. Многие именно поэтому держат оба варианта — домен ради охвата и onion-адрес ради непрерывности. Наше руководство по приватной регистрации домена раскрывает вторую половину этой пары.

Нужно ли открывать порт или настраивать проброс портов?

Ни то, ни другое. В этом и есть структурное отличие onion-сервиса от обычного хостинга: сервис устанавливает исходящие соединения к точкам представления внутри сети Tor и ждёт клиентов уже там, так что до вашего сервера вообще никогда не доходит ни одно входящее соединение. Файрвол, отбрасывающий каждый входящий пакет, никак на это не влияет. На практике это означает, что можно получить машину, на которой на публичном адресе не слушает вообще ничего — включая SSH, если вы дадите ему собственный onion-адрес, как в шаге семь — а это куда меньшая поверхность атаки, чем может достичь любой обычно захостенный сайт.

Нужен ли сертификат HTTPS для onion-адреса?

Почти наверняка нет. Onion-адрес сам по себе является открытым ключом сервиса, так что соединение уже зашифровано и аутентифицировано сквозным образом относительно имени, которое ввёл посетитель — удостоверяющий центр не может добавить к этому ничего, а Tor Browser считает источники .onion защищённым контекстом, так что функции, требующие HTTPS, работают и без сертификата. Небольшое число удостоверяющих центров выпускают сертификаты для имён .onion, что иногда полезно, если вам нужно показать в адресной строке название организации или вы смешиваете ресурсы onion и клирнета. Для обычного сайта простой HTTP на loopback-слушателе — правильная и нормальная конфигурация.

Почему мой onion-сервис медленный и можно ли его ускорить?

Обычное onion-соединение проходит через шесть узлов, три из которых выбирает клиент, а три — ваш сервис, и именно это время в пути вы в основном и ощущаете. Помогают три вещи. Если расположение вашего сервера не секрет, однохоповый onion-сервис убирает ваши три хопа до нуля собственных хопов и сокращает задержку примерно вдвое — см. раздел о совместном запуске обоих вариантов выше, и учтите, что эта настройка действует на весь инстанс целиком и прямо означает отказ от приватности расположения сервера. Во-вторых, сделайте сам сайт лёгким: никаких внешних ресурсов, никаких шрифтов или скриптов с чужих хостов, агрессивное кэширование, потому что каждый лишний запрос заново оплачивает полную стоимость цепочки. В-третьих, проверьте, что вас не заваливают запросами; включённая опция HiddenServicePoWDefensesEnabled сохраняет сервис работоспособным при злоупотреблении точками представления, которое иначе выглядело бы точь-в-точь как плохая производительность.

Можно ли запустить один и тот же сайт в клирнете и как onion-сервис?

Да, и для публичного проекта это хорошая идея — она даёт читателям за цензурой путь внутрь и не требует от них резолвить ваш домен. Но будьте честны с собой в том, что это такое: отдача идентичного контента с обоих адресов делает их тривиально связываемыми, так что это функция доступности, а не сокрытия. Анонсируйте адрес заголовком Onion-Location на HTTPS-сайте и разместите его в подвале для всех остальных. Если расположение сервера действительно должно оставаться приватным, не делайте этого вовсе; держите onion-сервис на машине, которая не делает больше ничего, на которую не указывает ни одна DNS-запись и которая не отправляет почту.

Что произойдёт, если я потеряю onion-ключ?

Адрес исчезает навсегда и для всех. Процедуры восстановления не существует, потому что не существует и инстанции, к которой можно обратиться — имя математически выводится из ключа в /var/lib/tor/<service>/hs_ed25519_secret_key, и без этих байтов никто и никогда не сможет опубликовать что-либо заново под этим именем. Такова цена отсутствия регистратора, который мог бы его у вас отобрать. Делайте зашифрованную резервную копию каталога за пределами сервера, один раз восстановите её на одноразовой машине, чтобы убедиться, что адрес возвращается, и помните: тот, кто заполучит этот файл, становится вашим сервисом, так что он заслуживает такого же обращения, как любой другой приватный ключ.

Можно ли разместить onion-сервис на VPSCrypto?

Да, на любом тарифе, и это не требует от нас ничего особенного: onion-сервис не открывает входящих портов и не порождает трафика злоупотреблений в адрес вашего IP, что делает его одним из самых тихих вариантов использования сервера. Аккаунты без KYC, для них нужен только адрес для доставки учётных данных, оплата на кассе проходит в блокчейне, причём Monero — в приоритете, а сервер запускается примерно за минуту. Жёсткий минимум по борьбе со злоупотреблениями действует точно так же, как и везде — никакого CSAM, никакого контента, связанного с терроризмом, без исключений — и мы реагируем на действительные судебные постановления в юрисдикции сервера. Тарифные рекомендации — на нашей странице о Tor-дружественном VPS, а остальное — в политике допустимого использования.

Разверните офшорный VPS примерно за минуту

Без KYC, оплата криптовалютой, только NVMe. Выберите тариф, оплатите в Monero или любой крупной монете — root-доступ примерно через 60 секунд.

Fenrir на страже