Заметки об Yggdrasil: качество кода, безопасность, DNS

Александр Котов 1027 слов
yggdrasil децентрализация технологии безопасность iptables сетевой экран

Сейчас сложно продвигать сеть Yggdrasil[4] для массового использования. Она сложна для обычного пользователя, поскольку требует настройки. Она не даёт новых возможностей обхода наиболее часто применяемых механизмов государственных блокировок Интернета по сравнению с другими технологиями, таким как VPN. В ней нет большого количества уникальных ресурсов. Наконец, это экспериментальная технология, к стабильности и безопасности которой есть вопросы.

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

Кроме того, мы уже рассказывали про размещение веб-сайтов в Yggdrasil[2], но очень мало осветили особенности этой сети. При этом мы поддерживаем в ней зеркало нашего веб-сайта. Это мотивировало нас подробнее изучить Yggdrasil. Нашим опытом и результатами исследования мы хотим поделиться с вами.

Качество кода

Невозможно профессионально говорить о программном обеспечении, не разобравшись в его исходном коде. Вот мы и решили изучить исходный код Yggdrasil. Благо это всего лишь 4874 строки кода на языке программирования Go, или 6634 строк кода вообще, без учёта комментариев и пустых строк (измерить можно с помощью программы cloc, которая имеется в большинстве дистрибутивов GNU/Linux).

Мы были неприятно удивлены. Начнём с того, что код почти не протестирован. Имеется всего один файл с тестами (src/core/core_test.go), содержащий всего 150 строк кода, то есть это в лучшем случае 132 часть всего кода проекта. Это очень мало. Так, в Bitcoin тесты составляют 17 часть кода, в IPFS — 16, в Tor — 14. Мы убедились, что тесты не покрывают даже такие изменения в коде, которые делают использование Yggdrasil невозможным, например, отключение виртуального сетевого интерфейса TUN/TAP. Что и говорить о более тонком тестировании вариативности в данных, которая может представлять угрозу безопасности.

Сам код не отличается читаемостью. Так, функция handler в файле src/core/link.go занимает 110 строк (без учёта пустых строк и комментариев). Работать с этим довольно сложно. Проблему признают и авторы кода: в функции присутствует комментарий о необходимости разделить её. Мы не просто так начали изучение Yggdrasil именно с этого файла. Одной из первых наших идей для погружения в исходный код было добавление нового транспортного протокола, такого как QUIC, вдобавок к TCP и TLS. Нам казалось, что это должно быть несложно, но вскоре мы убедились в обратном. Например, структура links из того же файла содержит информацию о подключении транспортного уровня, и она жёстко привязана к протоколу TCP. Для добавления QUIC потребуется сначала переработать код.

Безопасность: привилегии и сетевой экран

Теперь рассмотрим безопасность с более общей точки зрения. При установке Yggdrasil в операционных системах, основанных на Debian и systemd, он запускается с правами суперпользователя. Это нужно для администрирования виртуального сетевого интерфейса TUN/TAP и создания файла служебного разъёма (admin socket), но затем привилегии стоит сбросить, чего не происходит. Linux capabilities для процесса установлены явно, что хорошо.

По умолчанию любой участник сети может отправлять пакеты на ваш адрес. Раньше в Yggdrasil был встроенный сетевой экран, но в версии 0.4 его удалили для упрощения кода. Хотя это не представляет непосредственной угрозы, при сочетании некоторых факторов это может увеличить поверхность атаки на ваше устройство, поэтому важно настроить сетевой экран. Далее мы предложим наиболее строгие настройки, которые не подходят для сервера, но подходят для домашнего компьютера. Пользователь Yggdrasil получает один адрес в подсети 200::/7, а также целую подсеть с длиной префикса 64 бита в подсети 300::/8, которая является подмножеством первой подсети, поэтому не требует отдельной обработки в сетевом экране. В Linux правила для iptables, которые разрешают только исходящие соединения (TCP, UDP, ICMP и другие) будут выглядеть так:

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

Здесь ygg0 — это название виртуального сетевого интерфейса TUN/TAP. Его необходимо указать в настройках Yggdrasil (файл /etc/yggdrasil.conf) в поле IfName. Желательно удалить из конфигурационного файла ваши ключи (PublicKey: null и PrivateKey: null). Тогда ваш IP-адрес будет меняться при каждом запуске, что тоже усложняет атаки. Стоит изменить настройку NodeInfoPrivacy на true, чтобы не сообщать информацию о вашей операционной системе, архитектуре процессора и версии Yggdrasil.

IPv4 в yggdrasil не используется, но для надёжности вы можете запретить весь такой трафик на сетевом интерфейсе:

iptables -A INPUT  -i ygg0 -j REJECT
iptables -A OUTPUT -o ygg0 -j REJECT

Доступность: DNS и относительные пути

Адресация в Yggdrasil происходит по IPv6-адресам. Это не всегда удобно. Адреса сложно запоминать, не все программы их воспринимают как корректные ссылки. Поэтому пользователи пробуют использовать DNS. Так, существует программа meshname[5], которая просто преобразует IPv6-адреса в доменные имена. Проблему с запоминанием это не решает, к тому же требует установки постороннего программного обеспечения. Есть различные серверы DNS, которые позволяют использовать более короткие доменные имена и стандартное программное обеспечение операционных систем (например, dnsmasq). Однако это тоже требует настройки, а также привязывает пользователя к конкретному серверу.

Получается, что единственным универсальным способом разрешения имён является использование записей типа AAAA глобальной DNS. Это влечёт за собой все соответствующие недостатки, но другие механизмы в современных операционных системах не реализованы из-за консерватизма этой сферы, о чём мы уже писали ранее[1]. Мы считаем, что без инициативы со стороны разработчиков операционных систем ситуация не изменится, посколько все альтернативные решения являются слишком маргинальными.

Даже глобальная система доменных имён не решает некоторых проблем, которые возникают у администраторов веб-сайтов в Yggdrasil. Например, если один сервер должен раздавать сайт и в Yggdrasil, и в Интернет, то не получится использовать URL (вида foobar.tld/qwe/rty). Мы продвигаем использование в распределённых сетях относительных путей (вида qwe/rty). Это требует некоторой настройки веб-приложений или генераторов статических сайтов, но не представляет большой сложности. Относительные пути являются также более универсальными чем абсолютные пути (вида /qwe/rty), поскольку позволяют раздавать веб-сайты не из корневого пути. Мы уже предлагали такой вариант для IPFS[3], но он может быть полезен и в других случаях, когда нельзя рассчитывать на стандартные условия Всемирной паутины, в том числе в Yggdrasil.

Выводы

Yggdrasil — это сырое программное обеспечение. Его категорически нельзя использовать для каких-то важных задач. Однако помогать в его развитии стоит. Обсуждение очень активно ведётся в чате в Matrix[6]. Есть также активное русскоязычное сообщество Russian Meshnet в Matrix[7] и в Telegram[8]. Если вы обычный пользователь, то заходите в различные чаты и форумы, которые есть в сети, и рассказывайте в сообществе о своём опыте и найденных проблемах. Если вы программист, то помогайте в написании кода. Активно этим занимаются всего два человека. Думаю, что если разработчиков будет больше, то большинство проблем Yggdrasil будут решены и мы увидим реальные возможности сетей с ячеистой топологией.

Неофициальный логотип Yggdrasil
Неофициальный логотип Yggdrasil

Связанные статьи

  1. Почему слово Интернет пишется с прописной буквы?
  2. Размещение веб-сайтов в Tor и в Yggdrasil
  3. Размещение сайтов в распределённой файловой системе IPFS

Ссылки