Маршрутизация из подсети 0300::/64 на старом устройстве

Есть у меня дома старенький NAS от Synology - DS213air c DSM 6.2 и ядром Linux 2.6.32.12.

Обновления DSM для этой модели уже давно не выпускаются, за исключением патчей, закрывающих критические уязвимости, и ядро там навсегда останется версии 2.6.

На NAS'е крутятся Transmission, FTP и прочие полезные в хозяйстве сервисы.

И вот задумал я подключить этот NAS к Yggdrasil.

Запустить сам Yggdrasil там не составляет больших проблем: достаточно скачать бинарник под нужную архитектуру процессора (armel (ARM v.5T emulated) в моём случае), написать небольший скриптик для запуска, ну и добавить этот скрипт в планировщик задач DSM c событием «Загрузка».

Если кому интересно под спойлером скрипт запуска:

Мой скрипт запуска Yggdrasil на NAS


Скрипт помещается туда, где есть бинарник Yggdrasil. Или наоборот: бинарник с конфигом помещаются туда, где находится скрипт :)

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 &


Однако, процессор там MARVELL Kirkwood 88F6282 с тактовой частотой 1.6 GHz, памяти всего 256 мб и мне не хотелось расходовать эти ресурсы на Yggdrasil, ведь у нас есть целая подсеть 0300::/64, благодаря которой мы можем [легким движением руки (по заверению разработчиков)] подключить к сети другие домашние устройства, не устанавливая на них сам Yggdrasil.

Открыл статью «Как подключиться к Yggdrasil, не устанавливая его клиент на устройство» и начал повторять «Пример ручной настройки» (у меня тоже RaspberriPi есть).

И вот на этапе 4. «Прописывам маршрут» возникли сложности. На все мои попытки добавить маршрут система настойчиво отвечала: RTNETLINK answers: Invalid argument (к слову, в случае с моим NAS этапов было больше, чем в этой статье, но об этом позже).

Погуглив немного, я понял, что с такой проблемой сталкиваются люди, использующие адреса из Reserved или Deprecated диапазонов адресов IPv6, и именно на старых ядрах Linux. На актуальных ядрах такой проблемы не наблюдается. Вероятно, в прошлом, были более жесткие проверки корректности IPv6-адресов. Интересно, что назначать IP-адреса из этих диапазонов на интерфейсы можно, но использовать их в качестве шлюзов - нельзя (вот пример такой проблемы от 2008 года (тогда еще актуальным было ядро 2.6)). А мне-то как раз шлюз такой и нужно было указать…

Ну, и всем известно, что Yggdrasil использует именно Deprecated дианазон 0200::/7 (что по мнению разработчиков должно облегчить настройку и свести к минимуму возможные конфликты с другими сетями).

Собственно, ответ на описание проблемы по одной из приведенных выше ссылок подсказывает решение. И то же самое мне посоветовали в канале #yggdrasil:matrix.org.

Можно | нужно (нужное можно подчеркнуть) в качестве шлюза использовать 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 по SSH, включаем поддержку IPv6, добавляем на интерфейс адреса и маршрут:

Для удобства сразу войдем с правами суперпользователя:

sudo su

Включаем IPv6:

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

Добавляем адреса:

ip -6 address add 300:32e:cfa4:1c08::6/64 dev eth0
ip -6 address add fd01::6/124 dev eth0

Первый адрес - это будет адрес NAS в Yggdrasil (он из маршрутизируемой подсети 0300::/64)
Второй адрес - это ULA (аналог приватных IPv4 адресов). Маску можете рассчитать сами исходя из своих нужд, воспользовавшись каким-нибудь калькулятором.

Теперь сразу пропишем маршрут через шлюз, которого пока нет (будет на RaspberriPi):

ip -6 route add 200::/7 via fd01::1 dev eth0

Команда отработала успешно. И то, что эта же команда с адресом из диапазона 0300::/64 (входит в 0200::/7) завершалась ошибкой, подтверждает, что в этом ядре реализована более жесткая проверка валидности IPv6 адресов.

2. Настройка RapberriPi в качаестве шлюза

Так же, подключаемся по SSH (хотя, может кто-то использует там полноценную Raspberry Pi OS c графическим окружением, не суть), входим под root:

sudo -i

Включаем пересылку пакетов между интерфейсами:

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

Если этого не сделать, ничего работать не будет. Ведь, нам нужно пересылать пакеты с eth0 на tun (туннельный интерфейс Yggdrasil).

Добавляем адреса:

ip address add 300:32e:cfa4:1c08::1/64 dev eth0
ip address add fd01::1/124 dev eth0

Первый адрес из подсети 0300::/64, второй - ULA.

Если не установлен iptables, устанавливаем и прописываем правила (тем, кому больше нравится nftables - у вас правила по-своему пишутся):

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

Можно проверить добавленное:

ip6tables -L
ip6tables -t nat -L

Это и есть реализация 1:1 NAT, которое по-сути заключается в подмене адресов назначения и источника.

На этом всё. NAS имеет адрес 300:32e:cfa4:1c08::6 и после проделанного доступен из сети Yggdrasil и сам имеет доступ в эту сеть.

Осталось прикрыть на NAS порты, доступ к которым предоставлять всей сети было бы слишком щедро и доверчиво и еще раз проверить, что доступно на RaspberriPi по адресам 300:32e:cfa4:1c08::1 и fd01::1.

Сделать так, чтобы все эти настройки сохранялись между перезагрузками, надеюсь, сможете самостоятельно ;)

Ссылки

Только авторизованные участники могут оставлять комментарии.
yggdrasil/route_with_old_kernel.txt · Последние изменения: 2022/10/18 22:44 — Evgeny
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki