Я считаю, что самый простой ответ на первый вопрос - «Нет, у вас есть« A »для этого», но я случайно установил какой-то поддомен, используя CNAME, указывающий на IP-адрес, и он работал на нескольких компьютерах в моем офисе. Интересно, как это было возможно?
Теперь, когда я проверяю это из дома, у меня следующая ошибка:
beast:~ viroos$ host somesubdomain.somedomain.com
Host somesubdomain.somedomain.com not found: 3(NXDOMAIN)
Я на 100% раньше работал в офисе (в настоящее время похоже, что это не так, но я проверяю это на другой машине). Поэтому я не на 100%, если он работал из-за какой-то специальной настройки сети или потому, что я тестировал его сразу после добавления записи DNS.
Я знаю, что эта история звучит немного безумно / невероятно, но может ли кто-нибудь помочь мне решить эту загадку.
// редактировать: я добавляю вывод Dig
; <<>> DiG 9.6-ESV-R4-P3 <<>> somesubdomain.somedomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 60224
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;somesubdomain.somedomain.com. IN A
;; ANSWER SECTION:
somesubdomain.somedomain.com. 67 IN CNAME xxx.xxx.xxx.xx1.
;; AUTHORITY SECTION:
. 1800 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2012040901 1800 900 604800 86400
;; Query time: 72 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Apr 10 00:11:01 2012
;; MSG SIZE rcvd: 136
Данные о CNAME
запись всегда должна быть другим DNS-именем - в этом весь смысл CNAME
.
Согласно RFC 1034, данные в CNAME
должно быть:
CNAME a domain name.
А если вы хотите указать на IP-адрес, то ваш билет:
A For the IN class, a 32 bit IP address
CNAME
разработан и реализован как псевдоним DNS; он не имеет представления о наличии IP-адреса в этом поле данных. Таким образом, он интерпретируется как псевдоним другого DNS-имени, как задумано; в конце концов, IP-адрес соответствует синтаксису DNS-имени.
Итак, например, допустим, ваши данные DNS:
somesubdomain.somedomain.com. 60 IN CNAME 192.0.2.1.
Рекурсивный DNS-сервер, который вы запрашиваете, видит, что запись является CNAME
, и указывает, что вам потребуются фактические данные, которые он содержит. Никакой записи, кроме CNAME
был найден, поэтому ответа клиенту нет.
Он пытается запросить запись для имени хоста 192
, в домене 0.2.1
. У него нет ничего кэшированного для этого имени, поэтому он запрашивает корневые серверы. Они обслуживают запросы на TLD, например .com
и .net
, но этот запрос является запросом .1
. Они оперативно отвечают, что такого нет, и это то, что вам отправляет рекурсер.
Ответ, который вы видите в dig
Ваш рекурсивный сервер имен говорит: «Ну, имя, которое вы искали, указывало куда-то еще, и это где-то не существовало - спросите корневой сервер, если вы мне не верите».
Итак, да, помещая IP-адрес в CNAME
запись никогда не бывает действительной, и я подозреваю, что работающие системы работают правильно через какой-то другой механизм, например, файл hosts или локальное разрешение имен - исследуйте их поведение при разрешении имен.
cname - это каноническое имя, которое является просто псевдонимом другого имени, которое обычно является записью A или другим cname и т. д. Если вы настроили cname для указания на IP, то это просто псевдоним этого IP. Я не думаю, что ваш DNS-сервер проверяет, является ли цель законной или нет, потому что стандартный RFC на самом деле не говорит, что такое формат данных / проверка для цели cname. Это не обычное использование, но если оно работает для вас, значит, оно работает. Я думаю, что того факта, что он иногда не работает, должно быть достаточно, чтобы вы могли использовать то, что он обычно используется.
Вы можете иметь:
example IN CNAME 1.2.3.4.
где 1.2.3.4 - рабочий IP-адрес. Обратите внимание на конечную точку в CNAME. Тот факт, что некоторые машины в вашем офисе работают с этим, в то время как другие не заставляет меня думать, что те, у которых есть субдомен, установленный в lmhosts
или /etc/hosts
файл.