Як і навіщо запустити веб-сервер у mesh-мережі Yggdrasil
Як і навіщо запустити веб-сервер у 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 наступною послідовністю команд:
Тепер додаємо репозиторій у джерела apt та оновлюємо списки пакетів у всіх поточних репозиторіях:
Встановлюємо наступною командою:
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 увімкнути yggdrasil
sudo systemctl перезапустити 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:
назва "yggtest"
залежність "vibe-d" версія="~>0.8.2"
+/
import std.stdio;
імпортувати vibe.vibe;
імпортувати vibe.http.fileserver;
імпортувати vibe.http.router;
імпортувати vibe.http.server;
void index(HTTPServerRequest req, HTTPServerResponse res)
{
static import std.file;
автоматичний результат = cast(string) std.file.read(`index.html`);
res.writeBody(результат, "текст/html; набір символів=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 у чомусь схожий на Gopher - його специфікація також досить легка (її можна цілком утримувати в голові) і він також невибагливий до ресурсів, на яких інформація буде розміщуватися, але Gemini сучасніший і краще захищений.
Ось так виглядає клієнт для Gemini під назвою Lagrange і самі сайти в Gemini:
Зараз Yggdrasil чимось нагадує ранній Інтернет, і Gemini, на наш погляд, вдало вписався б у цю мережу: у багатьох є одноплатні комп'ютери, у деяких навіть є якісь старі ПК — і ось на них можна було б розширити «гемісферу» (Gemispace - англомовне найменування загального простору всіх gemini-ресурсів, які до речі, називаються не сайтами, а capsules - "капсулами"), віддавши тим самим під контроль користувачів їхню ж інформацію.
І ми автори цього блогу, хотіли б посприяти наповненню Gemini-простору (або навіть Gopher-простору) новим матеріалом, і хотіли б надати у ваше розпорядження цікавий інструмент для реалізації цієї ідеї.
Також, для тих, хто цікавиться, залишаємо деякий пласт інформації з Gemini та суміжної тематики:
І невеликий набір посилань по Yggdrasil:
Как и зачем запустить веб-сервер в mesh-сети Yggdrasil – LightHouse Software
https://lhs-blog.info/medley/kak-i-zachem-zapustit-veb-server-v-mesh-seti-yggdrasil/
Коментарі
Дописати коментар
Олег Мічман в X: «Donations and support for media resources, bloggers, projects, and individuals. https://t.co/HPKsNRd4Uo https://t.co/R6NXVPK62M» / X
https://twitter.com/olukawy/status/1703876551505309973