A new round of Yggdrasil development

 

Новый виток развития Yggdrasil

Habr
5 min

Сначала я хотел бы извиниться за то, что не придавал значения тому, что оба существующих "клиента" сети Yggdrasil для Android работали так себе эту пару лет. Почти год назад я написал статью о том, как настроить доступ в Yggdrasil через WireGuard, и сам использовал эту связку, поэтому клиентами не занимался. А ведь мог!

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

Непрошенная оптимизация

Если вы решите использовать DNS в связке с IPv6-only доменами при отсутствии "настоящего" IPv6 то получите фигу. Особенно на Андроиде. Да ещё и не одну.

Во-первых, системный резолвер, который Андроид позаимствовал из FreeBSD, имеет "оптимизацию" для сетей, в которых нет глобального IPv6. Таким образом, если вы решите, что в пределах своей сети вы хотите подключаться к какому-то компьютеру с адресом fe80::50ff:21ff:fe27:e71 по доменному имени, то ваш браузер или приложение просто не получат запись AAAA, так как она не будет запрошена у сервера DNS.

Если кратко, то резолвер пробует создать UDP-сокет, способный соединиться с адресом 2000::, и если такого маршрута нет, то ОС вернёт ошибку, и резолва AAAA просто не будет. А так как в Yggdrasil используется диапазон адресов 0200::/7, не входящий в 2000::/3, то всё плохо.

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

Но в этом клиенте я решил проблему изящнее - просто добавил маршрут 2000::/128, всё равно никто не будет с этим адресом соединяться, а если кто-то полезет на какой-то реальный IPv6, то ОС сразу вернёт ошибку, пакеты не будут лететь на обработку коду Yggdrasil, а браузер/приложение получит ошибку сразу, а не по таймауту.

Стоп, что за два разных клиента?

А, это опенсорс, детка :)
Я как-то пилил один клиент, когда он ещё был единственным. Он был заброшен своим изначальным разработчиком. Но потом его как-то перехватил третий разработчик, и перестал принимать от меня пулл-реквесты. В том приложении остался список древних неработающих серверов DNS, и кучка багов.

А второй клиент написан одним из разработчиков самого Yggdrasil, но примерно полтора года он был в зачаточном состоянии, без нужных воркэраундов, с дефолтной иконкой из Android Studio и т.п. Когда я придумал нужные фиксы я спросил у сообщества какой клиент дорабатывать, сообщество ответило "официальный".

Вторая фига DNS+IPv6

Да, я немного отвлёкся. В самом начале я писал, что DNS-фиги на Андроиде две.
Когда я дал сборку с тем первым аккуратным воркэраундом юзерам, некоторые начали писать, что ничего не работает. Это было странно!

Оказалось, что браузеры, основанные на движке Хрома, считают себя умнее, или просто не доверяют ОС, или слишком завязаны на корпорации Гугл. Они проверяют наличие маршрута к DNS-серверу Гугл с адресом IPv6: 2001:4860:4860::8888.

Для этого воркэраунда пришлось сделать отдельную опцию, чтобы юзеры могли включить её только если понадобится.

Что ещё сделано?

Вы же не думали, что я просто о DNS напишу и успокоюсь?

Кроме решения проблем с DNS я добавил полноценное окно настройки DNS, пока что там 4 моих сервера DNS, расположенные в разных странах и доступные для использования внутри Yggdrasil. Они блокирую рекламу с помощью AdGuard Home, резолвят домены из ALFIS (микроблокчейна за моим авторством) и даже из OpenNIC. Всё для приватности и независимости.

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

Насчёт кнопки быстрого включения и выключения из шторки и нотификации со статусом я даже писать не буду. Упс...

Ну, в итоге пару недель назад я добавлен в число разработчиков в репозитории, и продолжаю постепенно улучшать клиент. Сегодня вот выпустил новый релиз на основе выпущенной пару дней назад v0.4.7, и уже готовим выпуск в F-Droid. Впереди есть несколько очень интересных задумок...

Что с этим делать или зачем это всё?

В ближайшие дни меня посетила мысль, что Yggdrasil это пример того, чем должен был стать сам Интернет. Прямое соединение между любыми устройствами*. Вы просто представьте, какие возможности возникают в сети, где не надо париться из-за всяких NAT, а трафик весь зашифрован, и его не надо шифровать на уровне приложения!

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

Первый сервер работает через обычный интернет и Yggdrasil. Записи SRV настроены так, чтобы серверные подключения шли через интернет в первую очередь, а клиентские через Yggdrasil. Всё дело в приоритетах.

Второй сервер вообще работает только в Ygg, используя домен из ALFIS. Теоретически он может связываться с серверами в интернете, но его сертификат они не примут.

Как их попробовать?

  • Установить Yggdrasil на устройство с Android

  • Настроить там один пир из списка публичных пиров

  • В разделе DNS рекомендую выбрать парочку из списка

  • Включить Yggdrasil

  • Установить XMPP-клиент Conversations, например из F-Droid

  • Там зарегистрировать новый аккаунт на сервере yggdrasil.link или xmp.ygg

  • Попробовать написать мне на revertron@yggdrasil.link или revertron@xmpp.ygg соответственно.

Даже если вам не нравится пользоваться XMPP, или не найдёте сразу полезного применения, всегда остаётся зашифрованный, безопасный, DNS с блокировкой рекламы и следящих систем внутри Yggdrasil ;)
А мы пока продолжим пилить новые сервисы внутри Yggdrasil. Оставайтесь на линии...

* Да-да, "S in IoT stands for security" :)

Просмотры:

Коментарі

Популярні публікації