Если у меня есть хосты example.com
и leaf.intermediate.example.com
записи DNS для example.com
, но у меня нет записей для intermediate.example.com
себя, это вызывает проблемы в некоторых ситуациях или это плохой стиль или этикет по какой-то причине? У меня есть веб-серверы, настроенные таким образом, и, кажется, все работает нормально, но я просто хотел проверить, что-то мне не хватает.
27
Ответы:
TL; DR: да, промежуточные субдомены должны существовать, по крайней мере, при запросе, для определения DNS; они могут не существовать в файле зоны, хотя.
Возможная путаница, чтобы устранить в первую очередь; Определение термина "пустой нетерминал"
Вы можете путать две вещи, как и другие ответы. А именно, что происходит при запросе имен по сравнению с тем, как вы настраиваете ваш сервер имен и содержимое файла зоны.
DNS является иерархическим. Для существования любого конечного узла все компоненты, ведущие к нему, ДОЛЖНЫ существовать в том смысле, что, если к ним обращаются, ответственный полномочный сервер имен должен отвечать за них без ошибок.
Как объяснено в RFC 8020 (который является просто повторением того, что всегда было правилом, но только некоторые поставщики DNS нуждались в напоминании), если на любой запрос авторитетный сервер имен отвечает NXDOMAIN (то есть: эта запись ресурса не существует), тогда это означает, что любой метки «под» этим ресурсом тоже не существует.
В вашем примере, если запрос для
intermediate.example.com
возвращенияNXDOMAIN
, то любые собственные рекурсивный сервер имен будут немедленно отвечатьNXDOMAIN
наleaf.intermediate.example.com
потому , что эта запись не может существовать , если все ярлыки в нем не существуют в виде записей.Об этом уже говорилось в RFC 4592 о подстановочных знаках (которые здесь не связаны):
Практический пример с доменными именами .US
Давайте возьмем рабочий пример из ДВУ с большим количеством исторических ярлыков, то есть
.US
. Выбрав любой пример в Интернете, давайте использоватьwww.teh.k12.ca.us
.Конечно, если вы запрашиваете это имя, или даже
teh.k12.ca.us
вы можете получить обратноA
записи. Здесь нет ничего убедительного для нашей цели (в середине есть даже CNAME, но нас это не волнует):Давайте запросим сейчас
k12.ca.us
(я не запрашиваю его у авторитетного сервера имен, но это фактически не меняет результат):Что мы узнаем из этого ответа?
Во-первых, это успех, потому что статус есть
NOERROR
. Если бы это было что-то еще и конкретно,NXDOMAIN
тоteh.k12.ca.us
и неwww.teh.k12.ca.us
могло бы существовать.Во-вторых, раздел ОТВЕТ пуст. Там нет
A
записей дляk12.ca.us
. Это не ошибка, этот тип (A
) не существует для этой записи, но, возможно, существуют другие типы записей для этой записи, или эта запись является ENT, или «Пустой нетерминал»: она пуста, но это не лист, есть вещи «ниже» этого (см. определение в RFC 7719 ), как мы уже знаем (но обычно разрешение сверху вниз, поэтому мы достигнем этого шага, прежде чем перейти на один уровень ниже, а не наоборот, как мы делаем здесь для демонстрации цель).Вот почему на самом деле в качестве ярлыка мы говорим, что код состояния
NODATA
: это не реальный код состояния, это просто означаетNOERROR
+ пустой раздел ОТВЕТ, что означает, что нет данных для этого конкретного типа записи, но могут быть и для других.Вы можете повторить тот же эксперимент для того же результата, если запросите следующую метку «вверх», то есть имя
ca.us
.Результаты запросов против содержимого файла зоны
Теперь откуда может возникнуть путаница? Я полагаю, что это может происходить из-за ложного представления о том, что любая точка в DNS-имени означает делегирование. Это неверно
example.com
Иными словами , ваш файл зоны может быть таким, и он полностью действителен и работает:С таким зональным файлом, запрашивая этот сервер имен, вы получите именно то поведение, которое наблюдалось выше: запрос для
intermediate.example.com
вернетсяNOERROR
с пустым ответом. Вам не нужно создавать его специально в файле зоны (если он вам не нужен по другим причинам), авторитетный сервер имен позаботится о синтезе «промежуточных» ответов, потому что он видит, что ему нужен этот пустой нетерминал (и любой другие "промежуточные", если были другие метки), поскольку он видит название листаleaf.intermediate.example.com
.Обратите внимание, что на самом деле это распространенный случай в некоторых областях, но вы можете его не увидеть, потому что он нацелен на большее количество «инфраструктурных» записей, которым люди не подвержены:
in-addr.arp
илиip6.arpa
, и особенно в последней. У вас будут такие записи,1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.a.1.d.e.1.6.8.0.0.0.0.0.0.2.6.2.ip6.arpa. 1h IN PTR text-lb.eqiad.wikimedia.org.
и, очевидно, в каждой точке нет ни делегирования, ни записей ресурсов, прикрепленных к каждой метке.SRV
записи, как_nicname._tcp.fr. 12h IN SRV 0 0 43 whois.nic.fr.
, домен может иметь много_proto._tcp.example.com
и_proto._udp.example.com
SRV
записи , потому что дизайн они должны иметь такую форму, но в то же время_tcp.example.com
и_udp.example.com
будет оставаться пустыми нетерминалы , потому что никогда не используется в качестве записейwhatever._domainkey.example.com
, но, очевидно_domainkey.example.com
, сам по себе никогда не будет использоваться, поэтому он останется пустым нетерминалом. Это то же самое дляTLSA
записей в DANE (например:_25._tcp.somehost.example.com. TLSA 3 1 1 BASE64==
) илиURI
записи (например:_ftp._tcp IN URI 10 1 "ftp://ftp1.example.com/public"
)Поведение сервера имен и генерация промежуточных ответов
Почему сервер имен автоматически синтезирует такие промежуточные ответы? Основной причиной этого является алгоритм разрешения ядра для DNS, как подробно описано в разделе 4.3.2 RFC 1034 , давайте возьмем его и подведем итоги в нашем случае при запросе к указанному выше авторитетному серверу имен для имени
intermediate.example.com
(этоQNAME
в протоколе ниже):Сервер имен находит зону
example.com
как ближайшего предка QNAME, поэтому мы можем перейти к шагу 3.Теперь у нас есть это:
Мы можем исключить случаи b и c, потому что в нашем файле зоны нет делегирования (следовательно, никогда не будет ни обращения ни к другим серверам имен, ни к случаю b), ни к подстановочным знакам (так что нет дела с).
Мы должны иметь дело только с делом а.
Мы начинаем сопоставление вниз, метка за меткой, в зоне. Поэтому, даже если у нас было длинное
sub.sub.sub.sub.sub.sub.sub.sub.example.com
имя, в какой-то момент мы приходим к случаю a: мы не нашли ни реферала, ни подстановочного знака, но мы в итоге получили окончательное имя, для которого мы хотели получить результат.Затем мы применяем остальную часть содержания кейса:
Не наш случай, мы пропускаем это.
Независимо от QTYPE мы выбираем (
A
,AAAA
,NS
и т.д.) , мы не имеем для записи ресурсов ,intermediate.example.com
поскольку он не появляется в zonefile. Так что копия здесь пуста. Теперь мы заканчиваем на шаге 6:Здесь не актуально для нас, поэтому мы заканчиваем с успехом.
Это точно объясняет наблюдаемое поведение: такие запросы будут возвращаться,
NOERROR
но данных тоже нет.Теперь вы можете спросить себя: «но тогда, если я использую какое-либо имя, как, например,
another.example.com
по вышеуказанному алгоритму, я получу тот же ответ (без ошибок)», но наблюденияNXDOMAIN
в этом случае будут сообщаться .Зачем?
Поскольку весь алгоритм, как объяснено, начинается с этого:
Это означает, что указанный выше файл зоны преобразуется в это дерево:
Поэтому, следуя алгоритму сверху, вы действительно можете найти путь:
com > example > intermediate
(потому что путьcom > example > intermediate > leaf
существует) Ноanother.example.com
, послеcom > example
того , как вы не найдетеanother
метку в дереве, как дочерний узелexample
. Следовательно, мы попадаем в часть выбора c сверху:этикетка
*
не существует, и мы не следовали заCNAME
, следовательно, мы в случае:,set an authoritative name error in the response and exit
иначеNXDOMAIN
.Обратите внимание, что все вышеперечисленное создавало путаницу в прошлом. Это собрано в некоторых RFC. Посмотрите, например, это неожиданное место (радость спецификаций DNS, являющихся настолько непроницаемыми), определяющих подстановочные знаки: RFC 4592 «Роль подстановочных знаков в системе доменных имен» и, в частности, его раздел 2.2 «Правила существования», также частично цитируемый в начале мой ответ, но здесь он более полный:
И тогда определение в следующем разделе - это параграф, который я цитировал в начале.
Обратите внимание , что RFC 8020 (на
NXDOMAIN
самом деле это означаетNXDOMAIN
, что если вы отвечаетеNXDOMAIN
наintermediate.example.com
, тоleaf.intermediate.example.com
не может существовать) было поручено отчасти потому , что различные провайдеры DNS не следовать этой интерпретации , и что созданный хаос, или они были просто ошибки, смотри, например , это один исправлено в 2013 году в одном открытом официальном коде сервера имен: https://github.com/PowerDNS/pdns/issues/127Людям нужно было ввести конкретные меры противодействия только для них: это не является агрессивным кэшированием,
NXDOMAIN
потому что для тех провайдеров, если вы заходитеNXDOMAIN
на какой-то узел, это может означать, что вы получаете что-то ещеNXDOMAIN
на другом узле под ним.И это делало невозможным получение минимизации QNAME (RFC 7816) ( более подробную информацию см. В https://indico.dns-oarc.net/event/21/contributions/298/attachments/267/487/qname-min.pdf ). , в то время как это требовалось для повышения конфиденциальности. Наличие пустых нетерминалов в случае DNSSEC также создавало проблемы в прошлом, связанные с обработкой несуществования (см. Https://indico.dns-oarc.net/event/25/contributions/403/attachments/378/647. /AFNIC_OARC_Dallas.pdf, если вы заинтересованы, но вам действительно нужно хорошее понимание DNSSEC, прежде чем).
В следующих двух сообщениях приведен пример проблем, которые один провайдер должен был уметь правильно применять в отношении этого правила для пустых нетерминалов, он дает некоторое представление о проблемах и причинах их возникновения:
источник
Возможно, я неправильно понял ответ Халеда, но отсутствие промежуточных записей ни в коем случае не должно быть проблемой с разрешением субзонного имени. Обратите внимание, что эти выходные данные копий не принадлежат авторитетному DNS-серверу
teaparty.net
или любой его подзоне и не направлены на него:В самом деле, вы должны быть в состоянии сделать это
dig
самостоятельно и получить этот ответ -teaparty.net
это реальная область, находящаяся под моим контролем и действительно содержащая этуA
запись. Вы можете проверить, что нет записей для любой из этих зон междуvery
иteaparty.net
и что это не влияет на ваше разрешение вышеуказанного имени хоста.источник
teaparty.net
записи в одном файле зоны, поэтому пустые записи синтезируются для промежуточных доменов. Может кто-нибудь объяснить, что произойдет, еслиparents.teaparty.net
это делегирование, котороеvery.deep.host.with.no.immediate
имеет запись только в файле зоны делегатов?teaparty.net
делегированный поддоменnet
; если бы единственная запись A в его файле зоныvery.deep...
не имела бы значения.Если вы обращаетесь напрямую к официальному DNS-серверу, вы получите ответы без проблем.
Тем не менее, вы не получите правильный ответ, если вы запрашиваете через другой DNS-сервер, который не имеет действительного кэша. Запрос на
intermediate.example.com
приведет кNXDOMAIN
ошибке.источник
NXDOMAIN
, это должно привести кNOERROR
коду и пустому разделу ответа.intermediate.example.com
если она ни для чего не используется. Так что, даже если он возвращает ошибку (это не так), какая разница?NXDOMAIN
, вы получитеNOERROR
. Это ответ для узла, который существует в иерархии DNS, но не имеет записей запрошенного типа.NS
записи, но вы запрашиваетеA
записи, вы получитеNOERROR
пустой ответ.NXDOMAIN
заintermediate.example.com
то , что означает , что нет ничего «ниже» , а затемleaf.intermediate.example.com
не может существовать. Некоторые агрессивные рекурсивные средства распознавания могут даже кешировать это и сами вычитать вещи.Чтобы напрямую ответить на вопрос, нет, вам не нужно добавлять записи для промежуточных имен, которые вы на самом деле не используете, однако это не означает, что эти имена не существуют.
Что касается того, существуют ли эти имена или нет, то на самом деле это отдельный вопрос, на который я надеюсь дать краткий и довольно интуитивный ответ.
Все сводится к тому, что DNS является древовидной структурой, где каждая метка в доменном имени является древовидным узлом. Например ,
www.example.com.
имеет меткиwww
,example
,com
и `` (корневой узел), которые являются узлами дерева , которые образуют путь всего путь к корню.Что, возможно, делает эту фундаментальную природу DNS неочевидной, так это то, что почти всегда при управлении данными DNS нет дерева, которое можно увидеть, и мы обычно не работаем непосредственно с самими узлами дерева, вместо этого мы обычно имеем плоский список записей данные, которые должны существовать в разных доменных именах (по сути, древовидные пути, как указано выше).
Что происходит , когда этот сплющенный список используется в том , что программное обеспечение сервера DNS строит дерево на основе существующих записей, и , если есть пробелы между узлами , которые имеют записи (например , есть записи для
foo.bar.example.com.
и ,example.com.
но неbar.example.com.
) они просто считали пустое дерево узлы. То есть это доменные имена / узлы, которые действительно существуют, дерево не сломано, эти узлы просто не имеют никаких данных, связанных с ними.Следовательно, если вы запросите один из этих пустых узлов, вы получите
NODATA
ответ (NOERROR
статус +SOA
в разделе полномочий), в котором говорится, что запрошенный тип записи не существует на этом узле. Если вместо этого вы запросите какое-то имя, которое на самом деле не существует, вы получитеNXDOMAIN
ответ, в котором говорится, что запрошенное доменное имя не существует в дереве.Теперь, если вам нужны подробности, прочитайте очень подробный ответ Патрика Мевзека.
источник