Привет, Хабр! Меня зовут Виктор, я разработчик в Selectel. Часто ко мне обращаются клиенты и спрашивают, в каких ситуациях использовать DNS-записи типа alias. Вопросы появляются на почве ограничений и нюансов RFC. Пора разложить все по полочкам!

Дисклеймер: большую часть информации из статьи можно найти в RFC по каждому из типов записей. В статье дали выдержку самого важного и показали варианты практического применения. Материал поможет нашим клиентам правильно настроить DNS-записи.

Какие DNS-записи бывают?


DNS-записи позволяют протянуть взаимосвязи между IP-адресами и доменами. Именно с помощью них серверы делятся информацией о доменах с другими серверами. Поэтому важно ответственно подойти к настройкам — они разные, в зависимости от типов записей.


Например, есть A-записи, которые нужны исключительно для связи IP с доменом, CNAME, которые работают с поддоменами, MX, позволяющие настроить почтовые домены, и другие. Далее будем говорить только о DNS-записях типа alias, так как они, по моему опыту, вызывают наибольшее количество вопросов.

Записи типа alias


Всего существует пять основных записей типа alias — CNAME, ALIAS, ANAME, BNAME и DNAME. Но больше всего работают именно с ALIAS и CNAME. В Selectel DNS есть только эти два типа — это связано с тем, что ANAME, BNAME и DNAME оказались неудачными попытками и не смогли найти массового практического применения.

Теперь разберемся, когда эти записи нужны. За отправную точку возьмем самую популярную запись из этого класса — CNAME.



CNAME: запись для перенаправления поддоменов


CNAME позволяет установить связь, например, между www.google.com и google.com. Но этим список возможностей этой записи не ограничивается: с помощью CNAME можно, например, перенаправить с storage.example.com на 123456.selcdn.ru, чтобы получить «красивую» ссылку.

CNAME — это запись, отвечающая за привязку поддоменов к каноническим доменам. Она дублирует все ресурсные записи домена для поддоменов таким образом, чтобы при обращении к последнему был проброс на соответствующие адреса и настройки.


По сути, запись CNAME состоит из пары значений. Первое определяет псевдоним — например, субдомен вроде www или mail — для которого создается запись, а второе — домен, на который он указывает.

Принципиальное отличие CNAME от A-записи в том, что она связывает сервисы с доменными именами, а не с физическими IP-адресами. В случае изменения адреса не нужно переписывать все записи CNAME, достаточно изменить А-запись у оригинального домена. Несмотря на это, у CNAME есть ограничения:

  • Запись CNAME нельзя добавить для домена второго уровня вроде selectel.ru или google.com. Для таких целей нужно использовать ALIAS.
  • Если для поддомена добавлена запись CNAME, то другую запись для него добавить нельзя. Это связано с особенностями технической реализации CNAME: она заставляет провайдеров «копировать» все записи у оригинальных доменов. Поэтому, чтобы случайно не столкнуться с тем же конфликтом двух A-записей на разные ресурсы, ввели это ограничение.
  • Если для поддомена добавлены другие записи, то добавить CNAME нельзя. Причина та же, что в предыдущем пункте.
  • CNAME невозможно использовать для «перенаправления», так как HTTP-редирект в рамках системы DNS организовать нельзя.

Если помнить об этих ограничениях, проблем с CNAME не будет.

Когда использовать CNAME


Разберем сценарий на примере CDN-ресурса в панели управления. К нему по умолчанию мы предоставляем домены вот такого вида:


Допустим, домен по умолчанию не нравится и вы хотите, чтобы сайт CDN был доступным через собственный (cdn.tarrydvcie.ru) — без использования домена Selectel. Для этого вы решаете создать А-запись следующего вида:

cdn.tarrydvice.ru. IN A 92.53.68.16

Здесь cdn.tarrydvice.ru — нужный поддомен, A — тип записи, 92.53.68.16 — адрес сервера CDN.

Но что произойдет, если изменится IP-адрес для домена по умолчанию, например, на 92.53.68.17? Придется в срочном порядке менять A-запись для cdn.tarrydvice.ru — это может привести к временной недоступности к сайту.

Наиболее простое и удобное решение в этой ситуации — использовать CNAME-запись. Тогда при изменении IP-адреса на 92.53.68.17 для домена по умолчанию автоматически подтянутся и для cdn.tarrydvice.ru.

Подключение и настройка записи в панели


