Разработчики Yggdrasil рекомендуют устанавливать клиент Yggdrasil на каждое устройство, которому нужен доступ в эту сеть. При этом гарантируется сквозное шифрование трафика между узлами, и каждый узел сети сможет выполнять роль маршрутизатора. Однако не во всех сетевых устройствах есть возможность установки и запуска Yggdrasil.
Если устройство поддерживает протокол 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
О возможностях автоматического добавления адресов Yggdrasil после перезагрузки устройства читайте в статье: Адрес из подсети 300::/64
Для целей автоматической раздачи устройствам в домашней сети 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
Допустим, у вас есть роутер, где 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 адресов через конфигурационные файлы системы или заранее подготовленный скрипт. В примере также добавлен ULA (fdb7:e5e:e3a9:f2d1::). Не обязательно использовать именно этот префикс. Вы можете сгенерировать свой https://unique-local-ipv6.com/
На операционных системах 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
#!/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
Можно дополнительно создать срипт /etc/local.d/yggdrasil.stop, который будет удалять добавленные адреса, но он не особо то и нужен. Учтите, при перезапуске интерфейса br0 он снова сбросится к стандартным настройкам.
rc-service net.br0 restart
Это можно исправить несолькими способами:
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 (для понимания, 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 # YGG DHCP - Автоматическое получение адресов (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 # В данной конфигуации вы также можете использовать 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
После внесения правок перезапустите dnsmasq.
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 шли через прокси, а всё остальное - напрямую.
function FindProxyForURL(url, host) { if (/^0{0,1}[2-3][a-f0-9]{0,2}:/.test(host) || /\.ygg$/.test(host)) { return 'SOCKS5 127.0.0.1:1080; DIRECT'; } }
В настройках Firefox или Thunderbird (Automatic proxy configuration URL) указываем соответствующий путь: file:///path/to/proxy.pac
Пример подобного PAC-файла можно найти здесь. Подробнее о PAC можно прочесть здесь.
Некоторые пользователи устанавливают 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-сервер
Это еще один вариант с использованием отдельностоящего сервера в качестве VPN.
Данный вариант инетерсен тем, что у ZeroTier есть клиент подо все популярные операционные системы и мобильные платформы.
Собственно, на этом всё. Теперь на любое устройство/компьютер можно поставить клиент 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/
Несколько видеороликов о ZeroTier: https://youtube.com/playlist?list=PLsx5L3jlBQgp7vCU66yTcofX3pXaBBoER&si=w56vBoDDYd9Sm19z
Обсуждение
Для соответствия исходному мануалу(все настройки распберри производим по нему) преположим, что
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)
UPD
Маленькое дополнение. На свежих ядрах
net.ipv6.conf.all.forwarding=1
отключет получение v6 адреса с роутера.
Поэтому в sysctl.conf надо добавлять так
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.eth0.accept_ra=2
Где eth0 - имя сетевого интерфейса
Может, отдельную статью создадите про установку Yggdrasil в MikroTik, ну, и настройку всего этого? ;)
В текущем же варианте на мой сугубо личный вкус данная инструкция решает именно заявленную в статье задачу - т.е. подключение к Yggdrasil со всех устройств локалки без установки на каждое устройство.
По поводу статьи я, конечно, не настаиваю, просто подумал, о статье (или даже разделе), т.к. они [микротики] имеют некоторую специфику в конфигурировании, и ваш комментарий мог бы быть неплохим началом для этого…
В общем, на ваше усмотрение ;)
Система - Debian 12, странно, может чего намудрил и не туда замаршрутил раньше, т.к. сервисов много
А как оно отсекает сторонние подключения? Получается только по интерфейсу с Eth0 (то есть сторонний трафик с ygg0 не будет идти) - паранойя