Содержание статьи
Создатели сети ZeroNet придумали, как сделать децентрализованную систему размещения сайтов на основе технологий BitTorrent и Bitcoin. ZeroNet был показан публике совсем недавно (в 2015 году), но там уже можно найти кое-что интересное. Создать сайт своими руками тоже очень несложно.
Децентрализованный веб, сайты в котором невозможно выключить, а доступ к информации нельзя запретить никакими методами, — давняя мечта любого айтишника. Однако только в последнее время мы начали замечать хоть какое-то движение на пути к реализации этой идеи. Появились проекты MaidSafe, Maelstrom и IPFS, а не так давно к ним присоединился проект ZeroNet, который отличается крайним дружелюбием к обычному пользователю и богатым набором функций.
О чем это все
Во время американских выборов 2010 и 2012 годов Facebook провел интересный эксперимент над несколькими миллионами пользователей, суть которого заключалась в том, чтобы добавить в ленту новостей юзера специальное уведомление — оно сообщало, что его друг уже проголосовал на выборах в парламент или выборах президента. В результате простая и, казалось бы, совсем безобидная функция подняла явку на 340 тысяч человек и показала, что при желании такие мастодонты, как Facebook и Google, могут легко повлиять на значимые для целой страны события.
Очевидно, что ни одно правительство ни одной страны мира не захочет, чтобы им управляли Марк Цукерберг и Ларри Пейдж. Но если в США с таким влиянием принято бороться через сотрудничество, то, например, Китай и Россия предпочитают полностью отрезать себя от нежелательного контента и сервисов с помощью всевозможных блокировок и запретов.
Добавь в эту историю разного рода Михалковых и других держателей прав, и ты получишь довольно печальную картину интернета будущего, в который, может быть, и не придется «ходить по паспортам», но без VPN или Tor уже будет не обойтись. И все бы ничего, да вот только отключение от русского сегмента способны выдержать лишь большие ресурсы с большим количеством технически грамотных юзеров (это я про rutracker.org), тогда как более мелкие веб-сайты вынуждены будут закрыться.
Решение проблемы
Обеспечить бесперебойную работу веб-сайта и сделать его неуязвимым к любым блокировкам можно только одним путем — создать множество копий сайта и каким-то образом организовать автоматический поиск работающей копии при его открытии. Это называется децентрализацией, а ярчайший пример такой технологии — это пиринговые сети, в частности всем известный BitTorrent.
В сети BitTorrent каждый потребитель контента одновременно выступает и его провайдером, что позволяет распределить данные (в большинстве случаев фильмы и музыку) по множеству узлов и обеспечить автоматический поиск этих данных даже без использования трекера. Это проверенная временем технология, которая прекрасно работает и вполне годится для публикации полноценных веб-сайтов.
Один из примеров ее использования для веба — это система IPFS, о которой мы уже писали. IPFS — нечто вроде большой распределенной файловой системы, основанной на идеях P2P. Каждый подключившийся к сети узел становится хранителем части ее данных, а в файловой системе можно размещать как обычные файлы, так и целые веб-сайты. Каждый веб-сайт адресуется с помощью хеша его главной страницы, а поиск ближайшего узла, хранящего главную страницу, происходит автоматически без использования центрального сервера. Это замечательная, а главное — универсальная технология. Но у нее есть несколько проблем:
- нет поддержки SQL и server-side-скриптов;
- все файлы адресуются с помощью хешей, которые изменяются после обновления файла, в результате поддерживать веб-сайт, состоящий из сотен и тысяч файлов, проблематично;
- после обновления сайта хеш его главной страницы изменится, а ты об этом даже не узнаешь (технология IPNS, решающая данную проблему, все еще находится в разработке);
- простая установка, но неудобное использование: сам ищи сайты, сам указывай, какие сайты ты хочешь дублировать у себя, сам их обновляй.
ZeroNet лишен всех этих проблем, а пользоваться им сможет даже твоя мама. Все, что нужно сделать, — это просто скачать архив с официального сайта, распаковать его и запустить файл ZeroNet.cmd (Windows), ZeroNet.app (OS X) или ZeroNet.sh (Linux). После этого в браузере откроется новая вкладка с панелью управления ZeroNet. С ее помощью можно перейти на официальный форум, чат, открыть почтовый клиент и другие местные сайты. Каждый посещенный сайт попадает в кеш и будет автоматически обновляться по мере его обновления автором, а ты сам станешь участником раздачи. Даже если ты находишься за роутером, ZeroNet откроет нужный порт с помощью UPnP.
На момент написания статьи в ZeroNet существовали сотни сайтов (775 в базе местного поисковика). Из наиболее интересных можно отметить:
- ZeroTalk — официальный форум;
- ZeroBlog — блоговая платформа, аналог Blogger;
- ZeroMail — почтовый клиент;
- PLAY — нецензурируемый торрент-трекер;
- RU-ZER0TALK — русскоязычный форум;
- Kaffiene — поисковик, но ищет только по названиям веб-сайтов;
- Flappy Bird — та самая игра, с таблицей рекордов;
- Nullfolder — файлообменник.
По адресам ссылок ты можешь заметить, что они все ведут на локальный хост. Это не ошибка, а особенность сети. Поскольку ZeroNet работает по принципу файлообменных сетей, то перед тем, как открыть веб-сайт, клиент ZeroNet сначала находит ближайшего пира (peer), у которого есть свежая версия сайта, скачивает его на диск (естественно, не весь, сначала только главную страницу и ресурсы: JS, CSS и так далее), а затем отдает браузеру в режиме прокси. Таким образом, для твоего браузера все сайты ZeroNet локальные. А это значит, что ты можешь открывать их, даже если у тебя нет интернета, а также автоматически получаешь защиту от шпионских скриптов, встроенных в сайт. Кстати, защита от снифинга трафика тут тоже есть, данные между участниками сети передаются зашифрованными с помощью TLS.
INFO
Для получения доступа к сайтам ZeroNet не обязательно устанавливать клиент, войти в сеть можно через один из открытых шлюзов. Например, ZeroPro.
Также ты можешь заметить, что некоторые сайты имеют вполне осмысленные имена вроде Blog.ZeroNetwork.bit, тогда как имена других — это просто набор символов. На самом деле все веб-сайты в ZeroNet адресуются с помощью открытого ключа, сгенерированного с помощью алгоритма BIP32, который также используется для защиты кошелька в Bitcoin. Набор символов в ссылке — это и есть ключ, и он позволяет любому клиенту ZeroNet удостовериться, что веб-сайт не был скомпрометирован и действительно создан или обновлен его создателем. Без такой защиты любой участник сети мог бы легко подделать запрашиваемый другим участником веб-сайт.
Разумеется, использовать открытые ключи для доступа к сайтам не очень удобно, поэтому в ZeroNet есть возможность привязки сайтов к доменам, созданным с помощью распределенной системы доменных имен Namecoin. Она хороша тем, что у нее нет единой точки отказа, а информация о домене может быть изменена только его текущим владельцем. Тот же Роскомнадзор не сможет заблокировать такой домен, так как ни у него, ни у операторов связи просто не будет способа изменить информацию в базе Namecoin.
В ZeroNet можно ходить через Tor. Причем в версии для Windows Tor уже включен в архив, поэтому все, что нужно сделать, — просто открыть панель управления ZeroNet и активировать опцию Tor -> Enable Tor for every connection. В Linux и других *nix-системах необходимо предварительно установить Tor из репозитория, а затем открыть доступ на управление его настройками сторонним приложениям, добавив строки ControlPort 9051
и CookieAuthentication 1
в файл /etc/tor/torrc
и перезапустив Tor:
sudo service tor reload # Debian/Ubuntu
sudo systemctl reload tor # Fedora/ArchLinux
Также в Debian/Ubuntu следует добавить себя в группу debian-tor и перелогиниться:
sudo usermod -a -G debian-tor ЮЗЕР
В ArchLinux необходимо выставить корректные права на конфиги Tor.
sudo chmod 770 /var/lib/tor
sudo chmod 660 /var/lib/tor/control_auth_cookie
Кстати, ZeroNet вполне можно запустить в Docker (здесь /tmp — каталог для хранения конфигов в хост-системе):
sudo docker run -d -v /tmp:/root/data -p 15441:15441 -p 43110:43110 nofish/zeronet
Поднимаем сайт
О’кей, все просто, секьюрно, нецензурируемо и вообще круто. Но так ли легко поднять веб-сайт в ZeroNet и с какими подводными камнями можно столкнуться? Все это несложно проверить: система предлагает довольно простой и быстрый способ создания и запуска веб-сайта.
Для начала остановим ZeroNet, просто убив процесс с помощью комбинации Ctrl + C. Далее создадим новый веб-сайт (здесь и далее команды приведены для Linux):
ZeroNet.sh siteCreate
Команда сгенерирует для нас два ключа: приватный и публичный, попросит сохранить первый ключ в укромное место и никому его не показывать. Далее следует ввести yes, и скрипт создаст для нас шаблон нового сайта, который будет располагаться в каталоге ZeroNet/data/публичный_ключ.
Теперь можно перейти в указанный каталог и разместить в нем все необходимые для работы сайта файлы (HTML, JS, CSS). Бэкенд в ZeroNet разместить невозможно, а если он все-таки нужен, то придется либо довольствоваться встроенной в ZeroNet базой данных SQL (которая не очень быстра), либо держать бэкенд в «обычном интернете», что убивает всю прелесть ZeroNet, так как у ресурса появляется точка отказа. Когда все файлы лежат на месте, сайт можно публиковать:
ZeroNet.sh siteSign публичный_ключ
ZeroNet.sh sitePublish публичный_ключ
Первая команда спросит твой приватный ключ и обновит файл content.json
внутри каталога с сайтом (содержит информацию о веб-сайте, цифровую подпись и контрольные суммы файлов). Вторая команда автоматически уведомит всех, у кого уже есть копия твоего сайта, так что он будет автоматически обновлен на всех узлах.
В принципе, это все, что нужно знать, чтобы выложить client-only-сайт в ZeroNet. Однако если ты хочешь создать что-то серьезное, стоит прочитать два поста в официальном блоге: ZeroNet site development tutorial #1 и ZeroNet site development tutorial #2. На примере простого чата разработчики поясняют, как использовать ZeroFrame API. Он позволяет создавать динамические многопользовательские сайты, способные работать с локальным хранилищем файлов и базой данных.
ZeroMail
ZeroMail — это официальное почтовое веб-приложение ZeroNet и один из наиболее удачных примеров использования ZeroNet. В отличие от традиционных почтовых клиентов, таких как Gmail, ZeroMail — это вообще не клиент, а всего лишь локальная система обмена сообщениями между пользователями.
При отправке письма ZeroNet не соединяется с сервером, а просто шифрует послание с помощью открытого ключа адресата и записывает его в локальную базу данных (data/users/zeromail.db), которая автоматически синхронизируется со всеми остальными пользователями ZeroMail (по сути, они просто получают обновленную версию веб-приложения). Таким образом, в базе хранятся все сообщения всех пользователей приложения, однако расшифровать эти сообщения могут только адресаты, так как только у них есть закрытый ключ для расшифровки.
В сущности, большинство сайтов в ZeroNet работают подобным образом. С той лишь разницей, что открытые для всех веб-сайты не используют шифрование, а в некоторых информация записывается в текстовые файлы вместо баз данных. В любом случае все сайты по своей сути локальные, а доступ к ним с других узлов осуществляется с помощью встроенного в ZeroNet механизма обновления копии веб-сайта.
Выводы
ZeroNet определенно очень интересная технология обхода цензуры, главная фишка которой — очень низкий порог вхождения как со стороны пользователя, так и со стороны разработчика. Да, здесь нельзя сделать бэкенд внутри самой сети, однако есть возможность сохранения файлов и возможность использовать базу данных, что позволяет создавать достаточно развитые приложения, в том числе многопользовательские форумы и блоговые платформы. Главное — сделать свой сайт популярным, и тогда его действительно невозможно будет выключить.