Записи AAAA и PTR для IPv6, обратная зона ip6.arpa, особенности указания IPv6-адресов в URI и требования к DNS-серверам.
Как называется DNS-запись для хранения IPv6-адресов?
Как записывается обратная зона для IPv6-адресов?
Почему EDNS0 критически важен для DNS в IPv6-сетях?
Как в Windows можно использовать IPv6-адрес в программах без нативной поддержки IPv6?
На каких границах масок можно делегировать обратные зоны ip6.arpa?
IP-адреса -- это числа, которые можно записать в удобном для человека формате, но изначально они создавались не для чтения людьми. Возьмем IP-пакет: он отправляется с адреса 1 на адрес 2. Адрес отправителя -- 32-битное число, адрес получателя -- тоже. Это все, что необходимо знать для обработки IP-пакетов.
IPv6-адреса длинные, их неудобно запоминать. Что с ними делать? Для этого существуют специальные удобные метки -- DNS-имена. Вот DNS-адресацию запоминать можно и нужно, а IP-адреса запоминать не надо.
Чтобы все работало, нужен клиент, который знает, к какому DNS-серверу обращаться, когда нужно узнать, какой IPv6-адрес соответствует конкретному текстовому имени. Например, у вас в сети есть ноутбук Васи, вы используете определенный доменный суффикс, и машина называется notebook-vasya. Вы обращаетесь к DNS: "Скажи мне, какой IPv6-адрес у notebook-vasya.company.local?" DNS-сервер отвечает: "У этого компьютера будет IPv6-адрес 2001:db8:...".
Строго говоря, можно обойтись и без DNS. Если хотите запоминать IPv6-адреса -- пожалуйста, тренируйте память. Но тогда у вас будет огромная квадратная голова.
Если вы хотите использовать IPv6-адреса без DNS, можно указывать их прямо в текстовой строке адреса. Большинство современных браузеров это поддерживают.
Однако в URI (Uniform Resource Identifier) IPv6-адрес необходимо указывать в квадратных скобках. Это связано с тем, что адрес в IPv6 содержит двоеточия, а в URI двоеточие -- служебный символ, который используется для:
Без квадратных скобок невозможно отличить, где заканчивается адрес и начинается порт. Например:
http://[2001:db8::1]:80/ -- адрес 2001:db8::1, порт 80
http://[2001:db8::1:80]/ -- адрес 2001:db8::1:80, без порта
Это два совершенно разных адреса.
Можно использовать файл hosts. Большинство современных операционных систем прекрасно воспринимают IPv6-адреса в этом файле. Например:
fd00::1 host1
Если вы используете Windows, есть механизм, который позволяет программам, не умеющим работать с IPv6-адресами напрямую, все равно подключаться по IPv6. Это имя, похожее на DNS-имя, но разрешающееся без обращения к DNS -- алгоритмически, самим компьютером.
Правила записи ipv6-literal.net:
-)::) заменяется на двойной дефис (--)% (zone index) заменяется на букву s.ipv6-literal.netПример:
Адрес: 2001:db8:b1:6b::b5:22:1
Literal: 2001-db8-b1-6b--b5-22-1.ipv6-literal.net
Link-local адрес: fe80::2:1%4
Literal: fe80--2-1s4.ipv6-literal.net
Это удобно, когда нужно заставить работать с IPv6 программу, которая не поддерживает ввод IPv6-адресов. Например, RDCMan (Remote Desktop Connection Manager) от Microsoft -- бесплатное приложение для управления несколькими сессиями Remote Desktop. Его последняя версия не умеет принимать IPv6-адреса напрямую, хотя транспорт IPv6 прекрасно поддерживает (работает поверх TCP-порта 3389 и UDP-порта 3389, оба нормально работают с IPv6). В этом случае как раз удобно использовать ipv6-literal.net.
Если не хочется поднимать DNS, но нужно работать с IPv6-соседями, и вы не знаете их адресов, можно воспользоваться механизмом LLMNR (Link-Local Multicast Name Resolution). Это IPv6-механизм для Windows-машин, который позволяет по hostname обнаружить IPv6-адрес соседа.
Вы говорите ping server, DNS-записи нет, но имя все равно разрешается. Это не NetBIOS-разрешение имен (NetBIOS не умеет работать по IPv6) и не WINS. LLMNR отправляет пакеты на специальную мультикастовую группу, которую слушают все Windows-машины в сегменте.
Если у вас не Windows, есть mDNS (Multicast DNS) -- мультикаст DNS в локальной сети. Пример -- Apple Bonjour. Если у вас инфраструктура Apple/Mac, у них тоже есть свой механизм разрешения IPv6-имен.
Допустим, вы хотите подключиться к серверу ipv6.google.com. Набираете это имя в браузере, DNS-клиент не может разрешить его из кэша, и запрос идет на DNS-сервер.
Рекурсивный запрос -- клиент требует предоставить готовый финальный ответ. Он не согласен получить промежуточный результат. Логика такая: "Сделай что хочешь, но либо скажи, что такого адреса нет, либо дай мне адрес".
Итеративный запрос -- используется между DNS-серверами. Если ваш DNS-сервер не использует пересылку (forwarding), он сам выполняет итеративное разрешение:
. -- их IP-адреса заранее известныipv6.google.com, но посмотри у тех, кто отвечает за зону .com".com отвечает: "Я не знаю, но посмотри у тех, кто отвечает за google.com"google.com возвращает готовый результат с IPv6-адресомКлиенты обычно используют рекурсивные запросы. Серверы между собой -- итеративные (если не настроен forwarding).
Если клиент хочет получить IPv6-адрес по имени узла, он отправляет запрос с указанием типа записи AAAA ("четыре A").
Название пошло от IPv4: там запись типа A (Address) хранила 32-битный адрес. А AAAA -- это запись для IPv6-адреса (128 бит, в 4 раза больше, отсюда четыре A).
Пример с утилитой nslookup:
nslookup -d2 -type=AAAA ipv6.google.com
В запросе указывается, что мы хотим рекурсию -- готовый конечный результат. Сервер возвращает запись AAAA класса IN (Internet), содержащую IPv6-адрес размером 16 байт. Запись также содержит TTL -- время, на которое результат можно закэшировать.
Для тестирования можно использовать имя ipv6.google.com -- у него нет обычной A-записи, оно работает только по IPv6.
Если нужно по известному IPv6-адресу получить имя узла, используется запись PTR. Запрашивается текстовая метка, содержащая IP-адрес, и возвращается текстовая метка с именем узла. Сами IPv6-адреса при этом не передаются.
В утилите nslookup можно задать IPv6-адрес напрямую -- утилита сама преобразует его в текстовую метку.
Формат обратной записи: каждый шестнадцатеричный символ адреса записывается через точку в обратном порядке, с суффиксом ip6.arpa.
Пример для адреса 2001:0db8:b16b:00b5::1:
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.b.0.0.b.6.1.b.8.b.d.0.1.0.0.2.ip6.arpa
Разбираем:
| Группа адреса | Символы в обратном порядке |
|---|---|
2001 |
...1.0.0.2 |
0db8 |
...8.b.d.0 |
b16b |
...b.6.1.b |
00b5 |
...5.b.0.0 |
0000 |
...0.0.0.0 (нули) |
0001 |
1.0.0.0... |
В DNS могут быть промежуточные записи CNAME (Canonical Name). Вы спрашиваете: "Какой адрес у www.networkeducation.ru?" DNS отвечает: "Такого узла нет, но есть другой -- blablabla.azurewebsites.com, это на самом деле одно и то же". CNAME ссылается на другую запись, которая уже может быть AAAA и содержать IPv6-адрес.
Согласно RFC 4472, DNS-сервер, работающий с IPv6, должен:
Поскольку AAAA-записи занимают 16 байт каждая, при большом количестве записей в ответе может не хватить места в стандартной UDP-датаграмме DNS. По умолчанию DNS пытается уместиться в 576 байт -- это минимальный гарантированный MTU, пришедший из эпохи коммутируемых соединений (протокол PPP поверх модемов). Десять IPv6-адресов -- это уже 160 байт только на адреса, плюс заголовки.
Поэтому при работе с IPv6 очень пригодится механизм EDNS0, который:
Зачем записывать адреса в обратном порядке? Это обеспечивает удобное делегирование зон.
Все адресное пространство IPv6 обслуживается корневыми серверами зоны ip6.arpa. У этих серверов заранее известные имена: a.ip6-servers.arpa, b.ip6-servers.arpa и т.д. Важно: у некоторых из них есть только IPv4-адреса, поэтому чистый IPv6-only DNS-сервер сделать не получится -- ему все равно нужно взаимодействие по IPv4.
Цепочка делегирования при PTR-запросе:
2001:0d... обслуживаются региональным регистратором (например, APNIC)2001:0db8::/32 выдан определенному провайдеруБлагодаря записи в обратном порядке по одному шестнадцатеричному символу, зоны удобно делить на части, кратные 4 битам (один hex-символ = 4 бита). Это обеспечивает простое и красивое делегирование. В IPv4 схема была аналогичная, но менее громоздкая. В IPv6 текстовые метки длинные, зато механизм делегирования удобный.
Поддержка протокола IPv6 в DNS полностью обеспечена. Запоминать длинные IPv6-адреса нет никакой необходимости -- DNS прекрасно с IPv6 работает. В следующем разделе разберем работу служебного протокола ICMPv6.