Как и зачем запустить веб-сервер в mesh-сети Yggdrasil

В этой статье, мы немного расскажем вам про интересный сетевой протокол Yggdrasil, который может вам помочь в реализации ваших сетевых задумок. Мы осветим тему зачем это нужно и что вы от этого можете получить, а также затронем тему настройки Yggdrasil на своем сервере и его возможных перспектив. Также в конце статьи мы предложим вам несколько идей для проектов и разработок, которые вы при желании сможете воплотить самостоятельно.

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

Что такое Yggdrasil?

Yggdrasil — это относительно новый сетевой протокол (а также и его реализация), с помощью которого можно создать mesh-сеть, способную работать поверх Интернета или любой другой существующей сети. Сеть на базе Yggdrasil является приватной и децентрализованной (что и означает понятие mesh-сеть), а ее реализации предполагают нулевую настройку при абсолютной масштабируемости.

Протокол Yggdrasil подразумевает работу в определенном диапазоне адресов IPv6 и поэтому, если некое приложение поддерживает работу через протокол IP версии 6, то оно без проблем будет работать через Yggdrasil без каких-либо промежуточных шагов по настройке.

Относительно нулевой настройки самого Yggdrasil говорить не совсем корректно, поскольку предполагается установка и некоторое минимальное конфигурирование, но как правило, оно довольно просто и хорошо описано в документации самого Yggdrasil.

Понимая, что после прочтения этих строк у вас возникла мысль «А зачем все это?», да еще с настройкой, пусть даже и минимальной, то попытаемся ответить на этот вопрос далее.

Зачем это надо?

Действительно, зачем? Существующая инфраструктура достаточно проста и содержит большое количество решений, а также руководств по их воплощению, зачем нам еще что-то?

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

Но, как всегда есть «но»…

Что если вы по каким-то причинам не можете себе позволить статический IP-адрес? Или допустим, ваш провайдер не предоставляет такую услугу, а переходит к другому провайдеру достаточно затратно?

В этом случае, вам может помочь Yggdrasil. При установленном Yggdrasil вам не требуется иметь статический IP-адрес и мощный сервер, поскольку при установке Yggdrasil вам прописывается автоматически адрес из неиспользуемого сегмента 0200::/7 и он закрепляется за вашим устройством. Полученный IP-адрес становится доступным всем внешним устройствам (если не настроено иное), на которых также установлен Yggdrasil, и это работает даже если ваш интернет идет через мобильного оператора!

Вот вам лично мой пример. У меня весь интернет в доме идет через 4G-модем одного известного оператора, а мне очень часто требуется удаленный доступ к ресурсам своего компьютера. Да и не просто доступ именно с компьютера, а порой даже с телефона. Провайдер на мой запрос относительно статического IP-адреса, смог ответить лишь то, что такая услуга предоставляется для юридических лиц. И таким образом, у меня нарисовалась проблема: нужно иметь доступ, а для этого требуется статический IP-адрес. Можно для таких целей установить какое-нибудь проприетарное программное обеспечение для организации удаленного рабочего стола, но доверять свой компьютер таким программам не хотелось. Одновременно с этим потребовалось, чтобы еще ряд людей видели ресурса компьютера через что-то наподобие веб-оболочки… И вот тут, я нашел решение: установил Yggdrasil, подобрал клиенты для компьютера и смартфона, и настроил веб-сервер для статичных файлов на D — и все это работает несмотря на модем 4G (вполне успешный обход NAT). Также я попробовал это проверить и на мобильном устройстве. Также работает.

Примечание автора.

Помимо этого, Yggdrasil может помочь и в случае наличия ограничений и блокировок, поскольку работает поверх основной сети и возможные проблемы с доступом не касаются непосредственно Yggdrasil. Это обстоятельство может быть использовано при наличии NAT или межсетевых экранов (спорное утверждение, но нам встречались случаи, когда это срабатывало).

Также, то обстоятельство, что по сути, Yggdrasil формирует свою особую децентрализованную (т.е. без центральных узлов и DNS) сеть тоже может представлять собой интерес, поскольку способствует появлению независимых ресурсов со своим отдельным сообществом и своей отдельной сферой влияния. Все это приводит к тому, что типовые ситуации и правила работы в Интернете и других подобных сетях могут быть неприменимы внутри Yggdrasil.

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

Это реально не шутка. Сам Yggdrasil написан на Go, и у меня был крайне интересный опыт его установки из исходных кодов, на архитектуру, которая не прописана в документации Yggdrasil, а именно на Onion Omega 2. Представьте себе, MIPS процессор и 16 Мб памяти вообще на все — и тем не менее, даже тут можно запустить Ygddrasil и это будет работать.

Примечание автора.