Чтобы решить задачу с доступом через «красивый» домен cdn.tarrydvice.ru, нужно добавить CNAME-запись и сослаться на стандартный домен. Это можно сделать через панель управления доменами.


После добавления CNAME, новую запись можно увидеть с помощью команды dig.

-----------

dig cdn.tarrydvice.ru CNAME

;; QUESTION SECTION:

;cdn.tarrydvice.ru.                IN        CNAME

;; ANSWER SECTION:

cdn.tarrydvice.ru.        3600        IN        CNAME        ab7b4245-9d7a-4b1b-90ba-d4115b72d63e.selcdn.net.

...

В качестве последнего действия нужно добавить новый домен во вкладке CDN.


Супер — все готово, теперь к CDN можно подключиться по «красивому» домену.

ALIAS: как CNAME, только выше


Принцип работы ALIAS похож на механику CNAME: она также копирует данные целевого домена. Однако не может быть добавлена для основного и «существовать» с другими записями в пределах одного поддомена.

Каждый раз, когда на серверы DNS поступает запрос типа записи A или AAAA, вызывается специальный обработчик, который преобразует ALIAS в адрес IPv4 или IPv6 соответственно.


При подключении ALIAS есть несколько ограничений, которые нужно учитывать:

  • Для домена / поддомена с ALIAS-записью не может быть записи A или AAAA.
  • Запись ALIAS нарушит DNSSEC на основном домене (@), поскольку в ответах @ A и @ AAAA будут отсутствовать записи RRSIG.

Нет какого-либо «черновика» и стандарта в RFC по подключению ALIAS-записи, поэтому от провайдера к провайдеру наблюдается разное поведение этой записи. Например, некоторые провайдеры умеют отправлять только типы записи A.

Когда использовать ALIAS


Теперь разберем сценарий на базе настройки объектного хранилища. Во вкладке «Хранилище» можно увидеть домен вида 288028.selcdn.ru — это персональный домен, который используется в публичных ссылках для доступа к файлам.


Здесь ситуация аналогична CNAME: нам выгоднее использовать ALIAS-запись на красивый домен tarrydvcie.ru, ведь изменения IP-адреса на 92.53.68.17 для 288028.selcdn.ru автоматически подтянутся и для tarrydvice.ru.

Подключение и настройка записи в панели


Для создания ALIAS-записи перейдем во вкладку «Cетевые сервисы» → «DNS-хостинг» и откроем домен tarrydvice.ru.


Далее нужно добавить запись и заполнить соответствующие поля:


После этого в списке записей появится ALIAS — это можно также увидеть с помощью команды dig:

dig tarrydvice.ru ALIAS                  

;; QUESTION SECTION:

;tarrydvice.ru.                        IN        A

;; ANSWER SECTION:

tarrydvice.ru.                563        IN        A        92.53.68.16

Для удобства получения ссылок в объектном хранилище осталось выполнить последний шаг: в управлении доменами нужно добавить tarrydvice.ru.


Теперь при получении ссылки на файл можно увидеть дополнительную URL с «красивым» доменом.





Поделитесь в комментариях, с какими трудностями вы сталкивались при подключении DNS-записей. Мы выберем интересные случаи и постараемся их разобрать.

Возможно, эти тексты тоже вас заинтересуют:

SD – это Linux, а Midjourney – Mac: краткое полное руководство по Stable Diffusion
Расширяем возможности «малинки» в 2023 году: дополнительные модули и аксессуары для Raspberry Pi Pico
«Крутое пике» для жестких дисков: продажи упали почти вдвое, но растут продажи ленточных накопителей. Что происходит?

