Почему запись CNAME не может быть использована в верхушке (он же root) домена?

Это канонический вопрос о CNAME в верхушках (или корнях) зон

Это относительно общеизвестно, что CNAME записи на вершине домена являются запретной практикой.

Пример: example.com. IN CNAME ithurts.example.net.

В лучшем случае программное обеспечение сервера имен может отказаться загружать конфигурацию, а в худшем случае оно может принять эту конфигурацию и сделать недействительной конфигурацию для example.com.

Недавно я попросил компанию, предоставляющую услуги веб-хостинга, передать бизнес-подразделению инструкции, необходимые для CNAME вершины нашего домена для новой записи. Зная, что это будет самоубийственный конфиг при подаче в BIND, я посоветовал им, что мы не сможем подчиниться, и что это был общий совет. Компания, занимающаяся веб-хостингом, заняла позицию, что это не запрещается стандартным определением RFC и что их программное обеспечение поддерживает это. Если бы мы не могли CNAME apex, их совет состоял в том, чтобы вообще не иметь записи apex, и они не предоставили бы перенаправляющий веб-сервер....Какие?

Большинство из нас знает, что RFC1912 настаивает на том, чтобы A CNAME record is not allowed to coexist with any other data., но давайте будем честны с самим собой, что RFC является только информационным. Из словоблудия, запрещающего эту практику, я знаю больше всего: RFC1034:

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

К сожалению, я был в отрасли достаточно долго, чтобы знать, что "не должен" - это не то же самое, что "не должен", и этого достаточно, чтобы большинство разработчиков программного обеспечения повесились. Зная, что что-либо, кроме краткой ссылки на громкий данк, было бы пустой тратой моего времени, я в итоге позволил компании поругаться за рекомендации по конфигурациям, которые могут привести к поломке обычно используемого программного обеспечения без должного раскрытия.

Это подводит нас к вопросам и ответам. На этот раз я бы хотел, чтобы мы действительно разбирались в безумстве топовых CNAME, а не обошли стороной проблему, как мы обычно делаем, когда кто-то публикует сообщения на эту тему. RFC1912 запрещен, как и любой другой применимый здесь информационный RFC, о котором я не думал. Давайте закроем этого ребенка.

3 ответа

Решение

CNAME Первоначально записи были созданы для того, чтобы несколько имен, которые предоставляют один и тот же ресурс, были связаны с одним "каноническим именем" для ресурса. С появлением виртуального хостинга, основанного на именах, вместо этого стало обычным делом использовать их в качестве общей формы псевдонимов IP-адресов. К сожалению, большинство людей, которые приходят из веб-хостинга, ожидают CNAME записи, чтобы указать эквивалентность в DNS, который никогда не был намерением. Вершина содержит типы записей, которые явно не используются при идентификации канонического ресурса хоста (NS, SOA), который нельзя назвать псевдонимом без нарушения стандарта на фундаментальном уровне. (особенно в отношении зон сокращений)

К сожалению, оригинальный стандарт DNS был написан до того, как руководящие органы стандартов осознали, что для определения согласованного поведения необходимо явное словесное выражение ( RFC 2119). Необходимо было создать RFC 2181, чтобы прояснить несколько угловых случаев из-за расплывчатых формулировок, а обновленное словосочетание проясняет, что CNAME не может быть использован для достижения псевдонимов вершины без нарушения стандарта.

6.1. Зональная власть

Полномочные серверы для зоны перечисляются в записях NS для источника зоны, которые вместе с записью Start of Authority (SOA) являются обязательными записями в каждой зоне. Такой сервер является полномочным для всех записей ресурсов в зоне, которые не находятся в другой зоне. Записи NS, которые указывают на срез зоны, являются свойством созданной дочерней зоны, как и любые другие записи для происхождения этой дочерней зоны или любых ее поддоменов. Сервер для зоны не должен возвращать достоверные ответы на запросы, относящиеся к именам в другой зоне, которая включает в себя NS и, возможно, A, записи в разрезе зоны, если только он также не является сервером для другой зоны.

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

