Сейчас пятница, скоро выходные, есть время для экспериментов.

Если вы когда-нибудь слышали про Tor, то и про onion сайты должны были слышать. Я покажу, что запустить такой скрытый сервис веб-разработчик или сисадмин может за полчаса: 5 минут вы будете читать этот текст, 15 минут — нажимать клавиши, а последние 10 — раздумывать, нужно ли оно вам.

  • Сложность: проще установки OpenVPN или Wireguard,
  • Ожидания: у вас под рукой Linux, macOS, FreeBSD или другая Unix-подобная система,
  • Результат: адрес .onion с вашим сервисом в сети tor.

Поговорим о мотивация

Скрытый сервис запускают для двух целей:

  1. авторы прикрывают им свой зад,
  2. авторы дают посетителям возможность прикрыть свой зад.

Первое важно нелегальным маркетплейсам. Это нам неинтересно. Второе полезнее: если мы заботимся об анонимности посетителей, мы можем поднять onion-версию своего сайта. HTTPS это безопасно: буква S именно это и означает. Но не анонимно. Tor позволяет сделать безопасно и анонимно.

Я буду рад, если друзья запустят свои onion сервисы. Поэтому вы это читаете.

Запустим сервис

Давайте договоримся, что сервис у нас уже написан. Сервис торчит каким-то портом. Я буду делать onion адрес для своих блогов. Это HTML-странички, их раздает веб-сервер Caddy. У вас это может быть сайт с рецептами блюд из манго, публичное API с котятами или даже SSH.

Если же сервиса у вас нет, а провести опыт хочется, предлагаю запустить встроенный в Python веб-сервер.

1
python3 -m http.server 8765

Теперь нас слушают по порту 8765. Откроем браузер по http://127.0.0.1:8765 и увидим содержание директории на диске.

Скрываемся

“Тором” называется не то, о чем большинство думает. Это акроним и означает он “The Onion Router”. А всем известный браузер правильно называть “Tor Browser”.

Давайте же установим себе именно tor-не-бразуер. Для macOS и Debian-подобных Linux-дистрибутивов используйте менеджер пакетов. Обладатели других систем сами разберутся.

1
2
apt install tor  # for Debian and Ubuntu
brew install tor  # for macOS

Теперь надо написать конфиг. Он обычно хранится в /etc/tor/torrc. Впишем три строчки:

  • указание не поднимать SOCKS-прокси,
  • путь с парой публичного и приватного ключа,
  • правило, как сопоставить виртуальный порт к порту на 127.0.0.1.
1
2
3
SocksPort 0
HiddenServiceDir /var/lib/tor/change_me_website/
HiddenServicePort 80 127.0.0.1:8765

Если директории HiddenServiceDir не существует, tor при запуске сам ее создаст и заполнит сгенерированными ключами и файлом hostname.

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

Пора использовать нашу конфигурацию. Многие системы позволяют запустить tor сервисным менеджером. Не путайте с предыдущим использованием слова “сервис” — здесь подразумевается init процесс на уровне ОС: systemd, launchd или что-то другое.

1
2
service tor restart  # for Debian and Ubuntu
brew services restart tor  # for macOS

Теперь tor будет работать демоном даже после перезагрузки. Для одноразового запуска сервисным менеджером пользоваться не обязательно:

1
tor

Открываем только что сгенерированный файл /var/lib/tor/change_me_website/hostname и видим onion адрес до нашего сервиса. Вводим его в Tor Browser и делимся со всеми. Остальными файлами в директории не делимся.

Бонус: получаем красивый адрес

  • Сложность: нужны знания криптографии и навык компилировать код на C.

Как же DuckDuckGo получил duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion?

В спецификации адрес описывается так: base32(PUBKEY | CHECKSUM | VERSION) + ".onion". Что это значит?

Мы уже знаем, что у каждого скрытого сервиса есть своя пара из публичного и приватного ключа. Публичный ключ — это 256 бита1 или 32 байта. Чек-сумма — это 2 байта из хэша2. А версия описывается байтом: сейчас актуальна третья, это \x03. Если все записать подряд и закодировать в base32, получим 57 символов3. Припишем туда “.onion” и получим адрес.

Если генерировать много ключей, можно “намайнить” любые символы в начале. Есть готовые реализации таких переборщиков. Можно собрать mkp224o, оставить компьютер перебирать какие-нибудь смешные префиксы и уйти ужинать. Чем длиннее префикс пожелаете, тем дольше придется ужинать.

Для красивого “duckduckgo…” ужинать придется несколько месяцев. А то и годы.

Читаем больше


  1. Человечество научилось делать безопасные алгоритмы, используя публичные ключи из 256 бит. Удивлены? Рекомендую познакомиться с кривой Curve25519↩︎

  2. Чек-сумма считается таким образом: H(".onion checksum" | PUBKEY | VERSION)[:2]↩︎

  3. Заинтересованный читатель может даже догадаться, какой символ будет последним. ↩︎