Когда преобразователь ищет 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
) установлен флаг. Короче говоря, вы должны увидеть эту проблему только в следующих двух сценариях: