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

Разрешение CNAME - кто ищет последующую запись A - преобразователь или сервер?

Когда преобразователь ищет CNAME, он, по-видимому, сначала отправляет запрос записи A на DNS-сервер. Предполагается ли, что DNS-сервер определит, что запрос на самом деле предназначен для CNAME, или же преобразователь должен повторить запрос, но для типа CNAME? Я спрашиваю, потому что - и вот в чем особенность - у нас есть «внутренний» домен верхнего уровня, который мы используем в нашей внутренней локальной сети, назовем его «домен1», а запрашиваемый мной DNS-сервер является официальным сервером для «domain1» (и рекурсивен для всего остального.) То, что мой хост (Centos 6.8) на самом деле отправляет, это запрос на запись A:

16:15:45.837525 IP (tos 0x0, ttl 64, id 36911, offset 0, flags [none], proto UDP (17), length 62)
myhost.domain1.40684 > dnsserver.domain1.domain: 15355+ A? cfengine.domain1. (34)
Reply - a servfail:
16:15:45.837762 IP (tos 0x0, ttl 64, id 49982, offset 0, flags [DF], proto UDP (17), length 62)
dnsserver.domain1.domain > myhost.domain1.40684: 15355 ServFail 0/0/0 (34)

Если я сделаю раскопки для типа CNAME, я получу правильную запись CNAME (хотя A rec не возвращается как ДОПОЛНИТЕЛЬНЫЕ данные):

cfengine.domain1.   3600    IN  CNAME   helm02.domain2.

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

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

Предполагая, что он должен работать, кто отвечает за выяснение, что мой запрос на самом деле относится к записи CNAME, а не к записи A? DNS-сервер или мой резолвер?

Если сервер является авторитетным для определенного имени, имеет CNAME record для этого имени он должен отвечать этой записью на запросы для всех типов записей.

Если сервер выполняет рекурсию, запрашивает тип записи, который не является CNAME, но получает CNAME ответ, то он должен перезапустить запрос с именем из CNAME запись, объедините ответ от перезапущенного запроса с CNAME response и вернуть объединенный ответ тому, для кого он выполнял рекурсию.

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

В SERVFAIL должен исчезнуть, если вы снова попробуете этот запрос с +norecurse. dig предполагает, что по умолчанию желательна рекурсия, и SERVFAIL - правильный ответ для возврата, если была запрошена рекурсия и не удалось разрешить цель псевдонима.

Рекурсивные серверы, которые запрашивают ваш авторитетный сервер, не должны делать запросы с желаемой рекурсией (RD=1) установлен флаг. Короче говоря, вы должны увидеть эту проблему только в следующих двух сценариях:

  1. Вы запускаете эту транзакцию вручную и забываете отключить рекурсию.
  2. Кто-то написал (плохую) реализацию рекурсивного сервера имен, и автор не позаботился снять флажок желаемой рекурсии при выполнении авторитетных поисков. Рекурсивный сервер имен не должен просить полномочные серверы выполнять рекурсию от его имени.