RFC 1034 был несколько расплывчатым в отношении проблем, которые могут возникнуть, когда CNAME существует наряду с другими типами записей. RFC 2181 устраняет неоднозначность и явно устанавливает типы записей, которые могут существовать вместе с ними:

10.1. Записи ресурса CNAME

DNS-запись CNAME ("каноническое имя") существует для предоставления канонического имени, связанного с псевдонимом. Для любого псевдонима может быть только одно такое каноническое имя. Это имя, как правило, должно быть именем, которое существует в другом месте в DNS, хотя существуют некоторые редкие приложения для псевдонимов с сопутствующим каноническим именем, неопределенным в DNS. Псевдоним (метка записи CNAME) может, если используется DNSSEC, иметь SIG, NXT и KEY RR, но может не иметь других данных. То есть для любой метки в DNS (любое доменное имя) верно только одно из следующих:

  • существует одна запись CNAME, опционально сопровождаемая SIG, NXT и KEY RR,
  • существует одна или несколько записей, ни одна из которых не является записями CNAME,
  • имя существует, но не имеет связанных RR любого типа,
  • имя не существует вообще.

"псевдоним" в этом контексте относится к левой стороне CNAME запись. Маркированный список ясно дает понять, что SOA, NS, а также A записи не могут быть видны в узле, где CNAME также появляется. Когда мы объединяем это с разделом 6.1, это невозможно CNAME существовать на вершине, как это должно было бы жить вместе с обязательным SOA а также NS записей.

(Похоже, это делает работу, но если у кого-то есть более короткий путь к доказательству, пожалуйста, дайте трещину.)


Обновить:

Кажется, что более свежая путаница связана с недавним решением Cloudflare разрешить определение незаконной записи CNAME на вершине доменов, для которых они будут синтезировать записи A. "Соответствие RFC", как описано в связанной статье, относится к тому факту, что записи, синтезированные Cloudflare, будут хорошо воспроизводиться с DNS. Это не меняет того факта, что это совершенно нестандартное поведение.

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

Консорциум Internet Systems недавно опубликовал статью о CNAME на вершине зоны, почему существует такое ограничение, и ряд альтернатив. Это вряд ли изменится в ближайшее время, к сожалению:

Мы не можем изменить способ использования специальной записи CNAME, не изменив одновременно все> реализации DNS-серверов в мире. Это потому, что его значение и интерпретация были строго определены в протоколе DNS; все текущие реализации клиента и сервера DNS соответствуют этой спецификации. Попытка "ослабить" использование CNAME на авторитетных серверах без одновременной смены всех работающих в настоящее время DNS-распознавателей приведет к нарушению разрешения имен (и веб-службы и службы электронной почты будут периодически недоступны для тех организаций, которые внедряют "расслабленные" авторитетные серверные решения).

Но есть надежда:

Другое потенциальное решение, обсуждаемое в настоящее время, добавило бы новый тип записи ресурса DNS, который могли бы искать браузеры, который мог бы существовать на вершине. Это будет специфичное для приложения имя хоста для http-запросов (аналогично тому, как работает MX).

Плюсы: это полностью соответствует дизайну DNS.
Минусы: это еще не доступно, и потребует обновления клиента браузера.

Если вы перенаправляете всю зону, вы должны использовать DNAME. Согласно RFC 6672,

DNAME RR и CNAME RR [RFC1034] вызывают поиск для (потенциально) возврата данных, соответствующих доменному имени, отличному от запрашиваемого доменного имени. Разница между этими двумя записями ресурсов заключается в том, что CNAME RR направляет поиск данных у своего владельца к другому отдельному имени, тогда как DNAME RR направляет поиск данных у потомков по имени его владельца по соответствующим именам в другом (одном) узле дерево.

Например, просмотрите зону (см. RFC 1034 [RFC1034], раздел 4.3.2, шаг 3) для доменного имени "foo.example.com", и запись ресурса DNAME найдена в "example.com", указывая чтобы все запросы в "example.com" были направлены на "example.net". Процесс поиска вернется к шагу 1 с новым именем запроса "foo.example.net". Если бы имя запроса было "www.foo.example.com", новое имя запроса было бы "www.foo.example.net".

Другие вопросы по тегам