dig возвращает неправильный тип записи

Похоже, я либо упускаю что-то очевидное, либо об этом уже спрашивали раньше. Когда я запрашиваю dig с использованием -t Параметр для указания типа записи DNS, результат, кажется, содержит ответ, даже если возвращаемая запись имеет другой тип записи. Вот пример:

$ dig -t A -q polestar.databaseguy.com.

; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> -t A polestar.databaseguy.com.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33130
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;polestar.databaseguy.com.      IN      A

;; ANSWER SECTION:
polestar.databaseguy.com. 3600  IN      CNAME   databaseguy.ddns.net.
databaseguy.ddns.net.   60      IN      A       173.19.127.251

;; Query time: 30 msec
;; SERVER: 10.0.10.1#53(10.0.10.1)
;; WHEN: Mon Dec 10 14:41:50 STD 2018
;; MSG SIZE  rcvd: 103

CNAME а также A записи, перечисленные в ANSWER SECTION верны. Тем не менее CNAME для polestar.databaseguy.com. и A для databaseguy.ddns.net., Здесь нет A запись дляpolestar.databaseguy.com., что я и просил, поэтому я ожидал, что не будет никаких результатов.

Я довольно уверен, что это правильное поведение, но я не понимаю его и не вижу никакого объяснения в man dig страницы. Я также не мог найти другие обсуждения в Интернете, ни на этом сайте, ни где-либо еще. Может кто-нибудь помочь мне понять это?

1 ответ

Решение

Это ожидаемое поведение, которое уменьшает количество необходимых обменов, и является специфическим для CNAME запись.

Он охватывается основными документами по DNS: RFC1034, раздел 3.6.2.

Видеть это:

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

С наглядным примером, который полностью соответствует вашему случаю:

Например, предположим, что сервер имен обрабатывал запрос для USC-ISIC.ARPA, запрашивал информацию типа A и имел следующие записи ресурсов:

USC-ISIC.ARPA   IN      CNAME   C.ISI.EDU

C.ISI.EDU       IN      A       10.0.0.52

Оба этих RR будут возвращены в ответе на запрос типа A, в то время как запрос типа CNAME или * должен возвращать только CNAME.

Смотрите раздел 5.2.2 для других вопросов. В разделах 6.2.7 и 6.2.8 также приведены примеры.

Это также зависит от того, запрашиваете ли вы рекурсивный или авторитетный сервер имен.

databaseguy.com имеет для серверов имен:

pdns01.domaincontrol.com.
pdns02.domaincontrol.com.

Если вы запросите один из них:

$ dig A polestar.databaseguy.com. @pdns01.domaincontrol.com.

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @pdns01.domaincontrol.com.
;; global options: +cmd
;; Sending:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64115
;; flags: rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: e45ebc418c94c90a
;; QUESTION SECTION:
;polestar.databaseguy.com. IN A

;; QUERY SIZE: 65

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64115
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;polestar.databaseguy.com. IN A

;; ANSWER SECTION:
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.

Вы получаете только значение CNAME, потому что этот авторитетный сервер имен знает только это и не является полномочным для ddns.net,

Но если вы спросите любого рекурсивного сервера имен, он выполнит работу рекурсии и даст вам "полный" ответ:

$ for ns in 1.1.1.1 8.8.8.8 9.9.9.9 80.80.80.80 ; do dig A polestar.databaseguy.com. @$ns +noall +ans ; done

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @1.1.1.1 +noall +ans
;; global options: +cmd
;; connection timed out; no servers could be reached

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @8.8.8.8 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 59m59s IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net.   59s IN A 173.19.127.251

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @9.9.9.9 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net.   1m IN A 173.19.127.251

; <<>> DiG 9.12.0 <<>> A polestar.databaseguy.com. @80.80.80.80 +noall +ans
;; global options: +cmd
polestar.databaseguy.com. 1h IN CNAME databaseguy.ddns.net.
databaseguy.ddns.net.   1m IN A 173.19.127.251

(1.1.1.1 не ответил на мой запрос, но это не имеет значения здесь для этого вопроса)

Так что насчет "Нет записи A forpolestar.databaseguy.com., О которой я и просил, поэтому я ожидал, что результатов не будет". это наполовину неправильно, потому что это имя имеет CNAME, что означает другое каноническое имя, и это каноническое имя имеет A запись, так что в конце дня это точно так, как если бы начальное имя имело A запись. Любое приложение, локально запрашивающее у ОС IP-адрес этого хоста, получит запись A, поскольку ОС позаботится о полном рекурсивном разрешении и "разыменовании" CNAME.

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