DNS для веб-разработчиков | Chrome World по-русски

DNS для веб-разработчиков

Допустим, я хочу посетить www.ianjmacintosh.com. Чтобы мой браузер мог его увидеть, моему браузеру необходимо знать IP-адрес, с которого он будет запрашиваться. Сначала мой браузер проверит, есть ли уже кэшированная запись www.ianjmacintosh.comIP-адреса. Эта запись называется запись адреса, или запись A. Если у меня нет A-записи, мой браузер запрашивает ее у моего преобразователя DNS. Преобразователи DNS предоставляют клиентам любые запрошенные ими записи, и их предоставляет каждый крупный интернет-провайдер. Я собираюсь продемонстрировать, как использовать инструмент командной строки (digсокращенно от Domain Information Groper ), чтобы вручную запрашивать записи из общедоступного преобразователя DNS Google и других серверов имен.

dig выполняет поиск в DNS и отображает полученные ответы. Большинство администраторов DNS используют dig для устранения проблем с DNS из-за его гибкости, простоты использования и ясности вывода. Он предустановлен в большинстве систем Mac OS X и Linux, но пользователям Windows, которые хотят его использовать, необходимо установить его вручную. Если вы читаете это в другой ОС (например, Android или iOS), вы можете попробовать воспользоваться веб-клиентом для раскопок, подобным этому случайному, который я нашел, но вы, вероятно, получите больше от этой статьи, прочитав сейчас и запустив команды позже на компьютере с локальной установкой dig.

Попробуйте свой первый digзапрос:

dig @8.8.8.8 www.ianjmacintosh.com A +short

Этот вызов запрашивает 8.8.8.8(IP-адрес общедоступного преобразователя DNS Google) для записи www.ianjmacintosh.comʼs A(адреса). Опция +shortзапроса просит копать, чтобы дать краткий ответ.

Этот краткий ответ выглядит так:

54.207.147.214
18.230.52.212

Это IP-адреса, к которым DNS-распознаватель Google сказал, что я должен связаться, если я хочу www.ianjmacintosh.com.

Даже если вы перестанете читать сейчас, по крайней мере, вы увидели, как быстро связать IP-адрес с доменным именем.

DNS деревья

Представьте, у вас есть путь в локальной файловой системе: /Users/alice/projects/next-great-american-novel. next-great-american-novelКаталог находится в projectsкаталоге, который находится в aliceдиректории, которая находится в Usersдиректории, которая находится в корневой (/каталог). Ученые-компьютерщики называют эту абстрактную идею деревом.

Связь между com, ianjmacintoshи wwwтакая же, даже несмотря на то, что она написана справа налево, а не слева направо. Вместо того, чтобы просматривать каталоги в нашей локальной файловой системе, мы запрашиваем DNS-серверы в удаленных системах. Эти серверы называются серверами имен .

Чтобы получить запись A www.ianjmacintosh.com, преобразователь DNS запрашивает сервер имен com, которому он уже доверяет, который указывает ему на другой сервер имен, который знает все ianjmacintosh.com, а также на другой сервер имен, который знает все www.ianjmacintosh.com.

На самом деле это не совсем так; DNS-преобразователи и серверы имен иногда имеют записи, кэшированные локально, и им даже не нужно делать запрос. Если сервер имен имеет кэшированную запись для ianjmacintosh.com, он будет начинаться оттуда, а не подниматься вверх, чтобы найти запись для www.ianjmacintosh.comили pozo.ianjmacintosh.comили другого поддомена ianjmacintosh.com.

Кроме того, иногда сервер имен делает соответствующий следующий запрос от имени запрашивающего, избавляя запрашивающего от проблем. Следующий сервер, в свою очередь, может сделать то же самое, избавляя запрашивающий сервер имен от необходимости делать дополнительный запрос. Это может продолжаться бесконечно и называется рекурсивным поиском.

Обычно это полезно, потому что помогает распределить работу, необходимую для поиска записей, но в нашем случае мы не хотим распространять эту работу! Мы хотим все делать сами. Итак, мы собираемся использовать dig, чтобы сообщить серверам имен, для которых нам нужна запись A www.ianjmacintosh.com, но мы не хотим рекурсии.

⌨️ Запрос 8.8.8.8на www.ianjmacintosh.comто адрес (A) запись с +norecurseопцией запроса

Вот синтаксис, который мы будем использовать digв этой статье:

dig [@server] [name] [type] [queryopt...]

