💾 Archived View for causa-arcana.com › blog › 2021 › 07 › 28 › yggdrasil.html captured on 2022-07-16 at 13:48:01.
⬅️ Previous capture (2022-04-29)
-=-=-=-=-=-=-
<!DOCTYPE html> <html class="h-100" lang="ru"> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, shrink-to-fit=no, user-scalable=no"/> <title>Заметки об Yggdrasil: качество кода, безопасность, DNS | Causa Arcana</title> <link rel="canonical" href="https://causa-arcana.com/blog/2021/07/28/yggdrasil.html"/> <link rel="alternate" type="application/rss+xml" title="Causa Arcana" href="https://causa-arcana.com/blog/feed.xml"/> <meta name="description" content="Сейчас сложно продвигать сеть Yggdrasil для массового использования. Она сложна для обычного пользователя, поскольку требует настройки. Она не даёт новых возможностей обхода наиболее часто применяемых механизмов государственных блокировок Интернет..."/> <meta name="twitter:card" content="summary"/> <meta name="twitter:site" content="@causa_arcana"/> <meta name="twitter:creator" content="@causa_arcana"/> <meta name="twitter:title" content="Заметки об Yggdrasil: качество кода, безопасность, DNS | Causa Arcana"/> <meta name="twitter:description" content="Сейчас сложно продвигать сеть Yggdrasil для массового использования. Она сложна для обычного пользователя, поскольку требует настройки. Она не даёт новых возможностей обхода наиболее часто применяемых механизмов государственных блокировок Интернет..."/> <meta name="twitter:image" content="https://causa-arcana.com/assets/images/blog/preview/yggdrasil.png"/> <meta property="og:type" content="website"/> <meta property="og:url" content="https://causa-arcana.com/blog/2021/07/28/yggdrasil.html"/> <meta property="og:title" content="Заметки об Yggdrasil: качество кода, безопасность, DNS | Causa Arcana"/> <meta property="og:description" content="Сейчас сложно продвигать сеть Yggdrasil для массового использования. Она сложна для обычного пользователя, поскольку требует настройки. Она не даёт новых возможностей обхода наиболее часто применяемых механизмов государственных блокировок Интернет..."/> <meta property="og:image" content="https://causa-arcana.com/assets/images/blog/preview/yggdrasil.png"/> <link href="../../../../assets/images/logo-small.jpg" rel="icon" type="image/jpg" /> <link href="../../../../assets/stylesheets/site.css" rel="stylesheet" /> </head> <body class="d-flex flex-column h-100"> <header> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container-fluid"> <a href="../../../../index.html" class="navbar-brand"> <img src="../../../../assets/images/logo-small.jpg" width="30" height="30" alt="Логотип" /> Causa Arcana </a> <div class="navbar-collapse"> <ul class="navbar-nav me-auto"> <li class="nav-item"> <a href="../../../feed.html" class="nav-link active "> Блог </a> </li> <li class="nav-item"> <a href="../../../../sources.html" class="nav-link "> Источники </a> </li> <li class="nav-item"> <a href="../../../../git.html" class="nav-link "> Git </a> </li> <li class="nav-item"> <a href="../../../../team/index.html" class="nav-link "> Наша команда </a> </li> </ul> </div> </div> </nav> </header> <main> <article class="cl-blog-article container mt-4 mb-5"> <header> <h1>Заметки об Yggdrasil: качество кода, безопасность, DNS</h1> <p> <small class="text-muted"> <time datetime="2021-07-28T07:00:00Z"> 28 Июль, 2021 07:00 </time> </small> • <small class="text-muted"> Александр Котов </small> • <a href="https://medium.com/causa-arcana/yggdrasil-104c1024b302"><i class="fab fa-medium"></i> Medium</a> <br/> <span class="badge bg-secondary me-2"> yggdrasil </span> <span class="badge bg-secondary me-2"> децентрализация </span> <span class="badge bg-secondary me-2"> технологии </span> <span class="badge bg-secondary me-2"> безопасность </span> <span class="badge bg-secondary me-2"> iptables </span> <span class="badge bg-secondary me-2"> сетевой экран </span> </p> </header> <div class="blog-article--main mt-5 text-break"> <p>Сейчас сложно продвигать сеть <a href="https://yggdrasil-network.github.io">Yggdrasil</a> для массового использования. Она сложна для обычного пользователя, поскольку требует настройки. Она не даёт новых возможностей обхода наиболее часто применяемых механизмов государственных блокировок Интернета по сравнению с другими технологиями, таким как VPN. В ней нет большого количества уникальных ресурсов. Наконец, это экспериментальная технология, к стабильности и безопасности которой есть вопросы.</p> <p>Тем не менее, сама идея сетей с ячеистой топологией крайне перспективная. На её основе может быть построен принципиально другой интернет, что мы вкратце затронули в <a href="../19/capitalization-of-internet.html">одной из наших статей</a>. Yggdrasil является самым продвинутым программным обеспечением для реализации таких сетей, поэтому безусловно заслуживает внимания тех, кто интересуется не только текущей практической пользой, но и развитием и перспективами новых технологий.</p> <p>Кроме того, мы уже <a href="../07/tor-yggdrasil.html">рассказывали</a> про размещение веб-сайтов в Yggdrasil, но очень мало осветили особенности этой сети. При этом мы поддерживаем в ней зеркало нашего веб-сайта. Это мотивировало нас подробнее изучить Yggdrasil. Нашим опытом и результатами исследования мы хотим поделиться с вами.</p> <h2>Качество кода</h2> <p>Невозможно профессионально говорить о программном обеспечении, не разобравшись в его исходном коде. Вот мы и решили изучить исходный код Yggdrasil. Благо это всего лишь 4874 строки кода на языке программирования Go, или 6634 строк кода вообще, без учёта комментариев и пустых строк (измерить можно с помощью программы cloc, которая имеется в большинстве дистрибутивов GNU/Linux).</p> <p>Мы были неприятно удивлены. Начнём с того, что код почти не протестирован. Имеется всего один файл с тестами (<code>src/core/core_test.go</code>), содержащий всего 150 строк кода, то есть это в лучшем случае <sup>1</sup>⁄<sub>32</sub> часть всего кода проекта. Это очень мало. Так, в Bitcoin тесты составляют <sup>1</sup>⁄<sub>7</sub> часть кода, в IPFS – <sup>1</sup>⁄<sub>6</sub>, в Tor – <sup>1</sup>⁄<sub>4</sub>. Мы убедились, что тесты не покрывают даже такие изменения в коде, которые делают использование Yggdrasil невозможным, например, отключение виртуального сетевого интерфейса TUN/TAP. Что и говорить о более тонком тестировании вариативности в данных, которая может представлять угрозу безопасности.</p> <p>Сам код не отличается читаемостью. Так, функция <code>handler</code> в файле <code>src/core/link.go</code> занимает 110 строк (без учёта пустых строк и комментариев). Работать с этим довольно сложно. Проблему признают и авторы кода: в функции присутствует комментарий о необходимости разделить её. Мы не просто так начали изучение Yggdrasil именно с этого файла. Одной из первых наших идей для погружения в исходный код было добавление нового транспортного протокола, такого как QUIC, вдобавок к TCP и TLS. Нам казалось, что это должно быть несложно, но вскоре мы убедились в обратном. Например, структура <code>links</code> из того же файла содержит информацию о подключении транспортного уровня, и она жёстко привязана к протоколу TCP. Для добавления QUIC потребуется сначала переработать код.</p> <h2>Безопасность: привилегии и сетевой экран</h2> <p>Теперь рассмотрим безопасность с более общей точки зрения. При установке Yggdrasil в операционных системах, основанных на Debian и systemd, он запускается с правами суперпользователя. Это нужно для администрирования виртуального сетевого интерфейса TUN/TAP и создания файла служебного разъёма (admin socket), но затем привилегии стоит сбросить, чего не происходит. Linux capabilities для процесса установлены явно, что хорошо.</p> <p>По умолчанию любой участник сети может отправлять пакеты на ваш адрес. Раньше в Yggdrasil был встроенный сетевой экран, но в версии 0.4 его удалили для упрощения кода. Хотя это не представляет непосредственной угрозы, при сочетании некоторых факторов это может увеличить поверхность атаки на ваше устройство, поэтому важно настроить сетевой экран. Далее мы предложим наиболее строгие настройки, которые не подходят для сервера, но подходят для домашнего компьютера. Пользователь Yggdrasil получает один адрес в подсети <code>200::/7</code>, а также целую подсеть с длиной префикса 64 бита в подсети <code>300::/8</code>, которая является подмножеством первой подсети, поэтому не требует отдельной обработки в сетевом экране. В Linux правила для iptables, которые разрешают только исходящие соединения (TCP, UDP, ICMP и другие) будут выглядеть так:</p> <pre><code>ip6tables -A INPUT -i ygg0 -s 200::/7 -d 200::/7 -m conntrack --ctstate ESTABLISHED -j ACCEPT ip6tables -A OUTPUT -o ygg0 -s 200::/7 -d 200::/7 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT ip6tables -A INPUT -i ygg0 -j REJECT ip6tables -A OUTPUT -o ygg0 -j REJECT ip6tables -A INPUT -s 200::/7 -j REJECT ip6tables -A OUTPUT -s 200::/7 -j REJECT ip6tables -A INPUT -d 200::/7 -j REJECT ip6tables -A OUTPUT -d 200::/7 -j REJECT </code></pre> <p>Здесь <code>ygg0</code> – это название виртуального сетевого интерфейса TUN/TAP. Его необходимо указать в настройках Yggdrasil (файл <code>/etc/yggdrasil.conf</code>) в поле <code>IfName</code>. Желательно удалить из конфигурационного файла ваши ключи (<code>PublicKey: null</code> и <code>PrivateKey: null</code>). Тогда ваш IP-адрес будет меняться при каждом запуске, что тоже усложняет атаки. Стоит изменить настройку <code>NodeInfoPrivacy</code> на <code>true</code>, чтобы не сообщать информацию о вашей операционной системе, архитектуре процессора и версии Yggdrasil.</p> <p>IPv4 в yggdrasil не используется, но для надёжности вы можете запретить весь такой трафик на сетевом интерфейсе:</p> <pre><code>iptables -A INPUT -i ygg0 -j REJECT iptables -A OUTPUT -o ygg0 -j REJECT </code></pre> <h2>Доступность: DNS и относительные пути</h2> <p>Адресация в Yggdrasil происходит по IPv6-адресам. Это не всегда удобно. Адреса сложно запоминать, не все программы их воспринимают как корректные ссылки. Поэтому пользователи пробуют использовать DNS. Так, существует программа <a href="https://github.com/zhoreeq/meshname">meshname</a>, которая просто преобразует IPv6-адреса в доменные имена. Проблему с запоминанием это не решает, к тому же требует установки постороннего программного обеспечения. Есть различные серверы DNS, которые позволяют использовать более короткие доменные имена и стандартное программное обеспечение операционных систем (например, dnsmasq). Однако это тоже требует настройки, а также привязывает пользователя к конкретному серверу.</p> <p>Получается, что единственным универсальным способом разрешения имён является использование записей типа AAAA глобальной DNS. Это влечёт за собой все соответствующие недостатки, но другие механизмы в современных операционных системах не реализованы из-за консерватизма этой сферы, о чём мы уже писали <a href="../19/capitalization-of-internet.html">ранее</a>. Мы считаем, что без инициативы со стороны разработчиков операционных систем ситуация не изменится, посколько все альтернативные решения являются слишком маргинальными.</p> <p>Даже глобальная система доменных имён не решает некоторых проблем, которые возникают у администраторов веб-сайтов в Yggdrasil. Например, если один сервер должен раздавать сайт и в Yggdrasil, и в Интернет, то не получится использовать URL (вида <code>foobar.tld/qwe/rty</code>). Мы продвигаем использование в распределённых сетях относительных путей (вида <code>qwe/rty</code>). Это требует некоторой настройки веб-приложений или генераторов статических сайтов, но не представляет большой сложности. Относительные пути являются также более универсальными чем абсолютные пути (вида <code>/qwe/rty</code>), поскольку позволяют раздавать веб-сайты не из корневого пути. Мы уже <a href="../../03/25/ipfs.html">предлагали</a> такой вариант для IPFS, но он может быть полезен и в других случаях, когда нельзя рассчитывать на стандартные условия Всемирной паутины, в том числе в Yggdrasil.</p> <h2>Выводы</h2> <p>Yggdrasil – это сырое программное обеспечение. Его категорически нельзя использовать для каких-то важных задач. Однако помогать в его развитии стоит. Обсуждение очень активно ведётся в <a href="https://matrix.to/#/#yggdrasil:matrix.org">чате в Matrix</a>. Есть также активное русскоязычное сообщество Russian Meshnet в <a href="https://matrix.to/#/#ru.meshnet:matrix.org">Matrix</a> и в <a href="https://t.me/meshnet">Telegram</a>. Если вы обычный пользователь, то заходите в различные чаты и форумы, которые есть в сети, и рассказывайте в сообществе о своём опыте и найденных проблемах. Если вы программист, то помогайте в написании кода. Активно этим занимаются всего два человека. Думаю, что если разработчиков будет больше, то большинство проблем Yggdrasil будут решены и мы увидим реальные возможности сетей с ячеистой топологией.</p> <div class="d-flex justify-content-center"> <figure class="nice-figure"> <img src="../../../../assets/images/blog/yggdrasil.png" alt="Неофициальный логотип Yggdrasil."/> <figcaption> Неофициальный логотип Yggdrasil. </figcaption> </figure> </div> </div> </article> </main> <footer class="mt-auto py-4 bg-dark text-light"> <div class="container"> <div class="d-sm-none"> <div class="row row-cols-1"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <div class="d-none d-sm-block d-md-none"> <div class="row row-cols-2"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <div class="d-none d-md-block d-lg-none"> <div class="row row-cols-3"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <div class="d-none d-lg-block"> <div class="row row-cols-4"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <hr/> <div class="row"> <div class="col-12 col-lg-9"> <p class="mb-0"> <i class="fas fa-rss-square"></i> RSS: <a href="https://causa-arcana.com/blog/feed.xml" class="text-reset">https://causa-arcana.com/blog/feed.xml</a> </p> <p class="mb-0"> <i class="fab fa-creative-commons-by"></i> Содержимое доступно на условиях лицензии <a rel="license" href="https://creativecommons.org/licenses/by/4.0/" class="text-reset">Creative Commons Attribution</a>. </p> <p class="mb-0"> <i class="far fa-envelope"></i> Связь с администрацией: <a href="mailto:admin@causa-arcana.com" class="text-reset"> admin@causa-arcana.com </a> </p> </div> <div class="col-12 col-lg-3"> <hr class="d-block d-lg-none"/> <img src="../../../../assets/images/badge-ipv6.svg" height="24" class="me-2" alt="IPv6" /> <a href="https://no-js.club" target="_blank" class="me-2"> <img src="../../../../assets/images/badge-no-js-club.svg" height="24" alt="no-JS Club" /> </a> <a href="https://1mb.club" target="_blank" class="me-2 link-light"> <span>[1MB Club]</span> </a> </div> </div> </div> </footer> </body> </html>