Под старыми технологиями подразумевается отнюдь не только старое оборудование, в которое можно вдохнуть новую жизнь, заставив его работать как маломощный сервер; под этим подразумевается ряд вещей и концепций, которые работали во времена становления WWW и которые потеряли актуальность сейчас, либо ряд протоколов, которые сейчас не на слуху, но были когда-то очень популярны (например, IRC). С Yggdrasil можно для своих нужд использовать и такое, практически не меняя использовавшееся для этого программное обеспечение.

После того, как мы осветили ряд возможных случаев для использования (далеко не единственных, к слову, есть множество и других успешных кейсов), мы перейдем к вопросу о том, как же начать.

Как установить Yggdrasil?

В этой части статьи мы покажем как настроить Yggdrasil для работы на Raspberry Pi. Частично мы повторим слова из официальной документации, описывающей процесс установки, но то, что будет описано далее применимо не только для Raspberry Pi OS, но и для других debian-based дистрибутивов. Также, мы опишем не только установку, но и часть конфигурирования, добавив к нему шаг, который позволит вам сделать все настройки немного быстрее. Установка на других дистрибутивах Linux аналогична (меняются только команды пакетного менеджера), установку для Windows в данной статье мы затрагивать не будем, поскольку она неплохо освещена в этой статье.

Предполагается, что у вас уже подготовлена SD-карта с операционной системой и на ней уже установлена последняя версия Raspberry Pi OS. Также предполагается наличие интернет-соединения и базовых навыков по работе с командной строкой.

Для начала устанавливаем пакет dirmngr с помощью следующей команды:

sudo apt-get install dirmngr

После чего импортируем публичные ключи стороннего репозитория Yggdrasil (репозиторий от разработчиков) и экспортируем их в apt следующей последовательностью команд:

gpg --fetch-keys https://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb/key.txt
gpg --export 569130E8CA20FBC4CB3FDE555898470A764B32C9 | sudo apt-key add -

Теперь добавляем репозиторий в источники apt и обновляем списки пакетов во всех текущих репозиториях:

echo 'deb http://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb/ debian yggdrasil' | sudo tee /etc/apt/sources.list.d/yggdrasil.list
sudo apt-get update

Устанавливаем следующей командой:

sudo apt-get install yggdrasil

После установки Yggdrasil автоматически генерируется его конфигурационный файл, который находится в /etc/yggdrasil.conf, официальная инструкция советует после этого перезапустить сервис yggdrasil в systemd, но мы рекомендуем перед этим сделать ряд подготовительных действий…

Открываем файл yggdrasil.conf с правами суперпользователем в консольном редакторе nano:

sudo nano /etc/yggdrasil.conf

После того, как файл открылся ищем строку с надписью Peers: [] и внутрь квадратных скобок помещаем список пиров (узлов сети), где каждый элемент списка после себя содержит запятую, а сам адрес для пира помещен в кавычки. Список узлов можно узнать здесь и выбрать свои по вкусу, либо можете воспользоваться нашей версией: замените Peers: [] в своем файле на аналогичный элемент из этого файла, который мы составили сами перед подготовкой этой статьи.

Теперь мы включаем сервис Yggdrasil в systemd и перезапускаем его такой последовательностью команд:

sudo systemctl enable yggdrasil
sudo systemctl restart yggdrasil

На этом настройка всего необходимого для сервера завершена. Для того, чтобы со стороны клиента иметь доступ к Yggdrasil, на клиентском рабочем месте также нужно произвести установку Yggdrasil по такой же (или подобной, но для своей операционной системы) инструкции. Это необходимо поскольку клиентская и серверная часть в этом случае представлена одной и той же программой, а если на клиентском рабочем месте не установить необходимый минимум, то клиент сможет взаимодействовать с Yggdrasil только через соответствующий прокси-сервис.

О других вариантах установки можно узнать здесь, ниже приведем ряд возможных вариантов:

Для проверки работоспособности можно набрать следующую команду, которая выведет список всех пиров к которым вы подключены:

sudo yggdrasilctl getPeers

Если установка производится для клиента, который будет использовать ваш ресурс, который планируется сделать доступным из Yggdrasil, то в качестве проверки работоспособности проделанной установки рекомендуется посетить (через браузер) следующие сервисы сети внутри Yggdrasil:

К примеру, у автора этой статьи, после настройки Yggdrasil карта сети выглядит так:

Запускаем сервер на D в Yggdrasil.

В принципе, в запуске сервера на D для Yggdrasil нет ничего особенного, поскольку для D есть библиотеки, которые поддерживают работу с IPv6. И наличие поддержки IPv6 — это единственное условие для того, чтобы приложение работало через Yggdrasil (кроме наличия установленного Yggdrasil разумеется).

В качестве учебного примера, мы будем использовать тот же самый код, что использовался в статье про генерацию статических страниц для репозиториев git, только внесем ряд изменений: требуется исправить адрес, который будет обслуживаться сервером и порт (по необходимости). В общем, иных изменений и не требуется:

#!/usr/bin/env dub
/+ dub.sdl:
    name "yggtest"
    dependency "vibe-d" version="~>0.8.2"