Я буду использовать смайлы на клавиатуре (⌨️), чтобы указывать на запросы, которые я бы хотел, чтобы вы выполняли dig. Я опишу их простым английским языком, ваше упражнение будет заключаться в вызове настоящих команд. Попробуйте написать каждую команду самостоятельно, прежде чем сравнивать с тем, как это сделал я.

??‍♂️ Пытаться угнаться за тем, как все это работает мысленно, без запуска команд сложно и глупо. Если можете, перейдите в командную строку, чтобы следить за ней и максимально эффективно использовать эту статью.

Попробуйте составить команду для запроса 8.8.8.8 www.ianjmacintosh.comадресной записи с параметром запроса + norecurse самостоятельно. Ниже вы можете увидеть призыв, который я использовал ?

dig @8.8.8.8 www.ianjmacintosh.com A +norecurse

Эти аргументы и варианты:

  • 8.8.8.8это сервер для запроса: общедоступный DNS-преобразователь Google. Я поставил @спереди, потому что это то, что предписывает digʼs documentation (man dig). Если вы опустите этот [@server]аргумент, dig проконсультируется /etc/resolv.confи запросит перечисленные там серверы имен.
  • www.ianjmacintosh.com– это имя записи ресурса, которую нужно найти.
  • Aэто тип записи, которую мы запрашиваем – мы ищем запись «A» (запись адреса). Если вы опустите этот [type]аргумент, dig все равно выполнит поиск записи A, но я всегда предпочитаю быть максимально подробным и явным при отображении примеров.
  • +norecurseпараметр запроса для отключения рекурсии (и итерации). Вкратце: это говорит серверам НЕ выполнять за нас дополнительную работу. Если вы его опустите [queryopt], запрашиваемый сервер может избавить вас от необходимости выполнять дополнительные упражнения для поиска нашего ресурса. Так как мы пытаемся получить практику, это плохо!
  • ПРИМЕЧАНИЕ. Возможно, вы заметили, что я пропустил эту +shortопцию. В оставшейся части статьи я буду работать с подробными отчетами.

Собираем все вместе: эта команда дает команду dig запросить 8.8.8.8запись с именем www.ianjmacintosh.comтипа Aи просит сервер не выполнять рекурсивный поиск.

Прочтите ответ и обратите внимание, что вы получили ошибку

dig вернет отчет, подобный этому:

; <<>> DiG 9.10.6 <<>> @8.8.8.8 www.ianjmacintosh.com A +norecurse
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 25344
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.ianjmacintosh.com.     IN  A

;; Query time: 40 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Nov 24 15:42:43 -03 2020
;; MSG SIZE  rcvd: 50

Вместо того, чтобы пытаться понять все это, перейдите к разделу заголовка (->> HEADER <<-) и посмотрите, как он читается status: SERVFAIL. Это сокращение от «сбой сервера» и означает, что сервер имен не смог обработать этот запрос из-за проблемы с сервером имен. Вы не задали плохой вопрос, но он не мог дать вам настоящего ответа. Если бы он действительноANSWER SECTION давал ответ, он бы показал большой раздел с заголовком, в котором была бы наша запрошенная запись. Это также явно указано ANSWER: 0в строке ниже SERVFAIL.

Короче говоря, этот отчет показывает нам, что у общедоступного DNS-преобразователя Google нет адресной записи www.ianjmacintosh.com. Если вы снова +shortзапустите эту команду и добавите параметр, вы получите пустой ответ.

Причина, по которой мы получили ответ, когда мы запускали digраньше, заключалась в том, что мы не отключили рекурсию, а общедоступный DNS-преобразователь Google проделал за нас дополнительную работу. Эта дополнительная работа началась с обращения к так называемым «корневым серверам имен».

Домен верхнего уровня comявляется частью .(произносится как «корень»), точно так же, как www.ianjmacintosh.comявляется частью ianjmacintosh.com, а подобное ianjmacintosh.comявляется частью com. Чтобы явно показать корень доменного имени, DNS часто использует конечную точку при отображении доменных имен, например: www.ianjmacintosh.com.Это называется «полное доменное имя» (FQDN), и это завершающее .слово имеет то же значение, что и начало /в абсолютный путь (например, /Users/alice/projects/next-great-american-novel): root.

