Как ping определяет IP-адрес веб-сайта?
Я пытаюсь лучше понять различные инструменты сетевого запроса, такие как nc
, curl
, whois
, dig
, nslookup
и в то же время немного больше об архитектуре интернет-запросов, серверов и тому подобного (NIC, A Record, MX), хотя уже немного знаком с TCP, серверами имен, регистраторами доменов, анализаторами пакетов, заголовками HTTP и IP-адресами, Это мой фон, вот мой вопрос.
Когда я dig
или же whois
скажем, www.valgrind.org (или valgrind.org) Я получаю как минимум два разных IP-ответа: 178.250.76.80 и 172.16.0.23#53.
$ nslookup valgrind.org
Server: 172.16.0.23
Address: 172.16.0.23#53
Non-authoritative answer:
Name: valgrind.org
Address: 178.250.76.80
Пытаясь перейти к одному из них в w3m
или же chromium
приводит к 403 Forbidden
ошибка. Кроме того, я не уверен, к какому из них перейти, но ping
как-то в состоянии разобраться! Если я ping valgrind.org
(или же ping www.valgrind.org
) это выбирает
$ ping valgrind.org
PING valgrind.org (178.250.76.80) 56(84) bytes of data.
64 bytes from 178.250.76.80: icmp_req=1 ttl=50 time=80.2 ms
Откуда он это знает? И какой другой инструмент я должен использовать, чтобы узнать, как работает мой браузер? 178.250.76.80
в valgrind.org
и загружает что-то?
4 ответа
Здесь работают разные программы и протоколы, каждая из которых настроена на ответ независимо от других.
Чтобы найти IP-адрес, хост linux обычно использует директиву hosts: в http://linux.die.net/man/5/nsswitch.conf, чтобы определить, в каком порядке следует запрашивать различные источники. Типичная запись будет
hosts: files dns
который говорит, проверьте файлы (обычно /etc/ hosts), а затем систему DNS. Поэтому будет произведен поиск файла /etc/ hosts, и если он содержит запись для valgrind.org, будет возвращен соответствующий IP-адрес. Если /etc/ hosts не содержит записи для valgrind.org, то в DNS будет сделан запрос. Это включает чтение содержимого файла /etc/resolv.conf, чтобы определить, с какими серверами следует обращаться для запроса информации DNS...
Глядя на вывод вашей команды, вы не получаете два разных адреса. Первая часть вывода сообщает вам, с каким сервером связывался nslookup (172.16.0.23), а также по какому порту (#53) получить ответ. Мы также знаем, что для 172.16.0.23 нет правильно настроенной записи PTR, поскольку, как показывает ответ RobM, Сервер будет отображаться как имя, если бы оно было.
Вторая часть вывода - это информация, которую вы запросили, и сообщает, что 178.250.76.80 - это IPv4-адрес valgrind.org.
Когда вы обращаетесь к 178.250.76.80 через порт 80 ( http) напрямую, вы получаете запрет 403, потому что именно так настроен http-сервер по этому адресу. Скорее всего, он настроен как виртуальный сервер на основе имени и поэтому требует действительный заголовок http Host: (sec 14.23) для направления вашего запроса к соответствующему vhost.
Команда ping является частью набора протоколов ICMP и является эхо-запросом ICMP, узел 178.250.76.80 отвечает на эхо-запрос, поскольку он настроен на это, и отправляет эхо-ответ ICMP на каждый эхо-запрос.
Вам нужно понять, как работает nslookup.
Первая часть ответа, как должно быть понятнее, это сервер имен, с которым вы разговариваете. Ответ, который он дает, является второй частью
Итак, в моем примере я прошу nslookup запросить у моего сконфигурированного в настоящее время DNS-сервера, где, по его мнению, находится www.serverfault.com.
nslookup отвечает адресом сервера, который он использовал для выполнения запроса, и ответом, который он дал. Это важно, если вы указываете определенный DNS-сервер для запуска dig или nslookup, что является довольно обычной частью устранения неполадок разрешения имен.
Вы неправильно понимаете вывод nslookup. Он не дает два ответа, а только один. Первый адрес, откуда он получил ответ. ping
выполняет точно такую же задачу и получает точно такой же результат. Причина, по которой вы получаете 403 при попытке дать IP-адрес браузеру, заключается в том, что на сервере работает виртуальный хостинг. С помощью виртуального хостинга сервер может иметь несколько сайтов с одним IP-адресом. Он решает, какой сайт будет обслуживать вас, основываясь на имени, которое браузер сообщает, что вы ввели. Когда вы вводите IP-адрес, сервер не знает, какой сайт вы хотели.
Это будет зависеть от вашей ОС и версии ping. если это Linux, вы можете узнать все, что делает, используя strace.
strace ping valgrind.org
шаг за шагом это покажет вам. слишком долго для публикации, но вот мой вывод, так что я знаю, что в какой-то момент он проверяет файл hosts
,
.
.
open("/etc/host.conf", O_RDONLY) = 3
.
.
.