Вопрос или проблема
Я читал во многих блогах, что CNAME не может сосуществовать с другими записями, которые имеют то же имя, что и запись CNAME.
Я не нашел хорошего примера, объясняющего проблему.
Вот пример из блога:
Записи CNAME не могут сосуществовать с другими записями, которые имеют тот же FQDN, что и запись CNAME, потому что они фактически перезаписывают все остальные записи с тем же FQDN.
Например, FQDN записи CNAME — example.com, и вы хотите создать запись A с FQDN example.com. Это не разрешено, поскольку FQDN записи A идентичен FQDN записи CNAME, делая запись A бесполезной.
Я не нахожу пример достаточно ясным, чтобы понять проблему.
Я пытаюсь понять, что означает объяснение.
Представьте, я настроил:
Доменное имя | TTL | Класс | Тип записи | Значение |
---|---|---|---|---|
aliasname.example.com | 300 | IN | CNAME | name.example.com |
name.example.com | 300 | IN | A | 10.0.0.1 |
Что происходит в такой конфигурации?
ИЗМЕНЕНИЕ: Меня исправили ответами, что мой приведенный выше пример правильный/действительный.
Ниже привожу некорректную/недопустимую конфигурацию. Приведенный выше пример возник из моего неправильного понимания текстовых примеров, которым не хватало иллюстраций в виде таблиц.
Доменное имя | TTL | Класс | Тип записи | Значение |
---|---|---|---|---|
name.example.com | 300 | IN | CNAME | othername.example.com |
name.example.com | 300 | IN | A | 10.0.0.1 |
Мое понимание заключается в том, что последняя конфигурация недействительна, потому что, согласно RFC, сначала используется CNAME, а запись A никогда не используется.
Прав ли я в отношении причины некорректности последней таблицы?
Или в общем, что происходит в случае последней конфигурации?
Ваш последний пример недействителен не потому, что “что-то используется в первую очередь”. Он недействителен, потому что нарушает логику CNAME.
Логика, о которой я говорю, заключается в том, что CNAME определяет имя как псевдоним другого имени, которое затем называется каноническим именем, “cname” является сокращением этого. Запись alias CNAME canonical-name
буквально говорит: “псевдоним является другой формой канонического имени“. Это очень похоже на утверждение: “Боб – это другая форма Роберта”. Это абсурдно добавлять: “и также псевдоним является чем-то другим”, это не имело бы смысла, по крайней мере, в вычислениях. Это не укладывается в модель данных, поэтому RFC это явно запрещает.
Та же логика объясняет CNAME на вершине зоны: вершина должна определять как минимум две записи, SOA и NS, что уже противоречит требованию, что CNAME должен встречаться один. (Поначалу я думал проголосовать за закрытие этого вопроса как дубликата связанного, потому что этот ответ действительно отвечает на этот вопрос тоже; однако, кажется, это другой, более общий, вопрос, и было бы более логично сделать это в обратном направлении.)
Было обновление этого правила, когда был введен DNSSEC. Подписывающие записи должны появляться вместе с CNAME, чтобы подтвердить его действительность в подписанной зоне. Но никакие другие записи не могут. (RFC 2181 говорит “может”, но запись действительно не будет работать без подписи в подписанной зоне.)
То, что CNAME не может сосуществовать с другими типами записей, связано с этим:
Доменное имя | TTL | Класс | Тип записи | Значение |
---|---|---|---|---|
host.example.com | 300 | IN | CNAME | fqdn.example.com |
host.example.com | 300 | IN | A | 192.0.2.1 |
НЕ сценарий, который вы описали. Причина его недействительности кажется несколько произвольной, но я считаю, что это требование RFC.
Ваш описанный сценарий вполне допустим – и широко используется. Например:
Доменное имя | TTL | Класс | Тип записи | Значение |
---|---|---|---|---|
service1.example.com | 300 | IN | CNAME | reverseproxy.example.com |
service2.example.com | 300 | IN | CNAME | reverseproxy.example.com |
service3.example.com | 300 | IN | CNAME | reverseproxy.example.com |
reverseproxy.example.com | 300 | IN | A | 192.0.2.1 |
Ваш пример допустим.
Что недопустимо:
Доменное имя | ttl | Класс | Тип записи | Значение |
---|---|---|---|---|
cname.example.com |
300 | IN | CNAME | foo.example.org |
cname.example.com |
300 | IN | A | 192.0.2.1 |
Цитата из первоисточника, RFC 1034:
Система доменов предоставляет такую функцию с использованием канонической записи
(CNAME) RR. CNAME RR определяет имя владельца как псевдоним и
указывает соответствующее каноническое имя в разделе RDATA
RR. Если CNAME RR присутствует в узле, никаких других данных не должно
быть; это обеспечивает, что данные для канонического имени и его
псевдонимов не могут быть различными. Это правило также гарантирует, что
кэшированный CNAME может использоваться без проверки у авторитетного
сервера на предмет других типов RR.
.
Ответ или решение
Вопрос о невозможности сосуществования записи CNAME с другими записями с тем же именем вызывает некоторые затруднения у многих специалистов. Чтобы разобраться в этой теме, важно понять логику, заложенную в функционирование системы доменных имен (DNS).
Основы DNS и CNAME
В DNS система CNAME обозначает "каноническое имя" (canonical name), что указывает на то, что запись с данным именем является алиасом (то есть псевдонимом) для другого имени. Это значит, что всякий раз, когда запрашивается алиас, на самом деле происходит переадресация на каноническое имя, указанное в CNAME записи.
Почему CNAME не может сосуществовать с другими записями?
Согласно стандартам, изложенным в документе RFC 1034, если в узле присутствует запись CNAME, то никакие другие данные не должны в этом узле присутствовать. Это правило гарантирующее, что данные для канонического имени и его псевдонимов не могут отличаться. В противном случае возникнет неоднозначность в интерпретации DNS-запросов.
Примеры и объяснение
-
Некорректная конфигурация:
name.example.com. 300 IN CNAME othername.example.com. name.example.com. 300 IN A 10.0.0.1
Здесь
name.example.com
объявлен как CNAME, связывающий его сothername.example.com
. Одновременное наличие записи типа A с тем же именем делает конфигурацию недействительной. К запросу наname.example.com
невозможно применить разные правила, из-за чего он становится "раздвоенным". -
Корректная конфигурация (из вашего примера):
aliasname.example.com. 300 IN CNAME name.example.com. name.example.com. 300 IN A 10.0.0.1
Здесь
aliasname.example.com
является алиасом дляname.example.com
, что корректно.name.example.com
имеет свою запись типа A, что в данном случае допустимо, поскольку это имя не используется как CNAME.
Почему это важно?
Внедрение ошибочной конфигурации может привести к проблемам с доступностью ресурсов в Интернете. Серверы кеширования DNS могут использовать только CNAME, что требует от них игнорировать другие записи. Это может привести к неправильным ответам на запросы DNS, что существенно повлияет на доступность и надежность ваших услуг. Следовательно, правильная конфигурация DNS — ключ к стабильности и производительности ваших сервисов.
Резюмируя, тщательно следите за конфигурациями DNS и избегайте смешивания записей CNAME с другими типами записей с одинаковыми именами. Это позволяет избежать технических проблем и обеспечивает корректную работу доменных систем.