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

Почему записи NS не содержат IP-адреса?

Смысл записи NS состоит в том, чтобы сообщить клиенту, какой сервер имен наверняка будет знать фактический IP-адрес для доменного имени. Так, например, следующий запрос сообщает вам, что если вы хотите получить авторитетный ответ о facebook.com ты должен спросить a.ns.facebook.com:

> dig ns facebook.com                                                                                                                                       19:58:27

; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> ns facebook.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32063
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;facebook.com.          IN  NS

;; ANSWER SECTION:
facebook.com.       65000   IN  NS  a.ns.facebook.com.
facebook.com.       65000   IN  NS  b.ns.facebook.com.

;; Query time: 13 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Mar 20 19:58:40 CET 2016
;; MSG SIZE  rcvd: 65

Это кажется крутым и полезным, но мне интересно, почему ANSWER раздел содержит имя хоста, а не IP-адрес авторитетного источника? Разве для клиента не было бы проще получить фактический IP-адрес авторитетного источника, а не имя хоста?

Я имею в виду, что если он получит имя хоста, ему придется сделать еще один запрос, чтобы преобразовать это имя хоста в IP, а затем спросить этот новый IP о начальном facebook.com домен, который он искал. Разве это не неэффективно?

Мне было бы интересно получить ответ, который указывает мне на некоторые параграфы в каком-то RFC, объясняющие эту проблему.

Джейсон предоставил механизм DNS, который работает с описанной вами проблемой, но мы до сих пор не рассмотрели Зачем все делается так.

Скажем, что я владею example.com, и я заключил контракт на поставку некоторых материалов моего веб-сайта с компанией по доставке контента под названием Contoso. Их платформа требует, чтобы мы делегировали sub.example.com к своим серверам имен, чтобы они могли контролировать, какие ответы возвращаются.

; SOA and MX omitted from this example
$ORIGIN example.com.

@           IN      NS            ns1
@           IN      NS            ns2

; delegate sub.example.com to Contoso's nameservers
sub         IN      NS            ns1.cdn.contoso.com.
sub         IN      NS            ns2.cdn.contoso.com.

; this is ours, not Contoso's
www         IN      A             198.51.100.1

Как вы отметили, мы не указали IP-адреса серверов имен Contoso. Все, что знает наш сервер, - это сообщать Интернету "мы не справляемся sub.example.com, вместо этого спросите Contoso ". Это очень важно, потому что:

  • Мы не владеем Contoso.com.
  • Мы не можем ожидать, что Contoso будет координировать изменение IP-адресов своих серверов имен со всеми своими клиентами. Это именно то, что должно было бы произойти, если бы наш сервер предоставлял эти IP-адреса.

Все идет нормально. Проходит год, и без нашего ведома Contoso меняет IP-адреса своих серверов имен CDN. Поскольку DNS работает именно так, все, что им нужно сделать, это обновить A записи, за которые они возвращаются ns1.cdn и ns2.cdn.contoso.com..

Это подводит нас к важному моменту: связующие записи, описанные Джейсоном, существуют для работы со сценариями «курица и яйцо» в DNS, например google.com рассказывая миру, что их серверы имен ns1.google.com и ns2.google.com. Вам следует никогда создавать связующие записи, указывающие на инфраструктуру, которой вы не владеете, если они не существуют для решения такой проблемы:

@           IN      NS            ns1
@           IN      NS            ns2

; delegate sub.example.com to ns1 and ns2.sub.example.com
sub         IN      NS            ns1.sub
sub         IN      NS            ns2.sub

; provide the IP addresses of ns1 and ns2 so that nameservers
; on the internet can find them.
;
; these IP addresses are owned by Contoso, not us, and they must
; coordinate changes to these IPs with us
ns1.sub     IN       A            203.0.113.10
ns1.sub     IN       A            203.1.113.10

Это позволяет избежать сценария с курицей и яйцом, но также позволяет Contoso координировать каждое изменение IP этих серверов имен с нами. Это очень рискованно и нежелательно.

Решением проблемы являются связующие записи DNS, которые описаны на Что такое клейкая пластинка?.

RFC 1035, раздел 3.3.11 состояния

«... Обратите внимание, что класс может не указывать семейство протоколов, которое должно использоваться для связи» с хостом, хотя обычно это сильный намек ».

Возврат IP-адреса был бы равносилен указанию метода, с помощью которого можно связаться с хостом, что противоречит RFC.