Комментарии (15)


  1. SignFinder
    26.01.2023 16:12
    +12

    По моему скромному мнению - это "при вводе в браузер адреса www.google.com, он автоматически заменяется на google.com — это магия CNAME " не может быть магией CNAME. Это может быть магией 301 redirect, а DNS клиенту может только предоставить разрешение имени WWW.google.com в IP адрес через прослойку в виде cname, но никак не http редирект.


    1. victor_dvoretsky Автор
      26.01.2023 17:00

      Добрый день! Да, вы правы, спасибо, что уточнили это. Сам переход осуществляется по 301 redirect, а CNAME лишь указывает, куда идти.


      1. vanyas
        26.01.2023 18:12
        +8

        Нет, CNAME никак не указывает куда идти редиректу, это в 301 указывается, CNAME тут совсем не приделах. CNAME нужен лишь ждя того, чтобы для www.google.com не создавать отдельную А запись и потом при смене ip обновлять только A запить google.com, на www.google.com может вообще не быть редиректов и быть отдельный сайт, но в DNS это будет CNAME. Как можно было писать такую статью без знания базовых вещей?


        1. victor_dvoretsky Автор
          26.01.2023 18:47
          +1

          Да, вы совершенно правы в описании механики CNAME. Пытался писать проще, чтобы не пугать новичков, на которых рассчитана статья) Спасибо за комментарии! Благодаря вам мы прояснили этот момент для людей, которые хотят погрузиться в тему глубже.


      1. NikitaCartes
        27.01.2023 20:05
        +2

        Этот ответ выглядит точь-в-точь как сообщение ChatGPT когда ей указывают на ошибку, забавно.


        1. DmitryKoterov
          28.01.2023 12:47

          Ни фига себе. Тоже первая мысль, которая мне пришла в голову при прочтении. Может, это оно и есть?


  1. vanyas
    26.01.2023 16:44
    +1

    Про редирект в браузере с www.google.com на google.com при помощи CNAME - полная чушь же


  1. andreishe
    26.01.2023 18:02
    +1

    Запись CNAME нельзя добавить для домена второго уровня вроде selectel.ru или google.com.

    А точно ограничение исходит от уровня домена, а не от наличия SOA записи?


    1. victor_dvoretsky Автор
      26.01.2023 18:11
      +2

      Добрый день! Ограничение было введено для доменов второго уровня, так как для них всегда есть SOA запись у регистратора доменов. И зачастую у доменов третьего уровня и дальше отсутствуют какие-либо записи. Вы правы, главным ограничением является наличие каких-либо других записей у домена, как в третьем пункте.


  1. khe404
    27.01.2023 10:36

    Видел конструкции основанные на CNAME которые позволяют делегировать выпуск wildcard SSL сертификатов let's encrypt.

    Аналогично CNAME помогает передать конфигурирование autodiscover.mail.domain провайдеру почты.


  1. Assket
    27.01.2023 12:22
    +2

    Бывают ТИПЫ записей DMARC, DKIM, SPF? Смешались в кучу, кони, люди.


    1. strangeman
      27.01.2023 16:00

      Ну SPF кстати есть (был точнее) - https://www.rfc-editor.org/rfc/rfc4408

      > This document defines a new DNS RR of type SPF, code 99. The format of this type is identical to the TXT RR [RFC1035]. For either type, the character content of the record is encoded as [US-ASCII].


  1. BratSinot
    27.01.2023 17:27
    -1

    Я может читал невнимательности, но можно сделать привязку к A / AAAA записи?

    Скажем есть домен example.com с A и AAAA записями и два под-домена:

    • v4.example.com -- указывает только на A;

    • v6.example.com -- указывает только на AAAA;

    Так можно сделать?


    1. DaemonGloom
      27.01.2023 22:39

      Да, v4 и v6 — это отдельные домены в такой ситуации. Можно сделать так, как вы указали, но тогда не будут использованы cname/alias — адреса придётся обновлять вручную.


  1. karavan_750
    28.01.2023 22:31

    Поделитесь в комментариях, с какими трудностями вы сталкивались при подключении DNS-записей. Мы выберем интересные случаи и постараемся их разобрать.

    Чуть меньше года назад я обратился в тех.поддержку некоторого хостинга с проблемой импорта зоны из файла, который был выгружен из Cloudflare.
    Импорт осуществлялся в панели хостинга через предлагаемую кнопку выбора файла зоны.
    На это действие панель отвечала немногословной ошибкой о том, что "вот она случилась", без указания причин.
    Порывшись в документации хостинга, нашел указание, что импорт возможен только соответствующего файла.
    Чему должен соответствовать файл для импорта и в чем заключается несоответствие имеющегося файла пришлось разбираться.
    Тех.поддержка указала на необходимость завысить минимальный TTL всех записей до 60 секунд (где-то присутствовало 1 сек), но импортирование все также не давалось.
    Следующим днем причина была найдена после разбивки зоны (почти 300 строк) по типам записей и импортированием каждого типа по отдельности.
    Проблема заключалась в наличии CAA-записей, которые хостингом не поддерживались.

    На данный момент хостингом включена поддержка CAA и моя проблема импорта давным давно решена, но осадочек остался.

    Этим сообщением обращаюсь к разработчикам, пусть инструменты, разрабатываемые вами, будут по многословнее, что ли, это пользователям может сэкономить время.