howto-db/data/pages/yggdrasil/route_with_old_kernel.txt
2024-02-10 12:53:55 +00:00

134 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

====== Маршрутизация из подсети 0300::/64 на старом устройстве ======
Есть у меня дома старенький [[wpru>NAS|NAS]] от Synology - DS213air c [[wpru>Synology_Inc.#Synology_DiskStation_Manager_(DSM)|DSM 6.2]] и ядром Linux 2.6.32.12.
Обновления DSM для этой модели уже давно не выпускаются, за исключением патчей, закрывающих критические уязвимости, и ядро там навсегда останется версии 2.6.
На NAS'е крутятся [[wpru>Transmission|Transmission]], FTP и прочие полезные в хозяйстве сервисы.
И вот задумал я подключить этот NAS к [[Yggdrasil:yggdrasil]].
Запустить сам Yggdrasil там не составляет больших проблем: достаточно скачать бинарник под нужную архитектуру процессора (armel (ARM v.5T emulated) в моём случае), написать небольший скриптик для запуска, ну и добавить этот скрипт в планировщик задач DSM c событием "Загрузка".
Если кому интересно под спойлером скрипт запуска:
<details>
<summary>Мой скрипт запуска Yggdrasil на NAS</summary>
\\
Скрипт помещается туда, где есть бинарник Yggdrasil. Или наоборот: бинарник с конфигом помещаются туда, где находится скрипт :)
<file sh startYgg.sh>
#!/bin/bash
if [[ ! $(whoami) =~ "root" ]]; then
echo "This should be run as root"
exit
fi
cd $(dirname "$0")
# Create the necessary file structure for /dev/net/tun
if ( [ ! -c /dev/net/tun ] ); then
if ( [ ! -d /dev/net ] ); then
mkdir -m 755 /dev/net
fi
mknod /dev/net/tun c 10 200
fi
# Load the tun module if not already loaded
if ( !(lsmod | grep -q "^tun\s") ); then
insmod /lib/modules/tun.ko
fi
./yggdrasil -useconffile ./yggdrasil.conf &
</file></details>
\\ Однако, процессор там MARVELL Kirkwood 88F6282 с тактовой частотой 1.6 GHz, памяти всего 256 мб и мне не хотелось расходовать эти ресурсы на Yggdrasil, ведь у нас есть целая подсеть 0300::/64, благодаря которой мы можем [легким движением руки ([[https://yggdrasil-network.github.io/configuration.html#advertising-a-prefix|по заверению разработчиков]])] подключить к сети другие домашние устройства, не устанавливая на них сам Yggdrasil.
Открыл статью "[[yggdrasil:network_connection_variants]]" и начал повторять "Пример ручной настройки" (у меня тоже [[wpru>Raspberri_Pi|RaspberriPi]] есть).
И вот на этапе 4. "Прописывам маршрут" возникли сложности. На все мои попытки добавить маршрут система настойчиво отвечала: **RTNETLINK answers: Invalid argument** (к слову, в случае с моим NAS этапов было больше, чем в этой статье, но об этом позже).
Погуглив немного, я понял, что с такой проблемой сталкиваются люди, использующие адреса из Reserved или Deprecated диапазонов адресов IPv6, и именно на старых ядрах Linux. На актуальных ядрах такой проблемы не наблюдается. Вероятно, в прошлом, были более жесткие проверки корректности IPv6-адресов. Интересно, что назначать IP-адреса из этих диапазонов на интерфейсы можно, но использовать их в качестве шлюзов - нельзя ([[https://www.spinics.net/lists/netdev/msg80438.html|вот]] пример такой проблемы от 2008 года (тогда еще актуальным было ядро 2.6)). А мне-то как раз шлюз такой и нужно было указать...
Ну, и всем известно, что Yggdrasil использует именно [[http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml|Deprecated дианазон 0200::/7]] (что по [[https://yggdrasil-network.github.io/faq.html#will-yggdrasil-conflict-with-my-network-routing|мнению разработчиков]] должно облегчить настройку и свести к минимуму возможные конфликты с другими сетями).
Собственно, ответ на описание проблемы по одной из приведенных выше ссылок подсказывает решение. И то же самое мне посоветовали в канале [[https://matrix.to/#/!vVtVcVdzAdhGFLzFwm:matrix.org/$L7YzjBL86jlCJgBymRP-AatpVEz_5fyR_n-qL1vTwsk?via=matrix.org&via=envs.net&via=tchncs.de|#yggdrasil:matrix.org]].
Можно | нужно (нужное можно подчеркнуть) в качестве шлюза использовать [[wp>Unique_local_address|ULA]] и настроить т.н. 1:1 NAT.
Да, это костыль, но это работает :) И спасибо разработчикам Yggdrasil за выбор такого диапазона для адресации в Yggdrasil.
Ниже по шагам опишу, всё, что нужно сделать в таком случае, как мой...
===== Настройка маршрутизации =====
**Исходные данные**
На RaspberriPi установлен Yggdrasil; адрес: ''%%200:32e:cfa4:1c08:758c:5bdf:e04c:8a80%%''; подсеть: ''%%300:32e:cfa4:1c08::/64%%'' (адреса для примера).
И RaspberriPi и NAS подключены к локалке шнурками через одноименные интерфейсы ''%%eth0%%''.
**1. Подключаемся к NAS по [[wpru>SSH|SSH]], включаем поддержку IPv6, добавляем на интерфейс адреса и маршрут:**
Для удобства сразу войдем с правами суперпользователя:
<code>sudo su</code>
Включаем IPv6:
<code>sysctl net.ipv6.conf.all.disable_ipv6=0
sysctl net.ipv6.conf.default.disable_ipv6=0
sysctl net.ipv6.conf.lo.disable_ipv6=0
sysctl net.ipv6.conf.eth0.disable_ipv6=0</code>
Добавляем адреса:
<code>ip -6 address add 300:32e:cfa4:1c08::6/64 dev eth0
ip -6 address add fd01::6/124 dev eth0</code>
Первый адрес - это будет адрес NAS в Yggdrasil (он из маршрутизируемой подсети 0300::/64) \\
Второй адрес - это ULA (аналог приватных IPv4 адресов). Маску можете рассчитать сами исходя из своих нужд, воспользовавшись [[https://shootnick.ru/ip6_calc/|каким-нибудь]] калькулятором.
Теперь сразу пропишем маршрут через шлюз, которого пока нет (будет на RaspberriPi):
<code>ip -6 route add 0200::/7 via fd01::1 dev eth0 metric 50 hoplimit 2</code>
Команда отработала успешно. И то, что эта же команда с адресом из диапазона 0300::/64 (входит в 0200::/7) завершалась ошибкой, подтверждает, что в этом ядре реализована более жесткая проверка валидности IPv6 адресов.
**2. Настройка RapberriPi в качаестве шлюза**
Так же, подключаемся по SSH (хотя, может кто-то использует там полноценную [[wpru>Raspberry_Pi_OS|Raspberry Pi OS]] c графическим окружением, не суть), входим под root:
<code>sudo -i</code>
Включаем пересылку пакетов между интерфейсами:
<code>sysctl -w net.ipv6.conf.all.forwarding=1</code>
Если этого не сделать, ничего работать не будет. Ведь, нам нужно пересылать пакеты с ''%%eth0%%'' на ''%%tun%%'' (туннельный интерфейс Yggdrasil).
Добавляем адреса:
<code>ip address add 300:32e:cfa4:1c08::1/64 dev eth0
ip address add fd01::1/124 dev eth0</code>
Первый адрес из подсети 0300::/64, второй - ULA.
Добавлям маршрут к NAS через eth0:
<code>ip route add 320:9c1:e1fa:a105::6 dev eth0 metric 50 hoplimit 1</code>
Если не установлен iptables, устанавливаем и прописываем правила (тем, кому больше нравится nftables - у вас правила по-своему пишутся):
<code>ip6tables -t nat -A POSTROUTING -o eth0 -s fd01::6 -j SNAT --to-source 300:32e:cfa4:1c08::6
ip6tables -t nat -A PREROUTING -i eth0 -d 300:32e:cfa4:1c08::6 -j DNAT --to-destination fd01::6
ip6tables -A FORWARD -s 300:32e:cfa4:1c08::6 -j ACCEPT
ip6tables -A FORWARD -d fd01::6 -j ACCEPT</code>
Можно проверить добавленное:
<code>ip6tables -L
ip6tables -t nat -L</code>
Это и есть реализация 1:1 NAT, которое по-сути заключается в подмене адресов назначения и источника.
**На этом всё.** NAS имеет адрес ''%%300:32e:cfa4:1c08::6%%'' и после проделанного доступен из сети Yggdrasil и сам имеет доступ в эту сеть.
Осталось прикрыть на NAS порты, доступ к которым предоставлять всей сети было бы слишком щедро и доверчиво и еще раз проверить, что доступно на RaspberriPi по адресам ''%%300:32e:cfa4:1c08::1%%'' и ''%%fd01::1%%''.
Сделать так, чтобы все эти настройки сохранялись между перезагрузками, надеюсь, сможете самостоятельно ;)
====== Ссылки ======
Iptables 1:1 NAT (EN): https://www.qsl.net/kb9mwr/wapr/tcpip/1to1nat.html \\
~~DISCUSSION~~