Сначала я хотел бы извиниться за то, что не придавал значения тому, что оба существующих "клиента" сети 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 или xmpp.ygg.

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

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

А мы пока продолжим пилить новые сервисы внутри Yggdrasil. Оставайтесь на линии...

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

Комментарии (16)


  1. M_AJ
    25.11.2022 13:08

    Вы просто представьте, какие возможности возникают в сети, где не надо париться из-за всяких NAT

    Если бы все в обычном интернете перешли на ipv6 то вопрос с натом уже давно бы не стоял, но увы – дело движется не особо, даже не все домашние провайдеры дают клиентам возможность подключить ipv6 адрес, не говоря уже о мобильных.


    1. Revertis Автор
      25.11.2022 13:14

      Да, чаще всего проблема либо в железе промежуточных устройств, либо в нежелании провайдеров тратить время и деньги на внедрение.

      Yggdrasil в этом плане можно рассматривать как провайдера Ipv4toIPv6.


      1. M_AJ
        25.11.2022 16:33

        Да, чаще всего проблема либо в железе промежуточных устройств

        Сомневаюсь что в железе. Даже те древние коммутаторы/роутеры которые уже сняты с поддержки, и которыми завален Авито, поскольку провайдерам они не нужны, имеют поддержку ipv6. Так что дело исключительно в нежелании сетевиков/технических директоров заниматься настройкой и перестраивать свою сеть.


        1. 13werwolf13
          25.11.2022 17:38
          +1

          Помню как работая в хостинге отпиливали в старенькой циске кусок памяти от пула выделенного для маршрутов ipv6 для того чтобы влазил новый ipv4 full view. Тогда и выяснили что в выделенный пул v6 на тот момент фуллвью уже не влазит даже на половину.. Я к тому что наличие галочки "поддерживает ipv6" для провайдеров недостаточно, есть нюансы, это не домашнее оборудование, там всё хитрее.


  1. lost55
    25.11.2022 13:17
    +1

    К вопросу об удобстве, не плохо бы автоматически тянуть список пиров, как через клирнет, так и через ygg. И периодически обновлять список, а то он протухает.


    1. Revertis Автор
      25.11.2022 13:19

      Куда тянуть? Прямо в приложении отображать?


      1. lost55
        25.11.2022 13:24
        +2

        ИМХО пункт "Настроить там один пир из списка публичных пиров" должен отсутствовать как класс. пара пиров для бутстрапа захардкожены, остальное подтягивается автоматом. ну и галочка указать вручную. но это я безотносительно андроид приложения, а вообще ygg.


        1. Revertis Автор
          25.11.2022 14:01

          Нет, автоматическая настройка пиринга не входит в задачи Иггдрасиль. По многим причинам.


          1. lost55
            25.11.2022 14:07
            +3

            Я понимаю Вас, но помните, я смотрю на эту систему с точки зрения пользователя. Мне получается мало того, что нужно установить приложение, так еще нужно зайти на сайт с какими то пирами, выбрать один, правильно переписав его в приложение или конфиг. Даже в тор браузере мосты имхо проще. Работает - нафиг, не работает вот тебе три шага, с подробным обьяснением. В любом случае, для меня это не критично, переживу. Но вы меня заинтересновали "многими причинами", поделитесь?


            1. at5Fd8NVdfpf
              25.11.2022 23:23

              Вероятно потому, что ручное прописывание пиров - это костыль и времянка. В совсем идеальном случае при подключении к любой сети в ней должна уже быть нода ygg, которая находится через local discivery (можно считать что broadcast, хотя там ipv6 и это немного сложнее). То есть, если ygg запущен на достаточном количестве устройств, из него получится глобальная mesh сеть. Да, по факту так не будет как минимум для сотовой связи, ибо там нет broadcast никаком виде. Но запустит на "роутерах" которые сейчас делают NAT будет уже серьёзным достижением, тогда прописывать пиры вручную будет не нужно на всех клиентских девайсах.


      1. pvsur
        27.11.2022 23:20

        Ну crispa вполне себе подтягивает... Там мноооого пиров. И днс тоже, правда в версии много косяков, вылетов и нет удобной кнопки...


  1. vertnis
    25.11.2022 19:24

    ygg унаследовал от cjdns уязвимость к штормам? Часто ни с кем не мог соединиться последнее время.


    1. Revertis Автор
      25.11.2022 19:31

      После cjdns уже сменилась пара версий протокола маршрутизации. И в процессе разработки како-то новый.

      В данное время сеть не очень стабильна, да и кто может пообещать полную стабильность в сети с перестраивающимися маршрутами? Но если судить по мониторингу кучки моих и не моих сервисов, недоступность бывает пару раз в день минут на 5. Я считаю, что это очень хороший результат.


      1. c0der
        25.11.2022 21:13

        А чем можно помочь сети, чтобы повысить стабильность?


        1. Revertis Автор
          25.11.2022 21:20

          Подключить к сети VPS с каналом выше 100Мбит и слинковать с кучей других узлов.


  1. at5Fd8NVdfpf
    25.11.2022 21:18

    Хардкодить публичные пиры это так себе идея.

    1. Они имеют свойство дохнуть по куче разных причин. И в результате пользователи не прописавшие пиры (а типа зачем, итак работает) получат все сразу отсутствие связи.

    2. Мне например не хочется светить свой реальный ip кому попало (пусть даже нодам ygg). Пока труба подключена к моему wifi оно мимо vpn не пройдёт, но там это и не нужно, т.к. ygg стоит на роутере (openwrt) и доступен без всяких приложений на трубе.

    А ещё мне почемуто не удалось сконнектить 2 трубы напрямую. Если ygg есть на роутере - всё работает как надо, но без него нет. Да, client-to-client на wifi точке разрешён.