====== Cryptokey Routing ====== ^ :!: Обратите внимание ^ | В статье описывается механизм [[https://yggdrasil-network.github.io/2018/11/06/crypto-key-routing.html|Crypto-Key Routing]], предназначавшийся для создания «нативных» туннелей «поверх» [[yggdrasil:yggdrasil|Yggdrasil]], похожих на туннели [[:wireguard|Wireguard]]. Данный механизм [[https://yggdrasil-network.github.io/2021/06/19/preparing-for-v0-4.html|был удален]] из Yggdrasil версии 0.4. Т.о., данная статья частично потеряла актуальность. В конфигурационном файле Yggdrasil больше нет возможности настроить маршрутизацию. Вместо этого разработчики рекомендуют использовать [[yggdrasil:tunnels:gre-tunnel|GRE]], [[wpru>IP_in_IP|IPIP]], [[:wireguard|WireGuard]] и другие технологии, назначая IP-адреса Yggdrasil в качестве адресов конечных точек туннелей. \\ \\ Описанная ниже возможность туннелирования трафика осталась в альтернативной версии Yggdrasil от одного из разработчиков [[https://github.com/neilalexander|@neilalexander]]: https://github.com/neilalexander/yggdrasilckr \\ \\ Так же, CKR был восстановлен в [[wpru>Форк|форке]] Yggdrasil [[yggdrasil:alt_clients:riv-mesh|RiV-mesh]] и присутствует там по настоящее время. | Как известно, [[yggdrasil:yggdrasil|Yggdrasil]] позволяет дополнительную маршрутизацию IPv4 и IPv6 сетей, помимо сети 0200::/7. Т.е. позволяет “пробросить” любые подсети через сеть Yggdrasil между двумя хостами. Тут описывается, как это сделать на Linux-машинах. Скажем, у нас есть схема ниже и нужно через Ygg-туннель наладить связь между хостами А (интерфейс lo с адресом 172.20.18.97/28) и С (интерфес ens18 с адресом 10.0.0.5/24). Хосты B и C в одной локальной сети, а по Yggdrasil есть связь между хостами А и B. {{:ygg_aux_routing.png?700}} ===== Настройка ===== **На узле A** Часть конфигурации в Yggdrasil, которая отвечает за дополнительную маршрутизацию, находится в секции //TunnelRouting//. Рассмотрим конфиг на стороне узла A: TunnelRouting: { Enable: true IPv6RemoteSubnets: {} IPv6LocalSubnets: [] IPv4RemoteSubnets: { 10.0.0.5/32: ca68ae394a1c03bd65642c5da9f28195650e576dceeec5165a12d2d1a62f2c15 } IPv4LocalSubnets: [ 172.20.18.97/32 ] } __По пунктам:__ * Enable - для включения дополнительной маршрутизации нужно поставить в true. * IPv6RemoteSubnets - удаленные IPv6-сети, которые нужно маршрутизировать через ygg. Заполняется в виде сеть/маска: EncryptionPublicKey. То, что тут не заполнено, не будет маршрутизироваться через ygg. * IPv6LocalSubnets - локальные IPv6-сети, которые нужно принимать через ygg. Заполняется в виде сеть/маска. То, что тут не заполнено, будет отброшено. * IPv4RemoteSubnets - удаленные IPv4-сети, которые нужно маршрутизировать через ygg. Заполняется в виде сеть/маска: EncryptionPublicKey. То, что тут не заполнено, не будет маршрутизироваться через ygg. * IPv4LocalSubnets - локальные IPv4-сети, которые нужно принимать через ygg. Заполняется в виде сеть/маска. То, что тут не заполнено, будет отброшено. __Более конкретно:__ IPv4RemoteSubnets: { 10.0.0.5/32: ca68ae394a1c03bd65642c5da9f28195650e576dceeec5165a12d2d1a62f2c15 } * 10.0.0.5/32 - сеть, которую необходимо маршрутизаровать через Yggdrasil в сторону определенного узла. В нашем случае это только один хост 10.0.0.5. * ca68ae394a1c03bd65642c5da9f28195650e576dceeec5165a12d2d1a62f2c15 - EncryptionPublicKey удаленного узла, в сторону которого маршрузируется IPv4-сеть. В нашем случае это EncryptionPublicKey узла B, который можно посмореть в конфиге на узле B. IPv4LocalSubnets: [ 172.20.18.97/32 ] 172.20.18.97/32 - это адрес, который есть на интефейсe lo на узле A. ~# ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 172.20.18.97/28 brd 172.20.18.111 scope global lo:42 valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever Вроде бы на стороне узла A все настроено, но только вот маршрутизатор системы ничего про какую-то там маршрутизацию в Yggdrasil сам не знает, поэтому для “пробрасываемых” сетей еще необходимо добавлять маршруты прямо в туннельный интерфейс Yggdrail. Один из вариантов, как это сделать: ip route add 10.0.0.5/32 dev tun-ygg Где, * ip route add - команда для добавления маршрута; * 10.0.0.5/32 - наш пробрасываемый хост; * dev tun-ygg - указывает, что хост доступен через интерфейс tun-ygg. В вашем случае название интерфейса для Yggddrail может быть другой. Не забываем перезапустить Yggdrasil, чтобы настройки пришли в силу. **На узле B** Теперь переходим к узлу B.\\ На этой стороне по сути своей конфигурация будет зеркальной и выглядеть так: TunnelRouting: { Enable: true IPv6RemoteSubnets: {} IPv6LocalSubnets: [] IPv4RemoteSubnets: { 172.20.18.97/32: 06aac0753717863b01e4ceac0467e72ba168d42dc1c06ff338acf866a3ee9b6b } [ 10.0.0.5/32 ] } Маршрут добавляется так же зеркально: ip route add 172.20.18.97/32 dev tun-ygg Единственно, что нужно на этом узле вспомнить, что он будет не передавать/принимать пакеты от себя, а маршрутировать между интейфейсами ens18 и tun-ygg, поэтому **должна быть включена IPv4 и/или IPv6 маршуратизация**. Обычно на Linux-машинах это включается в файле /etc/sysctl.conf. # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 # sysctl net.ipv6.conf.all.forwarding net.ipv6.conf.all.forwarding = 1 Если на машине настроен iptables, то посмотрите нет ли ограничений в цепочке FORWARD. Не забываем перезапустить Yggdrasil, чтобы настройки пришли в силу. **На узле С** Тут все совсем просто. Нужно просто указать, что хост A находится за узлом B: ip route add 172.20.18.97/32 via 10.0.0.10 ===== Какие могут быть проблемы ===== Самое неприятное, что может быть - это добавление маршрутов при старте Yggdrasil. Есть несколько вариантов, но проще всего в юните systemd для Yggdrail сделать что-то вроде такого: ExecStart=/usr/bin/yggdrasil -useconffile /etc/yggdrasil.conf && /sbin/ip route add 10.0.0.5/32 dev tun-ygg Т.е. после старта самого Yggdrail, будет добавлен маршрут в туннельный интерфейс. Только вот тогда и Yggdrasil должен либо стартовать под рутом, либо юзер, под которым он стартует, должен иметь разрешение на добавление маршрутов. Не забывайте проверять iptables, если он есть, после добавления новых маршрутов. ===== Как еще использовать? ===== Собственно, Yggdrasil можно использовать как полноценный VPN, достаточно пробросить маршрут 0.0.0.0/0 и на стороне узла-выхода в Интернет настроить NAT. Отдельные IPv4-адреса и сети между узлами можно пробросить для приложений, которые не “понимают” IPv6. Например, это может быть замена Hamachi для онлайн-игр. Только не RealTime-игр, потому что задержки и джиттер через ygg могут быть ужасными. ====== Ссылки ====== Crypto-Key Routing (EN): https://yggdrasil-network.github.io/2018/11/06/crypto-key-routing.html ~~DISCUSSION~~