{{indexmenu_n>5}}
====== NAT64, NAT464, DNS64, CLAT, PLAT и другие страшные слова ======
С начала разработки IPv6 (а это очень старый протокол, его разработка была начата в 1994 году, а в 1995 уже был выпущен [[https://datatracker.ietf.org/doc/html/rfc1883|RFC1883]] на эту тему), было понятно, что какое-то время будут сосуществовать одновременно IPv4 и IPv6 протоколы, и нужно какое-то взаимодействие между ними. Для этого были придуманы некоторые правила трансляции адресов между IPv4 и IPv6. Так как [[yggdrasil:yggdrasil|Yggdrasil]] не является полноценной IPv6 сетью, а просто использует часть её адресации, в этом разделе не будет описываться "как правильно" настраивать взаимодействие "белой" IPv6 и IPv4 сети. \\
И да, эта статья рассказывает "как", но не рассказывает "зачем". Если вам проще поднять [[:wireguard]] over Yggdrasil - делайте, как вам удобнее.
:!: **Для использования дальнейшей информации требуется знание/понимание устройства сетей и умение работать в командной строке Linux**
^:!: DISCLAIMER^
| Всегда помните, что без [[yggdrasil:firewall_setup|настроек firewall]] ваша нода доступна из сети Yggdrasil всем и каждому. Если в результате через вашу ноду выйдут в "белый интернет" злые хакеры и взломают Пентагон / разместят на форуме призывы к свержению существующего строя / выложат в сеть детскую порнографию, то в первую очередь прийдут именно к вам. Не забывайте настраивать firewall (это относится не только к этой статье, а и в целом к использованию Yggdrasil). Если что - мы вас предупредили!|
===== Общее представление что это такое =====
Для начала давайте определимся, что это за страшные слова и для чего каждый из компонентов используется. Объяснение очень "на пальцах", если интересует больше подробностей очень рекомендую начать с чтения [[https://www.jool.mx/en/documentation.html|документации на Jool]], про который будет ниже.
==== NAT64 (PLAT) ====
NAT64 позволяет транслировать пакет с IPv6 адресами в пакет с IPv4. Естественно не любой, а специальный. В общем случае используется какая либо выделенная для этого IPv6 сеть с префиксом /96 (в "белом" IPv6 для этого есть специальная сеть **64:ff9b::/96**, но мы договорились, что мы не про "белый" IPv6). Как понятно из префикса, используется последние 32 бита для записи IPv4 адреса внутри IPv6, например всем известный **8.8.8.8** можно записать так: **64:ff9b::8.8.8.8** (Да! Так можно писать адреса! Это полностью эквивалентно адресу **64:ff9b::808:808**). По сути задача NAT64 - заменить в исходящем пакете IPv6 на спрятанный там IPv4, подставить в качестве отправителя свой (или указанный в отдельной таблице трансляции) IPv4 и выполнять обычные функции NAT.
Можно встретить название PLAT для этого вида NAT, но это не совсем правильно. Термин PLAT применяется при использовании NAT464.
==== NAT46 (CLAT) ====
Как несложно догадаться - задача NAT46 ровно обратная NAT64. Его задача переделать IPv4 адрес в IPv6. Вот тут как раз чаще применяется термин CLAT, так как обычно в "свободном" виде NAT46 не встречается, а используется в NAT464
==== NAT464 (464XLAT) ====
По сути, это набор из CLAT и PLAT (NAT46 и NAT64), который позволяет прогонять IPv4 трафик внутри сети IPv6.
==== DNS64 ====
Специальная версия (или специально настроенный) DNS, который умеет возвращать IPv6 запись для доменного имени, даже если её нет. Для этого он использует "специальный префикс", про который мы [[yggdrasil:tunnels:nat64#nat64_plat|говорили выше]]. Т.е. для **one.one.one.one** он вернет **64:ff9b::101:101** вместо **1.1.1.1**
В случае с Yggdrasil есть одна проблема - обычные DNS64 возвращают существующий IPv6, если он есть. Что нам не очень подходит, потому что у нас "серая" сеть IPv6 и к "белым" адресам доступа у нас нет. Вполне возможно, что это можно как-то победить (например в [[https://www.powerdns.com/|PowerDNS]] есть встроенный [[https://doc.powerdns.com/authoritative/lua-records/index.html|LUA]], и, возможно, это поведение можно скорректировать). Либо можно взять [[https://github.com/ufm/yggdns64|yggdns64]] который специально для этой задачи и был написан, но его нужно компилировать самостоятельно.
==== JOOL ====
Это реализация NAT64 и NAT46 под Linux. Все дальнейшие примеры настроек будут указанны именно для этой реализации. Есть ли что-то подобное под Windows (скорее всего - нет) или под FreeBSD (скорее всего - да) не проверялось.
Официальный сайт Jool: https://www.jool.mx/
===== Настройка =====
:!: Так как проверялась работоспособность только на **Linux Ubuntu 20.04** (и немножко на Windows в качестве клиента) и **Jool 4.1.7**, считается что используется именно этот комплект. Для установки **Jool** предварительно нужно установить **[[wpru>Dynamic_Kernel_Module_Support|DKMS]]**.
Например, у Вас есть **VDS** через которую вы хотите выходить в интернет, т.е. сделать Exit Node. Глобально - рассматривается вот такой вариант сети
{{ :yggdrasil:nat464-1.png |}}
Но будет рассмотрен вариантf без CLAT с его плюсами и минусами.
==== NAT64 ====
Начнём настройку с NAT64, потому что он нам потребуется в любом случае.
- [[https://yggdrasil-network.github.io/installation.html|Устанавливаем Yggdrasil]]
- Устанавливаем DKMS
- [[https://www.jool.mx/en/download.html|Скачиваем]] и [[https://www.jool.mx/en/documentation.html#installation|устанавливаем]] Jool (в Ubuntu эта программа есть в системном репозитории)
- Добавляем в **/etc/sysctl.conf** две строчки net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
- Смотрим свой IPv6 yggdrasil адрес. Допустим, он **203:fafa:fefe:dede:1ea2:5545:73b5:bf02/7**
- Создаём каталог **/etc/jool** и в нём такой файл:
{
"comment": "Configuration for the systemd NAT64 Jool service for yggdrasil.",
"instance": "default",
"framework": "netfilter",
"global": {
"comment": "Sample pool6 prefix",
"pool6": "303:fafa:fefe:dede:ff::/96",
"lowest-ipv6-mtu": 20000,
"maximum-simultaneous-opens": 100
},
"comment": "Sample pool4 table",
"pool4": [],
"bib": []
}
- systemctl enable jool; systemctl start jool
Теперь проверям что у нас получилось. Сейчас, с любой **другой** машины с настроенным yggdrasil (обратите внимание - **другой**!) делаем так:
C:\>ping 303:fafa:fefe:dede:ff::1.1.1.1
Pinging 303:fafa:fefe:dede:ff:0:101:101 with 32 bytes of data:
Reply from 303:fafa:fefe:dede:ff:0:101:101: time=40ms
Reply from 303:fafa:fefe:dede:ff:0:101:101: time=41ms
Reply from 303:fafa:fefe:dede:ff:0:101:101: time=41ms
Reply from 303:fafa:fefe:dede:ff:0:101:101: time=41ms
Ping statistics for 303:fafa:fefe:dede:ff:0:101:101:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 40ms, Maximum = 41ms, Average = 40ms
Если вы получили такой-же результат - поздравляем. Вы настроили свой первый **NAT64**. Самое время перечитать дисклеймер в начале статьи. В статье [[yggdrasil:tunnels:jool]] немного подробнее описана настройка Jool, какие могут встретиться подводные грабли и как их преодолеть.
==== Настраиваем firewall ====
В виду того, что Jool перехватывает пакеты данных до того, как они достигнут основных правил Фаерволла, то потребуется его дополнительная настройка. В этой секции подразумевается что используется префикс **303:fafa:fefe:dede:ff::/96**, и то что на сервере с NAT64 установлен ip6tables.
Сначала мы добавляем правило, чтобы отбрасывать пакеты *до* того как их перехватит Jool:
ip6tables -t mangle -I PREROUTING -d 303:fafa:fefe:dede:ff::/96 -j DROP
Теперь нужно в следующем правиле разрешить пакеты от выбранных пользователей:
- ip6tables -t mangle -I PREROUTING -s 2ff:0000:0000:0000:0000:0000:0000:0000/128 -d 303:fafa:fefe:dede:ff::/96 -j ACCEPT
для основного адреса
- ip6tables -t mangle -I PREROUTING -s 3ff:0000:0000:0000::/64 -d 303:fafa:fefe:dede:ff::/96 -j ACCEPT
для [[yggdrasil:network_connection_variants|маршрутизируемой подсети /64]]
==== Используем CLAT но не используем DNS64 ====
=== Вариант с отдельным роутером ===
Наверное это самый простой вариант, по сути практически полностью аналогичный классическому **VPN**. Имеет смысл использовать в том случае, если у вас несколько локальных машин, есть локальная сеть со своей адресацией и нужно весь трафик этой локалки пустить "наружу" через **VPN** (т.е. ровно как на картинке выше). Подразумевается, что у этого роутера настроен IPv4 адрес **192.168.0.1**
И так:
- [[https://yggdrasil-network.github.io/installation.html|Устанавливаем Yggdrasil]]
- Устанавливаем DKMS
- [[https://www.jool.mx/en/download.html|Скачиваем]] и [[https://www.jool.mx/en/documentation.html#installation|устанавливаем]] Jool
- Добавляем в **/etc/sysctl.conf** две строчки net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
- Смотрим свой IPv6 yggdrasil адрес. Допустим он **200:dead:beef:bebe:1424:7a39:8566:aa12/7**
- Создаём каталог **/etc/jool** и в нём такой файл:
{
"comment": "Configuration for yggdrasil clat server.",
"instance": "default",
"framework": "netfilter",
"global": {
"comment": "pool6 prefix",
"pool6": "303:fafa:fefe:dede:ff::/96",
"lowest-ipv6-mtu": 20000
},
"comment": "EAM table",
"eamt": [
{
"ipv6 prefix": "300:dead:beef:bebe:ff::/96",
"ipv4 prefix": "192.168.0.0/24"
}
]
}
- systemctl enbale jool_siit; systemctl start jool_siit
Теперь проверям что у нас получилось. Сейчас, с любой **другой** машины (обратите внимание - **другой**!), у которой адрес **192.168.0.1** указан в качестве Default Gateway делаем трейсрут и проверяем, что трафик действительно пошёл через этот тунель.
=== Вариант без отдельного роутера ===
Этот вариант имеет смысл использовать когда у Вас один (или несколько стоящих разрозненно) компьютеров, в качестве операционной системы используется Linux и установлен Yggdrasil.
Есть несколько решений, они все подразумевают создание отдельного интерфейса.
Один из вариантов описан в [[https://www.jool.mx/en/node-based-translation.html|документации]] на сайте Jool. Но мы рассмотрим другой вариант - под него есть готовый скрипт, который всю "грязную работу" сделает за нас. Что нам потребуется:
- [[https://yggdrasil-network.github.io/installation.html|Установить Yggdrasil]]
- Командой **[[yggdrasil:admin_api#getself|yggdrasilctl getself]]** нужно посмотреть какая **300/7** сеть выделена. Она потребуется ниже.
- [[https://github.com/toreanderson/clatd|Скачать]] и установить этот скрипт.
- На всякий случай - проверить что установлена [[http://www.litech.org/tayga/|Tayga]], это аналог jool-siit (stateless NAT64). Если Вы устанавливали clatd методом **sudo make -C clatd install installdeps** - он должен сам поставить этот пакет, но лучше перепроверить. В **Ubuntu** он есть в системных пакетах, так что **apt install tayga** должно хватить.
- В каталоге **/etc** Создаём файл
clat-v6-addr=3XX:XXXX:XXXX:XXXX::X
plat-prefix=303:fafa:fefe:dede:ff::/96
v4-conncheck-enable=no
v4-defaultroute-replace=yes
proxynd-enable=no
ip6tables-enable=yes
- systemctl enbale clatd; systemctl start clatd
В качетсве **3XX:XXXX:XXXX:XXXX::X** пропишите свободный ip из той сети, что получили в пункте 2. Нужен именно **свободный** адрес, т.е. не назначенный никакому интерфейсу. Собственно - всё. Теперь весь **IPv4** трафик пойдёт через Yggdrasil.
==== Используем DNS64, но не используем CLAT ====
Вариант тоже очень простой и применим в ситуации "yggdrasil only" конфигурации ноды. Т.е., на ней вобще нет IPv4 адреса, ну кроме **127.0.0.1**, куда-же без него (желающих выпилить и его - ждёт масса очень интересного секса). Но система (Windows - сильнее, Linux - в меньшей степени) и часть софта немного "шизеют" от такого варианта. Причин несколько:
* IPv4 адреса становятся полностью недоступны. А часть софта (включая сами системы) любит проверять наличие сети методом пропингивания какого либо IPv4 адреса. А еще Гугловые поделия (например тот-же Хром), любят проверять наличие сети через резолвинг посредством своего DNS.
* При этом и белые IPv6 адреса тоже недоступны. И опять таки, часть софта (опять включая сами системы), не найдя IPv4 пытается повторить всё тоже самое посредством IPv6
* Но сеть-то есть! По крайней мере DNS работает. Софт всё больше "офигивает"...
* Но имя, которое должно резолвиться в IPv4 **ВНЕЗАПНО** резолвится в IPv6. Часть софта уходит в "полную несознанку" (например тот, который в принципе не умеет работать с IPv6)
Тем не менее, если у Вас на ноде есть работающий IPv4 и Вас не пугает, что часть трафика пойдёт мимо Yggdrasil - вариант работающий. Собственно, эта статья пишется именно с такой ноды. Но лучше использовать **DNS64 + CLAT**
Что нужно настраивать:
- [[https://github.com/ufm/yggdns64|Скачать]] и скомпилировать (он написано на [[go:go|Go]]) yggdns64 (или найти и настроить его аналог).
- Установить его где нибудь.
- В настройках ноды в качестве DNS использовать именно его.
- Для Firefox не помешает добавить такую настройку: **network.manage-offline-status: false**
Всё. Для проверки - достаточно сделать ping по доменному имени. Если имя резолвится в IPv6 - значит всё OK.
==== DNS64 + CLAT ====
Этот вариант хорошо использовать в ситуации, когда у вас на ноде есть и IPv4 и ygg-IPv6 адреса (т.е. у 99.9% пользователей Yggdrasil). У него плюсы обоих вариантов:
* Система и софт не дуреют от происходящего
* Весь IPv4 трафик ходит через туннель
И при этом почти нет недостатков
* Опять таки, система и софт не дуреют от происходящего. Ну кроме софта, который не умеет работать с IPv6 в принципе.
* Если используется DNS имя - трафик ходит мимо CLAT, т.е. Yggdrasil путь уменьшается на 1 хоп, что, по понятным причинам, очень хорошо сказывается на скорости.
===== В качестве заключения =====
На самом деле этим всё не ограничивается. Например, **Jool** можно настроить так, что бы она пробрасывала порт с внешнего IPv4 на **ygg-IPv6**. А еще, понятное дело, на один **NAT64** можно повесить кучку **CLAT**. Но, как говорится, [[hm:not_a_goal|это не цель Yggdrasil]]. :)
~~DISCUSSION~~