Назад | Перейти на главную страницу

Почему корень домена не может быть CNAME?

Я только что прочитал этот вопрос что по сути говорит о том, что когда я настраиваю DNS для example.com, корневая запись не может быть CNAME, это должна быть запись A.

У меня вопрос, а почему?

Я уверен, что умные люди, разработавшие DNS, не вводили произвольных ограничений без всякой причины, но я не вижу, что мы получаем, требуя, чтобы корневые домены были A-записями. Я хотел бы просто указать мой домен example.com на someserver.somewebhost.example и забыть об этом, но я не могу.

Просвети меня, billpg.

Во-первых, основная причина заключается не в том, что вы должны использовать запись A, а в том, что вы не можете использовать запись CNAME, потому что она не может сосуществовать с другими обычными типами записей ресурсов.

Причина для который ограничение содержится в §3.6.2 RFC 1034:

Если на узле присутствует запись CNAME RR, других данных не должно быть; это гарантирует, что данные для канонического имени и его псевдонимов не могут отличаться. Это правило также гарантирует, что кэшированный CNAME может использоваться без проверки на полномочном сервере других типов RR.

Поскольку в корне (делегированного) домена должны быть записи SOA и NS, срабатывает указанное выше правило, предотвращающее использование CNAME.

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

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

Допустим, мы пытались дать example.net как CNAME (указывая на host.example.com) и A запись (указывающая на другой IP-адрес).

  1. Сначала клиент запросит A запись из example.net с серверов имен example.net.

  2. Серверы имен example.net сообщат нам, что нам нужно следовать CNAME запись, чтобы продолжить. Так и делаем. В CNAME указывает на host.example.com.

  3. Клиент запросит A запись из host.example.comсерверы имён.

Обратите внимание, как у нас не было возможности прочитать A запись или любой другой тип записи с example.net? В CNAME имеет приоритет.