+/
import std.stdio;

import vibe.vibe;
import vibe.http.fileserver;
import vibe.http.router;
import vibe.http.server;

void index(HTTPServerRequest req, HTTPServerResponse res)
{
    static import std.file;
    auto result = cast(string) std.file.read(`index.html`);
    res.writeBody(result, "text/html; charset=UTF-8");
}

void main()
{
    auto router = new URLRouter;
    router.get("/", &index);
    router.get("*", serveStaticFiles(""));

    auto settings = new HTTPServerSettings;
    settings.port = <ваш номер порта>;
    settings.bindAddresses = ["<Ваш адрес Yggdrasil>", "127.0.0.1"];

    listenHTTP(settings, router);
    runApplication();
}

Адрес вашего устройства, на котором запущен Yggdrasil можно узнать с помощью команды:

sudo yggdrasilctl getPeers

Следуя инструкциям из уже упоминавшейся статьи и изменив адрес/порт получаем, получаем такую картинку (это уже на другом компьютере, подключенном даже к другому провайдеру):

Резюмируя все сказанное ранее: Yggdrasil очень удобная и простая mesh-сеть, которая несмотря на свою молодость активно развивается и позволяет легко (непринужденно и в неформальной манере) создавать и продвигать свои собственные ресурсы, не нуждаясь при этом в организациях, предоставляющих IP-адреса и корпораций, обеспечивающих размещение разнообразного пользовательского контента. При этом создание и размещение своего ресурса настолько простое, что требуется только установка приложения yggdrasil и его минимальная настройка. Подобные достоинства делают контент доступным и позволяют снизить расходы на необходимую инфраструктуру, но при этом не следует думать, что Yggdrasil панацея и у него нет недостатков.

Среди недостатков можно отметить отсутствие DNS (хотя есть попытки создания чего-то похожего), непривычные и длинные адреса, не сильно высокая скорость сети и т.д. Однако, часть из этих недостатков может быть устранена в будущем, а какая-то часть и вовсе может быть даже достоинством самой сети.

В общем, решать заслуживает ли Yggdrasil внимание только вам и только время расставит все по своим местам…

А что дальше?

Давным-давно, в одной далекой Галактике…Да, мы не забыли про то, что обещали поделиться рядом наших спекулятивных идей относительно применения протокола Yggdrasil и его реализации. Представьте, когда Интернет был относительно маленьким и свободным, и еще не везде использовался HTTP, был ряд интересных и простых протоколов, на основе которых пользователи могли взаимодействовать с информацией. Понятно, что многие из них сейчас признаны морально устаревшими и практически мертвы, но некоторые старые разработки еще до сих пор здравствуют.

Мы говорим здесь о протоколе Gopher, которые позволял с помощью простого текстового интерфейса через порт 70 получать доступ к различному контенту. Самой интересной особенностью протокола является его иерархическая организация, которая позволяет составить удобный порядок для файлов и ссылок, чем-то напоминая FTP. Разумеется, Gopher сейчас — это скорее история, но его серверы из-за простоты и нетребовательности к железу до сих пор активны, вот к примеру, один из них, где приведены аптаймы серверов Gopher.

Но, даже не в этом дело, и мы не предлагаем вам создавать Gopher-сервер (хотя ничто не останавливает вас от реализации), мы хотим познакомить вас с очень интересной идеей — протоколом Gemini.

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

Вот что говорят сами авторы:

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

Разработчики Gemini.

Суть в том, что Gemini — это чистый и простой способ отдачи разнообразного содержимого, очищенный от ненужного «оформительского мусора», скриптов (с возможным трекингом и вредоносным функционалом) и сфокусированный на приватности. Да, Gemini в чем-то похож на Gopher — его спецификация также довольно легкая (ее можно целиком удерживать в голове) и он также нетребователен к ресурсам, на которых информация будет размещаться, но Gemini более современен и лучше защищен.

Вот так выглядит клиент для Gemini под названием Lagrange и сами «сайты» в Gemini:

Какая чистота и красота ! Никакого лишнего оформления, только суть.

Сейчас Yggdrasil чем-то напоминает ранний Интернет, и Gemini, на наш взгляд, удачно бы вписался в эту сеть: у многих есть одноплатные компьютеры, у некоторых даже есть какие-то старые ПК — и вот на них можно было бы расширить «гемисферу» (Gemispace — англоязычное наименование общего пространства всех gemini-ресурсов, которые кстати, называются не сайтами, а capsules — «капсулами»), отдав тем самым под контроль пользователей их же информацию.

И, мы авторы этого блога, хотели бы поспособствовать наполнению Gemini-пространства (или даже Gopher-пространства) новым материалом, и хотели бы предоставить в ваше распоряжение интересный инструмент для реализации этой идеи.

Также, для интересующихся оставляем некоторый пласт информации по Gemini и смежной тематике:

И небольшой набор ссылок по Yggdrasil:

Добавить комментарий