How to Wiki Database (change log)
http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
11 KiB
133 lines
11 KiB
====== Маршрутизация из подсети 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~~
|
|
|