Как подключиться к 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. Читайте подробнее о подсети в этой статье.

Далее, устройствам с адресами 300:1111:2222:3333::/64 нужно указать маршрут в сеть 0200::/7 через основное устройство с адресом 200:1111:2222:3333:4444:5555:6666:7777.

Примечание: следует учитывать, что при такой конфигурации трафик между роутером и устройствами без Yggdrasil будет передаваться незашифрованным. Кроме того, обратите внимание, что префикс /64 имеет меньше битов адресного пространства, доступного для проверки идентификатора узла, что, в свою очередь, означает, что коллизии хэшей более вероятны. Таким образом, не следует полностью полагаться на адреса диапазона 300::/8 как на достоверно принадлежащие конкретному узлу (хотя, до сих пор подобные коллизии и не возникали, и даже не были намеренно созданы с помощью майнеров адресов, теоретически вероятность их возникновения существует).

Пример ручной настройки

Допустим, в домашней сети работает 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:

sudo ip address add 302:421a:2eс5:40a4::1/64 dev eth0

2. На Raspberri же включаем форвардинг пакетов между интерфейсами:

sudo sysctl -w net.ipv6.conf.all.forwarding=1

(для того, чтобы это сохранилось после перезагрузки, необходимо раскоментировать присвоение 1 этому параметру в /etc/sysctl.conf)

3. На ноутбуке, на интерфейсе, которым он подключен к локальной сети, добавим адрес из подсети Yggdrasil:

sudo ip address add 302:421a:2eс5:40a4::5/64 dev wlo1

4. Прописываем на ноутбуке маршрут:

sudo ip -6 route add 0200::/7 via 302:421a:2eс5:40a4::1

Примечание: если на этом этапе у вас возникли сложности, и у вас старое ядро Linux, возможно, вам поможет статья: «Маршрутизация из подсети 0300::/64 на старом устройстве».

Всё, пробуем с ноутбука пинговать адреса в Yggdrasil:

ping -6 21e:a51c:885b:7db0:166e:927:98cd:d186

Как видим, всё работает:

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
...

После проделанного, на всякий случай, не забудьте проверить, какие порты открыты на адресах 302:421a:2eс5:40a4::1 и 302:421a:2eс5:40a4::5:

nmap -6 302:421a:2eс5:40a4::5
nmap -6 302:421a:2eс5:40a4::1

Автоматическая настройка

Для целей автоматической раздачи устройствам в домашней сети IPv6-адресов из /64-подсети можно использовать демон radvd (router advertisement daemon).

Примеры конфигурации демона radvd:

interface eth0
{
     AdvSendAdvert on;
     AdvDefaultLifetime 0;
     prefix 300:1111:2222:3333::/64 {
         AdvOnLink on;
         AdvAutonomous on;
     };
     route 200::/7 {};
};
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 {};" не требуется.
     };
     RDNSS 300:1111::53 {}; # Необязательно (задает рекурсивный DNS-сервер)
};

Здесь 300:1111:2222:3333::/64 - префикc вашей подсети («выдается» вместе с IPv6 адресом, привязанным к ключу в конфигурационном файле Yggdrasil).

Примечание: по этой ссылке можно прочесть о том, анонсируется маршрут-поумолчанию без radvd (на OpenWrt).

Для корректной работы маршрутизации через устройство, на котором установлен Yggdrasil на нем должна быть разрешена маршутизация IPv6-пакетов:

sudo sysctl -w net.ipv6.conf.all.forwarding=1

net.ipv6.conf.all.forwarding=1 нужно раскомментировать в /etc/sysctl.conf

То же самое, но без использования radvd

Допустим, у вас есть роутер, где LAN является сетевым интерфейсом br0, а Yggdrasil - ygg0.

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

Обратите внимание на эти команды. Наиболее лучшим решением будет добавление ipv6 адресов через конфигурационные файлы системы или заранее подготовленный скрипт.

Более подробный пример для систем c OpenRC

На операционных системах c OpenRC (например, Gentoo) у вас есть возможность дополнительно запускать свои собственные скрипты. При каждом запуске сервиса local - будет запускаться скрипт yggdrasil.start. Подробнее: https://wiki.gentoo.org/wiki//etc/local.d

# rc-service local restart
 * Stopping local ...
 *   Executing "/etc/local.d/yggdrasil.stop" ...                          [ ok ]
 * Starting local ...
 *   Executing "/etc/local.d/yggdrasil.start" ...                         [ ok ]

/etc/local.d/yggdrasil.start

yggdrasil.start
#!/bin/bash
 
# Возможно, вы захотите очистить лог
> /var/log/yggdrasil.stdout.log
 
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

Можно дополнительно создать срипт /etc/local.d/yggdrasil.stop, который будет удалять добавленные адреса, но он не особо то и нужен. Учтите, при перезапуске интерфейса br0 он снова сбросится к стандартным настройкам.

rc-service net.br0 restart

Это можно исправить несолькими способами: 1. снова перезапустив сервис local 2. перезапустив сам скрипт /etc/local.d/yggdrasil.start 3. или, для автоматизации, добавив в файл /etc/conf.d/net вот таую конструкцю, которая сама запустит скрипт при поднятии интерфейса br0

postup() {
  if [ "${IFACE}" = "br0" ]
  then
     #rc-service local restart
     /etc/local.d/yggdrasil.start
  fi
  return 0
}

На данном этапе вы уже можете посетить сайты сети Yggdrasil через консоль роутера. Убедитесь, что это работает.

# Используя консольный браузер
lynx http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/
# Или вот так
curl http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/

Теперь настройте DHCPv6, чтобы раздать адреса на интерфейс br0.

Допишите в файл /etc/dnsmasq.conf

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 # Автоматическое получение адресов (DHCP). Не забудьте заменить 300:1111:2222:3333:: из примера на правильный адрес, полученный при запуске команды yggdrasilctl -v getSelf
dhcp-range=br0,fdb7:e5e:e3a9:f2d1::,ra-stateless,72h # ULA DHCP

# Пример настройи 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

Обязательно перезапустите dnsmasq.

Вариант 2: использование прокси-сервера

Yggdrasil устанавливается на одном единственном компьютере. Лучше, если это будет домашний сервер, который никогда не выключается. На этом сервере нужно поставить прокси (http или socks), тогда вы сможете заходить через этот прокси в сеть, используя веб-браузер. А если ваш сервер виден из внешнего мира, то вы сможете выходить в сеть вообще отовсюду. Не забудьте только повесить прокси на нестандартном порту и жестко ограничить IP, с которых предполагается туда заходить. Например, только из дома и только с работы. Если у вас есть доступ по ssh к собственному серверу (так обычно и бывает), то список разрешенных IP можно гибко менять при необходимости. Ведь вы можете оказаться в гостинице, в отпуске на Багамах, в командировке и т.д. Имейте в виду, что c клиента трафик до прокси-сервера будет идти в открытом виде.

Используя какой-нибудь проксификатор (Proxifier) или что-то вроде Tun2Socks можно не только посещать сайты в сети Yggdrasil, настроив соединение через прокси-сервер, но и дать возможность практически любым приложениям (не поддерживающим соединение через прокси-сервер) работать через прокси-сервер.

Пример конфигурации простейшего 3proxy:

log NUL D
internal 127.0.0.1
auth none
flush
socks -46 -p3229 -i91.233.111.15

91.233.111.15 - адрес, на котором будет ждать подключений socks-прокси (может быть в локальной сети (192.168.x.x))
3229 - порт, на котором будет ждать подключений socks-прокси

Используя PAC-файл можно настроить браузер так, чтобы запросы на адреса Yggdrasil / ALFIS шли через прокси, а всё остальное - напрямую. Пример подобного PAC-файла можно найти здесь. Подробнее о PAC можно прочесть здесь.

Вариант 3: маршрутизация через VPN-сервер

Некоторые пользователи устанавливают Yggdrasil на свой VPN-сервер и маршрутизируют трафик в Yggdrasil через него. В качестве серверного ПО VPN-сервера может использоваться OpenVPN или WireGuard. На сервере должна быть включена маршутизация пакетов (в /etc/sysctl.conf):

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Т.о., подключаясь к VPN-серверу, клиент получает доступ и в Интернет, и в Yggdrasil.

Пример конфигурации WireGuard на сервере:

[Interface]
Address = 10.0.0.1/24, fd00::1/124
PrivateKey = 6EwVi06HBT/DdmYSM8QZv554OoE3mk0vxC3DdlVW/nc= 
ListenPort = 51820
#IPv6 and IPv4
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -o %i -j ACCEPT; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE; ip6tables -A FORWARD -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -o %i -j ACCEPT; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o tun0 -j MASQUERADE; ip6tables -D FORWARD -o %i -j ACCEPT

[Peer]
PublicKey = cyP3jP+Xwbp84kUxct6TGXx8rM1xFCVOBn8Z4m+vLxE=
AllowedIPs = 10.0.0.2/32, fd00::2/128

#...

На клиенте:

[Interface]
Address = 10.0.0.2/24, fd00::2/124
PrivateKey = rOZrd1oaoYAFOd0CPBkXhsvfzPrMj79aIQ0THswGsv7=
DNS = 94.140.14.14, 94.140.15.15

[Peer]
PublicKey = Rgh78oSDafr2sNv6cp/vBDlaiuVCi2DtCduU0mmcHpo=
Endpoint = xxx.xxx.xxx.xxx:51820
#Все IPv4 и только Yggdrasil-IPv6
AllowedIPs = 0.0.0.0/0, 200::/7
#или так (все IPv4 и все IPv6):
#AllowedIPs = 0.0.0.0/0, ::/0

Для того, чтобы через туннель работало разрешение имен ALFIS, можно установить ALFIS на сервере или использовать один из публичных серверов и на клиенте, в конфигурационном файле wireguard, в строке, начинающейся с DNS =, указать адрес резолвера/сервера ALFIS.

Примечание: при такой конфигурации, чтобы работало обычное соединение по IPv6, нужно наличие «настоящего» IPv6 на сервере, и для него (для нужного интерфейса) нужно будет добавить маскарадинг в PostUp = и PostDown =. Подробнее здесь: Простой VPN-сервер

Ссылки

Конфигурация Yggdrasil, описание префикса адреса (EN): https://yggdrasil-network.github.io/configuration.html
Configuring Yggdrasil with systemd-networkd (EN): https://tdem.in/post/yggdrasil-systemd/

Обсуждение

Dennis Babkin, 2022/02/04 14:48, 2022/02/04 15:45

Подправьте пожалуйста пример radvd.conf :-) Ваш пример нормально работает только с Linux-клиентами. А конфиг подобный этому нормально работает не только с Linux-клиентами но и с Windows и Android.

interface eth0
{
     AdvSendAdvert on;
     AdvLinkMTU 1280; # без этой строчки сбоит подключение для windows-устройств
     MinRtrAdvInterval 30;
     MaxRtrAdvInterval 100;
     prefix 300:1111:2222:3333::/64 {
         AdvOnLink on;
         AdvAutonomous on;
         AdvRouterAddr on; # Без этой строки подключаются не все android-устройства!   Строка "route 200::/7 {};" не требуется.
     };
     RDNSS 300:1111::53 {}; # Строчка необязательная :-)
};
Thunar, 2022/02/04 16:23

Добавил ваш конфиг в статью 👌

S.V.D., 2022/09/19 15:47, 2022/09/19 16:11
Для случая когда роутер - Mikrotik, можно всю маршрутизацию настроить там
Для соответствия исходному мануалу(все настройки распберри производим по нему) преположим, что
tun0 на распберри получил адрес 200:1111:2222:3333:4444:5555:6666:7777
Тогда на микротике создаём пул
/ipv6 pool
add name=yggdrassil prefix=300:1111:2222:3333::/64 prefix-length=64
Из этого пула добавляем адрес на интерфейс, соединяющий нашу локалку (bridge) с включённой раздачей префикса. Т.о. все устройства, поддерживающие ipv6 и подключённые к роутеру получат адрес с префиксом 300:1111:2222:3333::/64
/ipv6 address
add address=::/64 eui-64=yes from-pool=yggdrassil interface=bridge
Дальше ходим на распберри и смотрим, какой адрес он получил
ip -6 addr show dev eth0
Адрес не должен поменяться до переустановки ОС(в теории, т.к. генерится по формуле относительно DUID который в случае debian прихранивается по пути /var/lib/dhcpcd/duid)
Предположим что 300:1111:2222:3333:aaaa:bbbb:cccc:dddd
Добавляем роут в сеть Yggdrasil (гейтвеем служит наша пиха)
/ipv6 route
add disabled=no distance=1 dst-address=200::/7 gateway=300:1111:2222:3333:aaaa:bbbb:cccc:dddd routing-table=main scope=30 \
target-scope=10
Добавляем правило маскарадинга
/ipv6 firewall nat
add action=masquerade chain=srcnat dst-address=200::/7
И не забываем прикрыться файерволом
/ipv6 firewall filter
add action=accept chain=forward comment="Yggdrassil: accept established,related,untracked" connection-state=\
established,related,untracked out-interface=bridge src-address=200::/7
add action=accept chain=forward comment="Yggdrassil: accept local " out-interface=bridge src-address=300:1111:2222:3333::/64
add action=accept chain=input comment="Yggdrassil: accept established,related,untracked" connection-state=\
established,related,untracked src-address=200::/7
add action=accept chain=input comment="Yggdrassil: accept local" src-address=300:1111:2222:3333::/64
add action=drop chain=forward comment="Yggdrassil: bloack everything else" out-interface=bridge src-address=200::/7
add action=drop chain=input comment="Yggdrassil: bloack everything else" src-address=200::/7


