Як `/ 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і локально визначені сервери імен. Це досить заплутано, коли ви вперше спостерігаєте. (Дивлячись на вас, браузери на основі хрому!)
Крістофер

@Christopher Я прийшов сюди, щоб сказати те саме. Пов'язані 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

Дякую. У моїй частині 2, це тому, що сервер DNS мого веб-браузера не працює, але кеш DNS веб-браузера працює?
Тім

Як systemd.resolverвпливає на рішення? Де NIS та LDAP вписуються в систему роздільної здатності? Який порядок дотримується системи MacOS або системи Windows ?.
Ісаак

@Tim Так, ваш браузер отримує дані з кешу.
heemayl

7

Щоб відповісти лише на ваше останнє запитання: /etc/hostsне застосовується знову, оскільки firefoxкешується прізвище, яке воно отримало google.com; якщо ви хочете, щоб завжди отримувати його знову, ви повинні встановити , network.dnsCacheExpirationщоб 0в 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 gethostbyname(), яке було устарене з віків.


Дякую. Що ви маєте на увазі "невідповідач"?
Тім

1
Це означає, що якщо ви робите це, google = GHBN("google.com"); facebook = GHBN("facebook.com")ви можете закінчитись обома googleі facebookмістити адресу facebook.com. Коли два дзвінки виконуються різними потоками, це ще смішніше: ви можете закінчитись адресою, яка наполовину google та наполовину facebook або повним сміттям.
Дядько Біллі

Що замінило gethostbyname()зараз?
Тім

1
getaddrinfoце стандартна функція для цього, але сама brokrn, як я вже пояснила, тому вона не використовується так, як це використовується у браузерах чи інших додатках у реальному житті.
Дядько Біллі

Насправді, Firefox та Chrome використовують, наприклад, власні рішення. Дякуємо за проникливі записки.
Rui F Ribeiro

6

Файл /etc/hostsта DNS не працюють разом. Вони надають незалежні рішення імен (мережеві назви).

Клей, який їх пов'язує, знаходиться всередині /etc/nsswitch.confдля систем Linux . Для /etc/netsvc.confAIX-серверів, у системі для 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застосовується знову, так що я не можу підключитися до веб-сайту?

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

Якщо у кеш-пам'яті ім’я вирішено, браузер його знову використовує.

Використовуйте це, щоб очистити кеш .

Або просто закрийте (почекайте деякий час) і перезапустіть браузер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.