====== Как подключиться к Yggdrasil, не устанавливая его клиент на устройство ======
Разработчики [[yggdrasil:yggdrasil|Yggdrasil]] рекомендуют устанавливать клиент Yggdrasil на каждое устройство, которому нужен доступ в эту сеть. При этом гарантируется сквозное шифрование трафика между узлами, и каждый узел сети сможет выполнять роль маршрутизатора. Однако не во всех сетевых устройствах есть возможность установки и запуска Yggdrasil.
===== Вариант 1: маршрутизация из подсети /64 =====
Если устройство поддерживает протокол IPv6, оно может быть подключено к сети Yggdrasil путем присвоения ему IPv6 адреса из подсети 300::/64 и указания адреса шлюза в сеть Yggdrasil.
Иными словами, если у нас дома есть роутер, на котором имеется возможность установить Yggdrasil, то другие устройства в нашей сети мы можем подключить к сети Yggdrasil, не устанавливая на них клиент сети.
Предположим, что узел на роутере имеет адрес Yggdrasil ''200:1111:2222:3333:4444:5555:6666:7777'', тогда для подключения других устройств в сети необходимо им назначить адреса такого вида: ''300:1111:2222:3333::/64''. Это могут быть: ''300:1111:2222:3333::1'', ''300:1111:2222:3333::2'' и т.д. Обратите внимание, что первая цифра 2 изменена на 3, далее 3 разряда с разделителем ":" - это обязательная часть префикса. Остальные 64 бита (4 последние секции) - произвольные числа от 0000 до ffff. Читайте подробнее о подсети [[yggdrasil:subnet_setting|в этой статье]].
Далее, устройствам с адресами ''300:1111:2222:3333::/64'' нужно указать маршрут в сеть 0200::/7 через основное устройство с адресом ''200:1111:2222:3333:4444:5555:6666:7777''.
//**Примечание:** следует учитывать, что при такой конфигурации трафик между роутером и устройствами без Yggdrasil будет передаваться незашифрованным. Кроме того, обратите внимание, что префикс /64 имеет меньше битов адресного пространства, доступного для проверки идентификатора узла, что, в свою очередь, означает, что коллизии хэшей более вероятны. Таким образом, не следует полностью полагаться на адреса диапазона 300::/8 как на достоверно принадлежащие конкретному узлу (хотя, до сих пор подобные коллизии и не возникали, и даже не были намеренно созданы с помощью майнеров адресов, теоретически вероятность их возникновения существует).//
==== Пример ручной настройки ====
Допустим, в домашней сети работает [[wpru>Raspberry_Pi|RaspberryPi]], на котором установлен Yggdrasil: aдрес Yggdrasil: ''%%202:421a:2eс5:40a4:fa32:f4a4:9b42:d4e4%%''; префикс, соответственно: ''%%302:421a:2eс5:40a4::/64%%''; интерфейс: ''%%tun0%%''; к локальной сети Raspberri подключен через интерфейс ''%%eth0%%''.
Хотим подключить к сети Yggdrasil ноутбук, но не хотим на него устанавливать само ПО Yggdrasil. Ноутбук подключен к той же домашней сети через интерфейс ''%%wlo1%%'' (Wi-Fi).
1. Нужно на интерфейс, через который Raspberri подключен к локальной сети, добавить адрес из подсети Yggdrasil:
<code>sudo ip address add 302:421a:2eс5:40a4::1/64 dev eth0</code>
2. На Raspberri же включаем форвардинг пакетов между интерфейсами:
(для того, чтобы это сохранилось после перезагрузки, необходимо раскоментировать присвоение 1 этому параметру в ''%%/etc/sysctl.conf%%'')
3. На ноутбуке, на интерфейсе, которым он подключен к локальной сети, добавим адрес из подсети Yggdrasil:
<code>sudo ip address add 302:421a:2eс5:40a4::5/64 dev wlo1</code>
4. Прописываем на ноутбуке маршрут:
<code>sudo ip -6 route add 0200::/7 via 302:421a:2eс5:40a4::1</code>
//**Примечание:** если на этом этапе у вас возникли сложности, и у вас старое ядро Linux, возможно, вам поможет статья: "[[yggdrasil:route_with_old_kernel]]".//
Всё, пробуем с ноутбука пинговать адреса в Yggdrasil:
<code>PING 21e:a51c:885b:7db0:166e:927:98cd:d186(21e:a51c:885b:7db0:166e:927:98cd:d186) 56 data bytes
64 bytes from 21e:a51c:885b:7db0:166e:927:98cd:d186: icmp_seq=1 ttl=63 time=58.0 ms
64 bytes from 21e:a51c:885b:7db0:166e:927:98cd:d186: icmp_seq=2 ttl=63 time=69.0 ms
...
</code>
После проделанного, на всякий случай, не забудьте проверить, какие порты открыты на адресах ''%%302:421a:2eс5:40a4::1%%'' и ''%%302:421a:2eс5:40a4::5%%'':
<code>nmap -6 302:421a:2eс5:40a4::5
nmap -6 302:421a:2eс5:40a4::1</code>
==== Автоматическая настройка ====
Для целей автоматической раздачи устройствам в домашней сети IPv6-адресов из /64-подсети можно использовать демон [[wp>radvd]] (router advertisement daemon).
Примеры конфигурации демона radvd:
<WRAP group>
<WRAP column>
<code>interface eth0
{
AdvSendAdvert on;
AdvDefaultLifetime 0;
prefix 300:1111:2222:3333::/64 {
AdvOnLink on;
AdvAutonomous on;
};
route 200::/7 {};
};</code>
</WRAP>
<WRAP column>
<code>interface eth0
{
AdvSendAdvert on;
AdvLinkMTU 1280; # без этой строчки сбоит подключение для windows-устройств (задаёт MTU)
MinRtrAdvInterval 30;
MaxRtrAdvInterval 100;
prefix 300:1111:2222:3333::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on; # Без этой строки подключаются не все android-устройства; строка "route 200::/7 {};" не требуется.
Здесь ''%%300:1111:2222:3333::/64%%'' - префикc вашей подсети ("выдается" вместе с IPv6 адресом, привязанным к ключу в конфигурационном файле Yggdrasil).
//**Примечание:** по [[https://cstamas.hu/blog/posts/yggdrasil_300::__47__7_network_with_openwrt/|этой]] ссылке можно прочесть о том, анонсируется маршрут-поумолчанию без radvd (на [[wpru>OpenWrt]]).//
Для корректной работы маршрутизации через устройство, на котором установлен Yggdrasil на нем должна быть разрешена маршутизация IPv6-пакетов:
''%%net.ipv6.conf.all.forwarding=1%%'' нужно раскомментировать в ''%%/etc/sysctl.conf%%''
== То же самое, но без использования radvd ==
Допустим, у вас есть роутер, где LAN является сетевым интерфейсом br0, а Yggdrasil - ygg0.
<code>
ip a add fdb7:e5e:e3a9:f2d1::/64 dev br0 # Unique local address (ULA) является аналогом 192.168.1.1 в ipv4, его нужно добавить для корректной работы dnsmasq.
ip a add 300:1111:2222:3333::/64 dev br0 # Не забудьте заменить префикс 300:1111:2222:3333::/64 из примера на правильный адрес, полученный при запуске команды yggdrasilctl -v getSelf
ip route add 200::/7 dev ygg0
</code>
Обратите внимание на эти команды. Наиболее лучшим решением будет добавление ipv6 адресов через конфигурационные файлы системы или заранее подготовленный скрипт. В примере также добавлен ULA (fdb7:e5e:e3a9:f2d1::). Не обязательно использовать именно этот префикс. Вы можете сгенерировать свой https://unique-local-ipv6.com/
<summary>**Более подробный пример для систем c OpenRC**</summary>
На операционных системах c OpenRC (например, Gentoo) у вас есть возможность дополнительно запускать свои собственные скрипты. При каждом запуске сервиса local - будет запускаться скрипт yggdrasil**.start**. Подробнее: https://wiki.gentoo.org/wiki//etc/local.d
<code>
# rc-service local restart
* Stopping local ...
* Executing "/etc/local.d/yggdrasil.stop" ... [ ok ]
* Starting local ...
* Executing "/etc/local.d/yggdrasil.start" ... [ ok ]
</code>
/etc/local.d/yggdrasil**.start**
<file sh yggdrasil.start>
#!/bin/bash
# Возможно, вы захотите очистить лог
> /var/log/yggdrasil.stdout.log
#Не забудьте заменить префикс 300:1111:2222:3333::/64 из примера на правильный адрес, полученный при запуске команды yggdrasilctl -v getSelf
ip a add 330:1111:2222:3333::/64 dev br0
# Также вы можете добавить адрес вашего вебсайта
ip a add 330:1111:2222:3333::fea4/64 dev br0
ip r add 200::/7 dev ygg0
</file>
Можно дополнительно создать срипт /etc/local.d/yggdrasil**.stop**, который будет удалять добавленные адреса, но он не особо то и нужен. Учтите, при перезапуске интерфейса br0 он снова сбросится к стандартным настройкам.
<code>rc-service net.br0 restart</code>
Это можно исправить несолькими способами:
- снова перезапустив сервис **local**
- перезапустив сам скрипт /etc/local.d/yggdrasil**.start**
- или, для автоматизации, добавив в файл /etc/conf.d/net вот таую конструкцю, которая сама запустит скрипт при поднятии интерфейса br0
<code>
postup() {
if [ "${IFACE}" = "br0" ]
then
#rc-service local restart
/etc/local.d/yggdrasil.start
fi
return 0
}
</code>
На данном этапе вы уже можете посетить сайты сети Yggdrasil через консоль роутера. Убедитесь, что это работает.
Теперь настройте DHCP**v6**, чтобы раздавать адреса устойствам подключённым каким либо образом к интерфейсам объединённым в br0 (для понимания, br0 - бридж).
Допишите в файл /etc/dnsmasq.conf
<code>
listen-address=::1,127.0.0.1,192.168.1.1,fdb7:e5e:e3a9:f2d1:: # Слушать множество адресов, включая добавленный нами ранее ULA
dhcp-range=br0,300:1111:2222:3333::,ra-stateless,72h # YGG DHCP - Автоматическое получение адресов (DHCP). Не забудьте заменить 300:1111:2222:3333:: из примера на правильный адрес, полученный при запуске команды yggdrasilctl -v getSelf
# Пример настройи DNS сервера только для посещения сайтов черрез домены .ygg и .meship.
# Актуальные DNS сервера публикуются на странице http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:dns:internal_dns
server=/.meship/.ygg/302:db60::53
server=/.meship/.ygg/300:6223::53
# В данной конфигуации вы также можете использовать unbound, но не 53 порту, так как порт занят DNS сервером самого dnsmasq. Пример конфигуации unbound на странице http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:dns:unbound_wyrd
server=::1#5353
server=127.0.0.1#5353
</code>
После внесения правок перезапустите dnsmasq.
===== Вариант 2: использование прокси-сервера =====
[[yggdrasil:Yggdrasil]] устанавливается на одном единственном компьютере. Лучше, если это будет домашний сервер, который никогда не выключается.
На этом сервере нужно поставить прокси (http или socks), тогда вы сможете заходить через этот прокси в сеть, используя веб-браузер. А если ваш сервер
виден из внешнего мира, то вы сможете выходить в сеть вообще отовсюду. Не забудьте только повесить прокси на нестандартном порту и жестко ограничить IP, с которых предполагается туда заходить. Например, только из дома и только с работы. Если у вас есть доступ по ssh к собственному серверу (так обычно и бывает), то список разрешенных IP можно гибко менять при необходимости. Ведь вы можете оказаться в гостинице, в отпуске на Багамах, в командировке и т.д.
//Имейте в виду, что c клиента трафик до прокси-сервера будет идти в открытом виде.//
Используя какой-нибудь проксификатор ([[https://www.proxifier.com/|Proxifier]]) или что-то вроде [[https://github.com/xjasonlyu/tun2socks/|Tun2Socks]] можно не только посещать сайты в сети [[yggdrasil:Yggdrasil]], настроив соединение через прокси-сервер, но и дать возможность практически любым приложениям (не поддерживающим соединение через прокси-сервер) работать через прокси-сервер.
Пример конфигурации простейшего [[https://3proxy.ru/?l=RU|3proxy]]:
<code>log NUL D
internal 127.0.0.1
auth none
flush
socks -46 -p3229 -i91.233.111.15</code>
''%%91.233.111.15%%'' - адрес, на котором будет ждать подключений socks-прокси (может быть в локальной сети (192.168.x.x)) \\
''%%3229%%'' - порт, на котором будет ждать подключений socks-прокси
Используя [[wp>Proxy_auto-config|PAC-файл]] можно настроить браузер так, чтобы запросы на адреса Yggdrasil / ALFIS шли через прокси, а всё остальное - напрямую. Пример //подобного// PAC-файла можно найти [[https://www.linux.org.ru/forum/general/12324672?cid=12324680|здесь]]. Подробнее о PAC можно прочесть [[https://securelist.ru/pac-fajl-avtokonfiguratsii-problem/242/|здесь]].
===== Вариант 3: маршрутизация через VPN-сервер =====
==== использование WireGuard ====
Некоторые пользователи устанавливают [[yggdrasil:Yggdrasil]] на свой VPN-сервер и маршрутизируют трафик в Yggdrasil через него. В качестве серверного ПО VPN-сервера может использоваться [[https://openvpn.net/|OpenVPN]] или [[:wireguard|WireGuard]]. На сервере должна быть включена маршутизация пакетов (в ''%%/etc/sysctl.conf%%''):
<code>net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1</code>
Т.о., подключаясь к VPN-серверу, клиент получает доступ и в Интернет, и в Yggdrasil.
Пример конфигурации [[:wireguard|WireGuard]] на сервере:
Для того, чтобы через туннель работало разрешение имен [[yggdrasil:dns:ALFIS|ALFIS]], можно установить ALFIS на сервере или использовать один из [[yggdrasil:dns:alfis#список_публичных_серверов|публичных серверов]] и на клиенте, в конфигурационном файле wireguard, в строке, начинающейся с ''%%DNS =%%'', указать адрес резолвера/сервера ALFIS.
//Примечание:// при такой конфигурации, чтобы работало обычное соединение по IPv6, нужно наличие "настоящего" IPv6 на сервере, и для него (для нужного интерфейса) нужно будет добавить маскарадинг в ''%%PostUp =%%'' и ''%%PostDown =%%''. Подробнее здесь: [[wireguard:simple_vpn]]
==== использование ZeroTier ====
Это еще один вариант с использованием отдельностоящего сервера в качестве VPN.
Данный вариант инетерсен тем, что у [[https://www.zerotier.com/|ZeroTier]] есть клиент подо все популярные операционные системы и мобильные платформы.
- Регистрируемся на [[https://my.zerotier.com/|контроллере]] (для личных нужд хватит бесплатной версии) или поднимаем один из своих контроллеров (например [[https://key-networks.com/ztncui/|ztncui]] или [[https://github.com/dec0dOS/zero-ui|zero-ui]])
- На сервере скачиваем и устанавливаем [[https://www.zerotier.com/download/|клиент ZeroTier]], устанавливаем [[yggdrasil:Yggdrasil]], и включаем ipv6 форвардинг посредством **sysctl net.ipv6.conf.all.forwarding=1**
- Смотрим на полученные в yggdrasil адреса. Допустим aдрес Yggdrasil: **202:421a:2eс5:40a4:fa32:f4a4:9b42:d4e4**, префикс, соответственно: **302:421a:2eс5:40a4::/64**
- В контроллере создаём новую сеть. В этой сети нужно выолнить следующие настройки:
- Добавить роутинг **302:421a:2eс5:40a4::/64** "без gateway", т.е. эти адреса должны остаться внутри сети ZeroTier
- Добавить роутинг **200::/7** через **302:421a:2eс5:40a4::1** (или любой другой адрес, который вам захочется назначить GW.
- Отключить **IPv4 Auto-Assign**
- Включить **IPv6 Auto-Assign** в режиме **Auto-Assign from Range**
- Добавить пул выделяемых адресов с **302:421a:2eс5:40a4::1** по **302:421a:2eс5:40a4:ffff:ffff:ffff:ffff**
- На сервере добавляем клиента ZeroTier в нашу сеть посредством **zerotier-cli join <netid>>** (netid берём из настроек сети в контроллере)
- Так как ZeroTier считает **200::/7** публичной сетью (скажем искреннее спасибо авторам Yggdrasil за выбранный адрес), выполняем команду **zerotier-cli set <netid> allowGlobal=1**
- В контроллере "авторизуем" нового клиента. Или переводим сеть из разряда **Private** в разряд **Public** и забываем об этой операции навсегда. Если вы не будете где попало светить <netid> своей сети, к ней никто подключиться не может всё равно.
- Там же меняем IP у этого клиента на **302:421a:2eс5:40a4::1**
Собственно, на этом всё. Теперь на любое устройство/компьютер можно поставить клиент ZeroTier и присоеденившись к сети автоматически олучить IP адрес и роутинг. Ну или полуавтоматически, если Вы параноик и не стали переводить сеть в режим **Public**, то Вам придётся на контроллере авторизовывать каждое новое устройство. Единственное - не забываем на клиенте разрешать "глобальные адреса" через **zerotier-cli set <netid> allowGlobal=1** (еще раз скажем искреннее спасибо авторам Yggdrasil), иначе клиент просто не примет такой адрес (в мобильных клиентах тоже есть такая настройка).
====== Ссылки ======
Конфигурация Yggdrasil, описание префикса адреса (EN): https://yggdrasil-network.github.io/configuration.html \\
Configuring Yggdrasil with systemd-networkd (EN): https://tdem.in/post/yggdrasil-systemd/ \\