Каждый поиск должен где-то начинаться, и поэтому наш поиск www.ianjmacintosh.comзаписи адреса должен начинаться с корня. Мы ищем записи сервера имен, а не адресную запись – мы не пытаемся открыть ее .в нашем браузере. По этой причине нам нужно изменить наш [type]аргумент с A(для «адреса») на NS(для «сервера имен»).

⌨️ Запрос 8.8.8.8на свое .название сервера (NS) записи с+norecurse

dig @8.8.8.8. NS +norecurse

Эти аргументы и варианты:

  • 8.8.8.8 общедоступный DNS-преобразователь Google
  • . является корнем всех доменных имен
  • NS сокращенно от «DNS-сервер»
  • +norecurse все еще мешает серверу выполнять наши упражнения за нас

Собираем все вместе: эта команда дает команду dig запросить 8.8.8.8запись с именем .типа NSи просит сервер не выполнять рекурсивный поиск.

Найдите корневой сервер из отчета об ответе

; <<>> DiG 9.10.6 <<>> @8.8.8.8. NS +norecurse
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51781
;; flags: qr ra ad; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;.              IN  NS

;; ANSWER SECTION:. 86755   IN  NS  a.root-servers.net.. 86755   IN  NS  b.root-servers.net.. 86755   IN  NS  c.root-servers.net.. 86755   IN  NS  d.root-servers.net.. 86755   IN  NS  e.root-servers.net.. 86755   IN  NS  f.root-servers.net.. 86755   IN  NS  g.root-servers.net.. 86755   IN  NS  h.root-servers.net.. 86755   IN  NS  i.root-servers.net.. 86755   IN  NS  j.root-servers.net.. 86755   IN  NS  k.root-servers.net.. 86755   IN  NS  l.root-servers.net.. 86755   IN  NS  m.root-servers.net.

;; Query time: 34 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Nov 25 17:39:56 -03 2020
;; MSG SIZE  rcvd: 239

Вот это да! Это больше походит на это! ?

Во-первых, посмотрите заголовок, где написано status: NOERROR. Нет ошибок! И в следующей строке, где было сказано ANSWER: 0раньше, теперь говорится ANSWER: 13. У нас есть собственно ANSWER SECTIONс 13 различными корневыми серверами имен, любой из которых должен иметь возможность отвечать на запрос записи сервера имен для com.

Выберите одно наугад и используйте его в следующем запросе.

Кстати, вместо того, чтобы использовать IP-адрес для сервера, на который будет отправлен ваш следующий запрос, вы можете использовать доменное имя. Перед отправкой запроса dig незаметно запросит у вашего DNS-распознавателя его IP-адрес в фоновом режиме. Вместо этого 8.8.8.8вы можете использовать dns.google. Вместо этого 198.41.0.4можно использовать a.root-servers.net.

⌨️ Запросить у корневого DNS-сервера запись coms NS+norecurse)

dig @a.root-servers.net com NS +norecurse

Эти аргументы и варианты:

  • a.root-servers.net– это сервер, который мы запрашиваем для записи сервера имен для домена верхнего уровня com.
  • com это название записи, которую мы просим
  • NS сокращенно от «DNS-сервер»
  • +norecurseне a.root-servers.netвыполняет рекурсивный поиск

Получить comсервер имен из отчета

; <<>> DiG 9.10.6 <<>> @a.root-servers.net com NS +norecurse
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16916
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 27

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

;; AUTHORITY SECTION:
com.            172800  IN  NS  e.gtld-servers.net.
com.            172800  IN  NS  b.gtld-servers.net.
com.            172800  IN  NS  j.gtld-servers.net.
com.            172800  IN  NS  m.gtld-servers.net.
com.            172800  IN  NS  i.gtld-servers.net.
com.            172800  IN  NS  f.gtld-servers.net.
com.            172800  IN  NS  a.gtld-servers.net.
com.            172800  IN  NS  g.gtld-servers.net.
com.            172800  IN  NS  h.gtld-servers.net.
com.            172800  IN  NS  l.gtld-servers.net.
com.            172800  IN  NS  k.gtld-servers.net.
com.            172800  IN  NS  c.gtld-servers.net.
com.            172800  IN  NS  d.gtld-servers.net.

;; ADDITIONAL SECTION:
e.gtld-servers.net. 172800  IN  A   192.12.94.30
e.gtld-servers.net. 172800  IN  AAAA    2001:502:1ca1::30
b.gtld-servers.net. 172800  IN  A   192.33.14.30
b.gtld-servers.net. 172800  IN  AAAA    2001:503:231d::2:30
j.gtld-servers.net. 172800  IN  A   192.48.79.30
j.gtld-servers.net. 172800  IN  AAAA    2001:502:7094::30
m.gtld-servers.net. 172800  IN  A   192.55.83.30
m.gtld-servers.net. 172800  IN  AAAA    2001:501:b1f9::30
i.gtld-servers.net. 172800  IN  A   192.43.172.30
i.gtld-servers.net. 172800  IN  AAAA    2001:503:39c1::30
f.gtld-servers.net. 172800  IN  A   192.35.51.30
f.gtld-servers.net. 172800  IN  AAAA    2001:503:d414::30
a.gtld-servers.net. 172800  IN  A   192.5.6.30
a.gtld-servers.net. 172800  IN  AAAA    2001:503:a83e::2:30
g.gtld-servers.net. 172800  IN  A   192.42.93.30
g.gtld-servers.net. 172800  IN  AAAA    2001:503:eea3::30
h.gtld-servers.net. 172800  IN  A   192.54.112.30
h.gtld-servers.net. 172800  IN  AAAA    2001:502:8cc::30
l.gtld-servers.net. 172800  IN  A   192.41.162.30
l.gtld-servers.net. 172800  IN  AAAA    2001:500:d937::30
k.gtld-servers.net. 172800  IN  A   192.52.178.30
k.gtld-servers.net. 172800  IN  AAAA    2001:503:d2d::30
c.gtld-servers.net. 172800  IN  A   192.26.92.30
c.gtld-servers.net. 172800  IN  AAAA    2001:503:83eb::30
d.gtld-servers.net. 172800  IN  A   192.31.80.30
d.gtld-servers.net. 172800  IN  AAAA    2001:500:856e::30

;; Query time: 401 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Nov 25 18:12:00 -03 2020
;; MSG SIZE  rcvd: 828

Джимини Крикет! Это много информации! Мы получили 13 прав доступа на выбор для comзаписей и дополнительный раздел, содержащий все их IP-адреса.

Все эти 13 серверов имен имеют записи для каждого зарегистрированного домена com. В самом деле!

⌨️ Спросите у comDNS ianjmacintosh.com-сервера запись о DNS-сервере (+norecurseкак обычно)

dig @192.31.80.30 ianjmacintosh.com NS  +norecurse
  • 192.31.80.30– это сервер, который мы запрашиваем для записи сервера имен для домена верхнего уровня com.
    • d.gtld-servers.netВместо этого я мог бы так же легко использовать его и позволить dig находить его IP-адрес в фоновом режиме, но, поскольку у меня уже был IP-адрес передо мной, я использовал его.
  • ianjmacintosh.com это название записи, которую мы просим
  • NS сокращенно от «DNS-сервер»
  • +norecurseне 192.31.80.30выполняет рекурсивный поиск

Получить ianjmacintosh.comсервер имен из отчета

; <<>> DiG 9.10.6 <<>> @192.31.80.30 ianjmacintosh.com NS +norecurse
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30145
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ianjmacintosh.com.     IN  NS

;; AUTHORITY SECTION:
ianjmacintosh.com.  172800  IN  NS  dns1.p03.nsone.net.
ianjmacintosh.com.  172800  IN  NS  dns2.p03.nsone.net.
ianjmacintosh.com.  172800  IN  NS  dns3.p03.nsone.net.
ianjmacintosh.com.  172800  IN  NS  dns4.p03.nsone.net.

;; Query time: 411 msec
;; SERVER: 192.31.80.30#53(192.31.80.30)
;; WHEN: Wed Nov 25 18:37:01 -03 2020
;; MSG SIZE  rcvd: 135

Любой из этих четырех серверов имен может предоставить мне дополнительную информацию о записях для www.ianjmacintosh.com. Выберите один для следующего запроса, мы почти готовы!

⌨️ Запросить у ianjmacintosh.comсервера имен запись www.ianjmacintosh.comʼs A( +norecurse)

dig @dns1.p03.nsone.net www.ianjmacintosh.com A  +norecurse
  • dns1.p03.nsone.net– это сервер, который мы запрашиваем для записи сервера имен для домена верхнего уровня com.
    • Как видите, я снова стал ленивым и разрешаю копать найти IP-адрес для dns1.p03.nsone.net
  • [www.ianjmacintosh.com](http://www.ianjmacintosh.com/) это название записи, которую мы просим
  • A это сокращение от «адрес»
  • +norecurseне dns1.p03.nsone.netвыполняет рекурсивный поиск – не то чтобы

? Найдите IP-адрес для www.ianjmacintosh.com

; <<>> DiG 9.10.6 <<>> @dns1.p03.nsone.net www.ianjmacintosh.com A +norecurse
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25003
;; flags: qr aa; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.ianjmacintosh.com.     IN  A

;; ANSWER SECTION:
www.ianjmacintosh.com.  20  IN  A   18.230.52.212
www.ianjmacintosh.com.  20  IN  A   54.207.147.214

;; Query time: 31 msec
;; SERVER: 198.51.44.3#53(198.51.44.3)
;; WHEN: Wed Nov 25 18:40:39 -03 2020
;; MSG SIZE  rcvd: 82

Ты сделал это! У вас есть IP-адреса для хостинга серверов www.ianjmacintosh.com. Прямо там, в разделе ответов, вы увидите те же IP-адреса, которые мы видели в отчете о наших первых раскопках: 18.230.52.212&54.207.147.214

Для удовольствия вы можете запустить dig с +traceопцией запроса, чтобы увидеть, как dig автоматически перебирает все эти шаги:

dig www.ianjmacintosh.com +trace

Вывод

Вау, это было много. Ваш компьютер делает все это автоматически за кулисами всякий раз, когда вы пытаетесь перейти на веб-сайт. Поздравляем, теперь вы знаете, значительно больше, чем большинство людей о DNS.

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

Если вы только что просмотрели эту статью, не запускали никаких команд и все равно хотите чувствовать себя более уверенно с DNS, это нормально! Я надеюсь, что вы вернетесь к этой статье и пройдетесь по шагам, когда сможете. А пока вот несколько быстрых советов:

  • DNS похож на «телефонную книгу для Интернета» только в самом расплывчатом аналоге; это больше похоже на дерево, и ответы на запросы включают переход от корня к ветви к ветви
  • DNS означает «система доменных имен»
  • По умолчанию сообщения DNS передаются через порт 53.
  • dig – полезный инструмент диагностики DNS, входящий в состав BIND
  • BIND означает «домен имен в Интернете в Беркли» и представляет собой набор инструментов для имен доменов, первоначально разработанных в Калифорнийском университете в Беркли.
  • Самым заметным приложением BIND является его чрезвычайно популярный сервер- демон имени (он сбивает с толку, namedкак в «имя D», сокращение от «имя dameon»), который может отвечать на запросы DNS.

Дополнительная информация

Почему деревья доменов пишутся справа налево (subdomain.domain.com), а пути – слева направо (/users/~imacintosh/articles/dns-for-web-developers)?

Хороший вопрос. Я не нашел удовлетворительного ответа. Общие объяснения на форумах вопросов и ответов указывают на то, как адреса электронной почты (user@host) работают одинаково, переходя от более конкретных к менее конкретным. В записях Джона Постела, сделанных на встрече «Рабочей группы сети» в 1982 году, предполагается, что группа стремилась принимать решения, которые обеспечили бы наименьшее количество проблем при реализации. Кажется, это одно из таких решений, но я не вижу причин, почему.

Как бы то ни было, Тим Бернерс-Ли упомянул в интервью, что если бы он мог вернуться и сделать что-то по-другому, он бы привел домены в com.domain.subdomainпорядок. ??‍♂️

Итак, в основном весь Интернет работает на 13 различных корневых DNS-серверах?

Неа! Это 13 разных IP-адресов, но серверов, отвечающих на их запросы, гораздо больше; когда я писал это, их было более 1300, и они довольно хорошо распределены по миру. На главной странице корневых серверов есть аккуратная карта, на которой показано, где они все находятся. Если вы хотите понять, как несколько систем могут совместно использовать один IP-адрес, вы можете поискать «anycast».

Если 18.230.52.212это IP-адрес хостинга сервера www.ianjmacintosh.com, почему я получаю странное сообщение об ошибке вместо вашего веб-сайта при его посещении?

Сервер по адресу 18.230.52.212 обслуживает множество веб-сайтов, не только мой. Этот сервер должен знать, какой веб-сайт вы запрашиваете. Когда вы посещаете сайт www.ianjmacintosh.com в своем браузере, он сообщает серверу 18.230.52.212 обслуживать www.ianjmacintosh.com. Когда вы заходите на сайт 18.230.52.212, он может не знать, что вы хотите.