DNS для веб-разработчиков
Допустим, я хочу посетить www.ianjmacintosh.com. Чтобы мой браузер мог его увидеть, моему браузеру необходимо знать IP-адрес, с которого он будет запрашиваться. Сначала мой браузер проверит, есть ли уже кэшированная запись www.ianjmacintosh.com
IP-адреса. Эта запись называется запись адреса, или запись 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-сервера запись com
s 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
. В самом деле!
⌨️ Спросите у com
DNS 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
- Как видите, я снова стал ленивым и разрешаю копать найти IP-адрес для
[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, он может не знать, что вы хотите.