Запускам на базе SBC с установленным Armbian узел Yggdrasil.

Что такое Yggdrasil и зачем вся эта затея.

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

Главный плюс и надежда в этой сети на доступность. Так как она mesh, то может перестраиваться при “выпадении” некоторых узлов и/или маршрутов. То есть шанс, что я смогу в ней достучаться до своего VPS если в очередной раз рухнул трафик в районе Москвы больше, чем через родного провайдера. Да и это дает возможность настроить доступ к внутренним ресурсам домашней сети (двойной NAT от провайдера).

Да и к тому же недавно PiHole переехал в контейнер на мини-сервер, освободив плату Orange Pi Zero 2. Вот под нее и задачка.

Установка

Так как готового пакета для установки в Armbian нет, придется идти за бинарниками на github. Скачиваем оттуда версию под свою архитектуру и систему. У меня это arm64 и Debian. Далее эта команда будет использоваться в скрипте обновления.

1
curl -Ls -o /tmp/yggdrasil.deb https://github.com/yggdrasil-network/yggdrasil-go/releases/download/v0.5.5/yggdrasil-0.5.5-arm64.deb

После этого запускаем установку:

1
apt install /tmp/yggdrasil.deb

Настройки

Настройки хранятся внутри /etc/yggdrasil/yggdrasil.conf (именно для такого пакета, иногда настройки можно найти в файле /etc/yggdrasil.conf). Если по каким-то причинам файла нет, то нужно сгенерировать новый файл:

1
2
3
/usr/bin/yggdrasil -genconf > /etc/yggdrasil/yggdrasil.conf
chown root:yggdrasil /etc/yggdrasil/yggdrasil.conf
chmod 640 /etc/yggdrasil/yggdrasil.conf

Пройдемся по самым важным настройкам.

Peers

В настройке указываются адреса узлов yggdrasil. Тут можно указать любой узел из списка. Так как по умолчанию авто обнаружение других узлов работает через multicast, то при отсутствии таковых в локальной сети подключится к yggdrasil не получится. Параметры не отключает авто обнаружение, но позволяет узлу оставаться на связи через узлы доступные по белым ip адресам.

Например, в моей сети этот список заполнен только у серверов (локальных или VPS), клиентам же пока достаточно обнаружить в сети сервер и через него попасть в сеть.

MulticastInterfaces

А тут можно настроить какие интерфейсы системы можно будет использовать для multicast обнаружения.

Например, на своих VPS серверах я этот параметр оставляю пустым. Серверы имеют белый ip (если захочу выдать интервейс подключения в мир) и находятся в сети хостера, в которую бы не хотелось лишний раз “спамить”.

AllowedPublicKeys

Тут можно указать список публичных ключей yggdrasil нод, которым будет разрешено обращаться к серверу с интерфейса yggdrasil. По сути, после внесения хотя бы одной записи этот параметр полностью отсекает видимость сервера в сети yggdrasil для остальных пользователей.

Например, Zero 2 скрыт ото всех, кроме рабочей станции и ноутбука. На VPS-ке же интерфейс добавлен в ограниченную зону фаервола, так как некоторые вещи в будущем будут выставлены именно в yggdrasil сеть.

IfName

Чисто косметический параметр, но лучше его задать. Проще будет искать в списке интерфейсов нужных далее.

Например, у меня это везде yggd, так как tun0 ни о чем не говорит своим названием.

Обновление

Так как мы ставим пакет не из репозитория, то задачей обновления должны озаботиться сам. Данные по релизам можно получить от публичного API Github. Понадобится нам jq и curl. В самом простом варианте (без проверок версий и прочего):

1
2
3
4
5
6
7
8
9
yggdrasil-update() {
  local ARCH="-arm64.deb"
  local JQ_FILTER="[ .[] | select( .draft == false and .prerelease == false )][0].assets | map( select( .name | endswith(\"$ARCH\")) )[0].browser_download_url"
  echo "Get releases..."
  local DOWNLOAD_LINK=$(curl https://api.github.com/repos/yggdrasil-network/yggdrasil-go/releases -s | jq -r "$JQ_FILTER")
  echo "Download from link: $DOWNLOAD_LINK"
  curl -Ls -o /tmp/yggdrasil.deb $DOWNLOAD_LINK
  apt install /tmp/yggdrasil.deb
}

Тут бы еще добавить проверку пакетного менеджера с выбором .rpm или .deb пакета. Получить архитектуру с переводом ее в формат записи разработчиков. Но пока так.