Параноики есть в каждом сообществе. Например, туристы порой превращаются в выживальщиков, постоянно готовящихся к БП – «Большому Происшествию», когда от их готовности будет зависеть жизнь родных, человечества в целом, и сохранность себя родимого. Нельзя однозначно заявить плохо это или хорошо, потому что не секрет, что БП застанет и тех, у кого не запасено 50 килограммов гречки, бензин и оружие. Среди опытных ай-тишников также развита профессиональная деформация личности, которая нередко подразумевает паранойю: тяжело спать спокойно, когда понимаешь технологии изнутри и хрупкость их бытия!

Эта статья посвящена альтернативной доменной системе, рассчитанной на случай глобальной сегментации интернета, катаклизмов, или возможных искусственных ограничений коммуникации. Не спешите с пренебрежительной ухмылкой. По аналогии с запасами выживальщика, эта информация не требует больших затрат, а в нужный момент сможет выручить!

Логотип, не облагаемый лицензионными обязательствами
Логотип, не облагаемый лицензионными обязательствами

Концепция

Идея родилась в кругу пользователей Yggdrasil Network – самоорганизующейся меш-сети с маршрутизацией по IPv6 и абсолютной масштабируемостью. Эта технология лучше многих существующих подходит для создания разветвленных сетей без участия администратора: всё, что требуется – физическая среда передачи информации (кабель, радио или оптический линк). Подобный децентрализованный подход во многом перспективен и удобен, но в нём явно не хватает своей реализации доменных имен, без которых не способны работать сервисы вроде Email и XMPP. Помимо этого не все приложения корректно воспринимают синтаксис IPv6.

Разработчики Yggdrasil в свою очередь заявили, что занимаются архитектурой сети, а не доменными именами. Сообществом было предложено несколько решений вопроса доменных имен, которые в своем большинстве являются банальными серверами с форвардингом в обычный интернет, т.е. ничего лучше обычного DNS придумать не удалось. Как вам идея платить $10 дядюшке Сэму за доменное имя, к которому будут привязаны персональные данные, как это уже привычно, и адрес из децентрализованной сети, подразумевающей отказоустойчивость, масштабируемость и независимость от домашнего, регионального и прочих провайдеров?! Сомнительное удовольствие для криптоанархиста, который грезит о полной автономности и свободе от единой точки отказа, тем более коммерческой. Нужно признать, централизованная система доменных имен – решение отчасти вынужденное, которым по сей день пользуется большая часть аудитории Yggdrasil, так как для использования чего-либо стороннего необходимо убедить конечного пользователя использовать то же самое. Отдельного внимания заслуживает ALFIS – DNS на легковесном блокчейне, не требующий постоянного наличия майнеров в сети. Концепт DNS на блокчейне не нов, однако плюсы и минусы конкретно этой занятной реализации применительно к децентрализованным меш-сетям рассмотрим в отдельной статье.

В русскоязычном сообществе энтузиастов отказоустойчивых и свободных сетей родилась простая идея для абсолютно независимых доменов: кодирование адреса IPv6 в текст c подстановкой выделенной доменной зоны. Подобный домен выглядит не совсем читабельно, напоминает адреса других сетей, где домен образован криптографическим путем, например, Tor. Однако, подобный подход к решению вопроса основательно освобождает от централизованных решений и всецело пригоден для работы как в изолированных сегментах сети, так и в глобальном: домен является непосредственно закодированным адресом целевого узла, а не зарегистрированным именем в SQL-таблице Большого брата.

Реализация

Эталонная реализация протокола meshname выполнена на Golang – meshnamed. Описание спецификации прилагается. Принцип работы прост и надежен, как автомат Калашникова.

Вся суть заключается в кодировании адреса в base32 (RFC 4648). Так как заранее известно количество байт, паддинги урезаются (заполнение в виде символов =). Обратите внимание, что кодируется не текстовая строка адреса, а его бинарное представление.

Получая домен на вход, резолвер извлекает из него адрес и отправляет стандартный DNS-запрос на 53 порт полученного адреса. Если целевой узел доступен и на нем запущен meshnamed, он отвечает на запрос. Конфигурационный файл meshnamed поддерживает синтаксис JSON и не имеет ограничений по типам записей (на иллюстрации ниже типы DNS-записей выделены красным цветом).

Каждый адрес, который фактически является одним из внешних адресов устройства (выделен голубым), должен иметь доступный 53 порт для внешних обращений. Если ответ от запрашиваемого адреса не поступил, доменное имя считается несуществующим.

Для обращений на адрес, на котором не настроен meshnamed, предусмотрена упрощенная реализация протокола – meship. При получении адреса *.meship, резолвер раскодирует информацию и возвращает пользователю запись типа АААА без каких-либо предварительных попыток обратиться по полученному адресу. Очевидно, что использование доменов третьего уровня и дополнительных записей DNS при таком сценарии не представляется возможным.

Классическим сценарием использования является связка с dnsmasq, который позволяет завести meshnamed на локальном порте высокого порядка без привилегий суперпользователя (например, [::1]:35353), передавая ему только две доменные зоны, за которые он отвечает.

Содержимое /etc/dnsmasq.conf:

port=53
domain-needed
bogus-priv
server=/meshname/::1#35353
server=/meship/::1#35353
server=8.8.8.8

Для быстрой конвертации адресов в имена и обратно, meshnamed поддерживает функции -getname и -getip.

Заключение

Были проведены тесты, в рамках которых успешно работали все домено-зависимые сервисы, попавшиеся под руку. В мирное время, когда привычные DNS всегда доступны и крепнут день ото дня, практическая ниша meshname весьма скромная: вместо альтернативных костылей в виде ipv6-literal.net или добавления адресов IPv6 в файл hosts для работы Windows Active Directory, а также любых других программ, не поддерживающих синтаксис IPv6 из-за двоеточий и квадратных скобок.

Если появится необходимость в более читабельных meshname-доменах при использовании Yggdrasil, можете воспользоваться майнером адресов SYG-CPP.