Сейчас пятница, скоро выходные, есть время для экспериментов.
Если вы когда-нибудь слышали про Tor, то и про onion сайты должны были слышать. Я покажу, как превратить ваш сайт в такой "скрытый" сервис.
Скрытый сервис запускают для двух целей:
- чтобы прикрыть свой зад,
- чтобы дать возможность посетителям прикрыть свой зад.
Первое важно нелегальным маркетплейсам. Это нам неинтересно. Второе полезнее: если мы заботимся об анонимности посетителей, мы можем поднять onion-версию своего сайта. HTTPS это безопасно: буква S именно это и означает. Но не анонимно. Tor позволяет сделать безопасно и анонимно.
Веб-разработчик или сисадмин справится за полчаса: 5 минут вы будете читать этот текст, 15 минут — нажимать клавиши, а последние 10 — раздумывать, нужно ли оно вам.
- Сложность: проще установки OpenVPN или Wireguard,
- Ожидания: у вас под рукой Linux, macOS, FreeBSD или другая Unix-подобная система,
- Результат: адрес .onion с вашим сервисом в сети tor.
Запустим сервис
Давайте договоримся, что сервис у нас уже написан. Сервис торчит каким-то портом. Я буду делать onion адрес для своих блогов. Это HTML-странички, их раздает веб-сервер Caddy. У вас это может быть сайт с рецептами блюд из манго, публичное API с котятами или даже SSH.
Если же сервиса у вас нет, а провести опыт хочется, предлагаю запустить встроенный в Python веб-сервер.
python3 -m http.server 8765
Теперь нас слушают по порту 8765. Откроем браузер по http://127.0.0.1:8765 и увидим содержание директории на диске.
Скрываемся
"Тором" называется не то, о чем большинство думает. Это акроним и означает он "The Onion Router". А всем известный браузер правильно называть "Tor Browser".
Давайте же установим себе именно tor-не-бразуер. Для macOS и Debian-подобных Linux-дистрибутивов используйте менеджер пакетов. Обладатели других систем сами разберутся.
apt install tor # for Debian and Ubuntu
brew install tor # for macOS
Теперь надо написать конфиг. Он обычно хранится в /etc/tor/torrc
. Впишем три строчки:
- указание не поднимать SOCKS-прокси,
- путь с парой публичного и приватного ключа,
- правило, как сопоставить виртуальный порт к порту на 127.0.0.1.
SocksPort 0
HiddenServiceDir /var/lib/tor/change_me_website/
HiddenServicePort 80 127.0.0.1:8765
Если директории HiddenServiceDir
не существует, tor
при запуске сам ее создаст и заполнит сгенерированными ключами и файлом hostname.
Нужно поднять несколько сервисов? Тогда продублируйте последние строчки с новым путем и другими портами.
Пора использовать нашу конфигурацию. Многие системы позволяют запустить tor сервисным менеджером. Не путайте с предыдущим использованием слова "сервис" — здесь подразумевается init процесс на уровне ОС: systemd, launchd или что-то другое.
service tor restart # for Debian and Ubuntu
brew services restart tor # for macOS
Теперь tor
будет работать демоном даже после перезагрузки. Для одноразового запуска сервисным менеджером пользоваться не обязательно:
tor
Открываем только что сгенерированный файл /var/lib/tor/change_me_website/hostname
и видим onion адрес до нашего сервиса. Вводим его в Tor Browser и делимся со всеми. Остальными файлами в директории не делимся.
Бонус: получаем красивый адрес
- Сложность: нужны знания криптографии и навык компилировать код на C.
Как же DuckDuckGo получил duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion?
В спецификации адрес описывается так: base32(PUBKEY | CHECKSUM | VERSION) + ".onion"
. Что это значит?
Мы уже знаем, что у каждого скрытого сервиса есть своя пара из публичного и приватного ключа. Публичный ключ — это 256 бита или 32 байта. Чек-сумма — это 2 байта из хэша. А версия описывается байтом: сейчас актуальна третья, это \x03
. Если все записать подряд и закодировать в base32, получим 57 символов. Припишем туда ".onion" и получим адрес.
(Примечение: Человечество научилось делать безопасные алгоритмы, используя публичные ключи из 256 бит. Удивлены? Рекомендую познакомиться с кривой Curve25519.)
(Примечание: Чек-сумма считается таким образом: H(".onion checksum" | PUBKEY | VERSION)[:2]
.)
(Примечание: Заинтересованный читатель может даже догадаться, какой символ в адресе всегда будет последним.)
Если генерировать много ключей, можно "намайнить" любые символы в начале. Есть готовые реализации таких переборщиков. Можно собрать mkp224o, оставить компьютер перебирать какие-нибудь смешные префиксы и уйти ужинать. Чем длиннее префикс пожелаете, тем дольше придется ужинать.
Для красивого "duckduckgo..." ужинать придется несколько месяцев. А то и годы.
Читаем больше
- Set up Your Onion Service от The Tor Project,
- Best Practices for Hosting Onion Services от Riseup Collective,
- Tor Rendezvous Specification от The Tor Project,
- Onionbalance — tor load-balancing от George Kadianakis,
- Onionshare — share files, host websites, and chat with friends using the Tor network от Micah Lee.
- Awesome Tor — a curated list of awesome software, articles, and other resources related to the Tor project от AJ Bahnken.
И небольшой ликбез про то, как это всё устроено внутри и почему луковая маршрутизация должна работать вместе с HTTPS :)
Для меня всегда было вопросом, где арендовать сервер чтобы не было вопросов к использованию Тора, многие даже прямо прописывают что нельзя.
А из того возраста когда был готов использовать свой домашний комп в качестве сервера я уже вышел😀😀
Эх, времена мелких районных сетей, DC++ и энтузиазма))))