Также в случае если на пихе поднять alfis можно настроить резолвинг доменов из пула yggdrasil через него, а все остальные DNS запросы пускать через обычные DNS-ы
(микротик должен быть настроен как dns сервер на всех устройствах)
Добавляем layerv7 фильтр
/ip firewall layer7-protocol
add name=ALFIS regexp="\\x04anon.\\x01|\\x03btn.\\x01|\\x04conf.\\x01|\\x05index.\\x01|\\x05merch.\\x01|\\x06mirror.\\x01|\\x03\
mob.\\x01|\\x06screen.\\x01|\\x03srv.\\x01|\\x03ygg.\\x01"
Логика простая:
\x04anon.\x01
\x04 - длина (в данном случае 4)
anon - фильтруемы домен
.\x01 - тут должно быть \x00\x01 но у микротиков есть ограничение на использование NULL в регулярках. Так что вот такой костыль

Добавляем правило mangle для пометки пакетов, содержащих DNS запросы до искомых доменов
/ip firewall mangle
add action=mark-packet chain=prerouting comment=ALFIS dst-address-type=local dst-port=53 layer7-protocol=ALFIS \
new-packet-mark=ALFIS passthrough=yes protocol=udp
Добавляем заворот этих пакетов на адрес пихи
/ip firewall nat
add action=dst-nat chain=dstnat comment="ALFIS DNS" dst-port=53 packet-mark=ALFIS protocol=udp to-addresses=192.168.88.53 \
to-ports=53
Где 192.168.88.53 - адрес нашей пихи. На самой пихе настраиваем для alfis биндинг на этот адрес(или на 0.0.0.0)
newbie, 2022/09/19 20:38
А в RouterOS Yggdrasil можно установить?
Может, отдельную статью создадите про установку Yggdrasil в MikroTik, ну, и настройку всего этого? ;)
S.V.D., 2022/09/19 23:15
В теории можно и прямо в микротик, ROS7 поддерживает контейнеры, но лично я пока не обмазывался. Всё таки памяти даже в AC3 достаточно мало(а это чуть не самая жирная железка для домашнего сегмента на текущий момент. Больше только в RB4011, но это уже решения для нормального такого офиса, дома им делать нечего). И это не считая того что контейнеры поддерживают сейчас всего несколько моделей(ЕМНИП AC2(но с его 128Мб RAM это очень сомнительная перспектива), AC3, RB4011 и Audience. Ну и X86 решения, но это совсем не домашний сегмент). И ещё того что на офсайте висит предупреждение, что контейнеры - на свой страх и риск и за возникшие дыры в безопасности никто ответственности не несёт(А безопасность - это хорошо, мы любим безопасность). Сателлитный одноплатник на мой сугубо личный вкус выглядит более дешёвым и удобным решением. Но если руки дойдут - сделаю.
В текущем же варианте на мой сугубо личный вкус данная инструкция решает именно заявленную в статье задачу - т.е. подключение к Yggdrasil со всех устройств локалки без установки на каждое устройство.
newbie, 2022/09/19 23:28
Ок. Я сам с микротиками не сталкивался и не знаю всех особенностей и подводных камней. Спасибо, что немного просветили :)
По поводу статьи я, конечно, не настаиваю, просто подумал, о статье (или даже разделе), т.к. они [микротики] имеют некоторую специфику в конфигурировании, и ваш комментарий мог бы быть неплохим началом для этого…
В общем, на ваше усмотрение ;)
S.V.D., 2022/09/19 23:39
Я сам не сетевик по профессии, могу тоже что-то упускать. Да и вообще не факт что микроты сохранят свою популярность в РФ, т.к. это всегда была такая "циска для экономных". С новыми же ценами... если бы у меня уже давно всё на них не было построено - даже бы и не посмотрел в их сторону, собирал бы решение на x86 + pfsense либо на той же openwrt. Ка-то так.
newbie, 2022/09/20 00:09
По поводу «не сетевик»: мы тут просто сообщество пользователей Yggdrasil, и просто делимся знаниями между собой. Делимся и в то же время узнаём что-то новое для себя. Ну, по крайней мере, так задумывалось :) Так что стесняться не стоит. Для кого-то может быть полезным то, что пишем…
Только авторизованные участники могут оставлять комментарии.
yggdrasil/network_connection_variants.txt · Последние изменения: 2022/11/08 14:28 — Мастер Пушистый
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki