Как `/ etc / hosts` и DNS работают вместе для преобразования имен хостов в IP-адреса?

10

В Linux, как /etc/hostsи DNS работают вместе, чтобы преобразовать имена хостов в IP-адреса?

  1. если имя хоста может быть разрешено в /etc/hosts, применяется ли DNS после этого /etc/hosts для разрешения имени хоста или обрабатывать разрешенный IP-адрес /etc/hostsкак «имя хоста» для рекурсивного разрешения?
  2. В моем браузере (Firefox и Google Chrome), когда я добавляю в /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    введя www.google.com в адресную строку браузера и нажав клавишу ввода, вы не подключитесь к сайту. После удаления этой строки /etc/hostsя могу подключиться к веб-сайту. Означает ли это, что /etc/hostsпереопределяет DNS для разрешения имен хостов?

    После повторного добавления строки /etc/hostsя могу подключиться к веб-сайту, даже после обновления веб-страницы. Почему /etc/hostsснова не подать заявку, чтобы я не смог подключиться к сайту?

Спасибо.

Тим
источник
9
Помните, что многие веб-браузеры реализуют свои собственные DNS-серверы и DNS-кэш и не обращаются к каким-либо механизмам поиска имен, которые были настроены в системе. Другими словами, некоторые веб-браузеры полностью игнорируют /etc/hostsи локально определенные серверы имен. Довольно странно наблюдать за первым разом. (Глядя на вас, браузеры на основе Chromium!)
Кристофер
@ Кристофер Я приехал сюда, чтобы сказать то же самое. Связанные unix.stackexchange.com/questions/363498/…
Rui F Ribeiro
@Christopher После того, как я снова добавлю строку в / etc / hosts, я все равно могу подключиться к сайту, даже после обновления веб-страницы. Почему / etc / hosts не применяется снова, так что я не могу подключиться к сайту? Это из-за кеша DNS Firefox?
Тим
@RuiFRibeiro Эта сборка Chromium, похоже, уважает /etc/hostsи системные DNS-серверы: ( github.com/Eloston/ungoogled-chromium ). Установка на MacOS с Homebrew: brew cask install eloston-chromium.
Кристофер

Ответы:

21

Это продиктовано конфигурацией NSS (Name Service Switch), то /etc/nsswitch.confесть hostsдирективой файла . Например, в моей системе:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Здесь filesотносится к /etc/hostsфайлу и dnsотносится к системе DNS. И, как вы можете себе представить, что будет первым, кто победит .

Кроме того, посмотрите, man 5 nsswitch.confчтобы получить больше идей по этому вопросу.


Как и в сторону, чтобы следовать упорядоченности разрешения НСС хоста, использование getentс , hostsкак , например , базы данных:

getent hosts example.com
heemayl
источник
Спасибо. В моей части 2 это потому, что DNS-сервер моего веб-браузера не работает, но DNS-кеш веб-браузера работает?
Тим
Как systemd.resolverвлияет на разрешение? Где NIS и LDAP вписываются в систему разрешения? Какой порядок следует за системой MacOS или системой Windows?
Исаак
@Tim Да, ваш браузер загружает данные из кеша.
Heemayl
7

Чтобы ответить только на ваш последний вопрос: /etc/hostsне применяется снова сразу, потому что firefoxкэширует последнее имя хоста, за которое он получил google.com; если вы хотите, чтобы он всегда получал его снова, вам нужно установить network.dnsCacheExpirationзначение 0in about:config. Больше информации (хотя и немного устаревшей) здесь . Извините, если это оффтоп.


Как примечание, многие программы не используют стандартный преобразователь ( getaddrinfo(3), getnameinfo(3)[1]), потому что это отстой .

Во-первых, интерфейс не асинхронный; любая умеренно сложная программа должна будет порождать отдельный поток, выполняющий только то, getaddrinfo()и затем изобретать свой собственный протокол для связи с ним (и даже не будем входить в него getaddrinfo_a(), который отправляет сигнал по завершении, так что это еще хуже).

Во-вторых, реализация распознавателя в glibc(стандартной C-библиотеке в linux) ужасна, ожидая, что вы позволите ей перетаскивать случайные динамические объекты в адресное пространство dlopen()за вашей спиной, и сделав невозможным ее сдерживание или использование в статических целях. связанные исполняемые файлы.

Поскольку многие программы не используют стандартный распознаватель непосредственно, они не удосужились воспроизвести ее поведение в точности, и игнорировать некоторые или все /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confили /etc/gai.conf.

[1], и даже не упоминайте не входящего, ipv4-only gethostbyname(), который устарел с давних пор.

Дядя билли
источник
Спасибо. Что вы имеете в виду "не реентерабельный"?
Тим
1
Это означает, что если вы делаете, google = GHBN("google.com"); facebook = GHBN("facebook.com")вы можете в конечном итоге googleи facebookс адресом facebook.com. Когда два вызова выполняются в разных потоках, это даже смешнее: вы можете закончить адресом, который наполовину гугл, наполовину фейсбук или полный мусор.
Дядя Билли
Что заменили gethostbyname()сейчас?
Тим
1
getaddrinfoэто стандартная функция для этого, но она сама по себе brokrn, как я уже объяснил, поэтому она не используется как браузеры или другие реальные приложения.
Дядя Билли
Например, Firefox и Chrome используют свои собственные разрешения. Спасибо за проницательные заметки.
Руи Ф Рибейро
6

Файл /etc/hostsи DNS не работают вместе. Они обеспечивают независимые разрешения имен (сетевых имен).

Клей, который связывает их, находится внутри /etc/nsswitch.confдля систем Linux . В случае /etc/netsvc.confсерверов AIX, в системе для Windows и может быть указан с lookupd -configuration(поиск LookupOrder, аналогично:) Cache FF DNS NI DSв системах MacOS.

Фактический порядок становится сложным и, как правило, запутанным, поскольку каждая служба разрешения имен может (и часто это делает) заглядывать внутрь других уровней разрешения. Как dnsmasq(легкий DNS-сервер обычно на 127.0.0.1:53или ::1:53(или оба)) обычно читает и включает /etc/hostsсодержимое файла. Или, как systemd.resolver(базовый распознаватель, который должен разрешать только имена без точек, например ), при некоторых условиях mycomputerнапрямую вызывает разрешение DNS для точечных имен ( mycomputer.here.dev.).

В общем, сервисы вызываются по порядку, и первый, который не отказывает, выигрывает и принимается как правильный адрес. Общий основной порядок: /etc/hosts(файл), mDNS (без точечных имен), DNS, NIS, NIS +, LDAP. В некоторых системах Linux есть последнее решение для компьютера hostnameв службеmyhostname

Например, в этой системе (из cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Обратите внимание, что очень старая (glibc 2.4 и более ранняя) orderзапись установлена/etc/host.conf как:

order hosts,bind,nis

Применяются только к файлам (файлам /etc/hosts) службы имен.

Эффекты на этом (linux) клиентском компьютере, связанные с NIS и LDAP (обычно), контролируются используемым DNS-сервером (привязка, освобождение и т. Д.).

так:

  1. Если имя хоста можно разрешить в / etc / hosts, применяется ли DNS после / etc / hosts для разрешения имени хоста или обрабатывать разрешенный IP-адрес в / etc / hosts как «имя хоста» для рекурсивного разрешения?

Никто.

Если имя хоста может быть разрешено /etc/hosts, DNSоно не применяется (если файлы до DNS).

ни является разрешенным IP - адрес рассматривается как «имя хост».

Это просто есть: разрешенный адрес.

браузер

Браузер может использовать любой метод для разрешения имени (после того, как он проверил свой кеш разрешенных имен). Только если он использует метод, предоставленный системой, применяется порядок, указанный выше. Браузер, как и любая другая программа, может напрямую связываться с любым DNS-сервером.

Если системный порядок имеет /etc/hostsранее DNS, это означает, что запись в этом файле будет иметь приоритет для DNSслужбы разрешения.

Так:

  1. ... Означает ли это, что / etc / hosts переопределяет DNS для разрешения имен хостов?

Да (если браузер использует предоставленное системой разрешение).

Почему /etc/hostsснова не подать заявку, чтобы я не смог подключиться к сайту?

Только до тех пор, пока внутренний кеш браузера не будет очищен (или истечет время ожидания) для этого конкретного имени, это имя будет снова найдено за пределами браузера.

Если у браузера есть имя, разрешенное в его кэше, браузер использует его снова.

Используйте это, чтобы очистить кеш .

Или просто закройте (подождите немного) и перезапустите браузер.

Исаак
источник