Хто читає /etc/resolv.conf?


16

Мій сервер Centos 7 неправильно розбирає доменні імена. Як я бачу, в сучасних системах Linux /etc/resolv.confчасто генерується за допомогою dhclient, dnsmasqабо Network Manager.

Таким чином, у мене є загальне теоретичне питання щодо мережевого стеку в сучасних Linuxes:

Хто відповідає за читання /etc/resolv.conf? Які гравці (служби чи підсистеми ядра) беруть участь у вирішенні доменних імен?

КОРОТКИЙ ВІДПОВІДЬ: У посібнику Arch linux йдеться про те, що конфігурація високого рівня дозволу доменних імен робиться в /etc/nsswitch.conf і покладається на glibcAPI служби перемикання імен .

glibcвикористовує nss-resolveфункцію для надсилання запитів DNS на сервери DNS.

Зазвичай сучасні системи CentOS nss-resolve покладаються на systemd-resolved сервіс. Якщо він /etc/resolv.confбув створений чимось подібним dhclient-script, systemd-resolvedвін читає його і працює в режимі сумісності, емулюючи поведінку старих систем, таких як BINDклієнт DNS.

Відповіді:


20

Бібліотеки клієнтів DNS роблять.

Бібліотеки C містять клієнтів DNS, які завершують пошук імен на адресу в протоколі DNS і передають їх проксі-серверам DNS, щоб виконати всю грубу роботу з вирішення запитів. Таких клієнтів DNS дуже багато. Той, який знаходиться в основній бібліотеці виконання C вашої операційної системи, швидше за все, буде випущений з BIND ISC. Але з dnsбібліотеки Даніеля Дж. Бернштейна через c-ares до adns є цілий ряд інших .

Хоча декілька з них містять свої власні механізми конфігурації, вони, як правило, мають режим сумісності бібліотеки BIND, де вони читають resolv.conf, що є файлом конфігурації для клієнтської бібліотеки BIND C ISC.

NSS шарується поверх цього і налаштовується nsswitch.conf. Однією з речей, до яких запити NSS можна викликати внутрішньо, є клієнт DNS, і nsswitch.confвін читається кодом NSS у бібліотеці C, щоб визначити, чи і куди передаються запити клієнту DNS та як боротися з різними відповідями.

(Існує незначне ускладнення цієї ідеї, спричинене кешем служб імен Dæmon, nscd. Але це просто додає додатковий клієнт верхнього рівня в бібліотеці C, говорячи про ідіосинкратичний протокол на локальному сервері, який, в свою чергу, діє як DNS-клієнт, що говорить протокол DNS на проксі-сервері DNS. systemd-resolvedДодає подібні ускладнення.)

systemd-resolved, NetworkManager, connman, dhcpcd, resolvconf, І інші регулювання конфігурації клієнта файл BIND DNS для перемикання DNS клієнтів , щоб поговорити з різними проксі - серверами DNS на льоту. Це не відповідає цій відповіді, тим більше, що на цьому веб-сайті WWW є багато відповідей, які вже стосуються візантійських деталей, які передбачає такий механізм.

Більш традиційний спосіб здійснення справ у світі Unix - це запуск проксі-сервера DNS або на самому апараті, або в локальній мережі. Звідси йдеться в посібнику FreeBSD про нормально налаштовані системи, де дія за замовчуванням бібліотеки клієнтів DNS за відсутності resolv.confвідповідності звичайним адміністраторам Unix, що є проксі-сервером DNS на 127.0.0.1. (Посібник FreeBSD для resolv.confнасправді doco, який також походить від BIND ISC, і, звичайно, також можна знайти там, де клієнтська бібліотека BIND DNS була включена в інші місця, такі як бібліотека GNU C.)

Подальше читання


7

З набагато кращої сторінки FreeBSD, резолюв.conf :

 The resolver configuration file contains information that is read by the
 resolver routines the first time they are invoked by a process.

 On a normally configured system this file should not be necessary.  The
 only name server to be queried will be on the local machine, the domain
 name is determined from the host name, and the domain search path is
 constructed from the domain name.

1

Файл /etc/resolv.confчитається * libc-дзвінками, які виконують дозвіл імені хоста. Це в першу чергу getaddrinfoі застаріле gethostbyname.

Якщо цим функціям передається ім'я DNS, вони виконують це в наступному порядку:

  1. Спробуйте вирішити ім'я хоста локально, тобто, прочитавши /etc/hosts.
  2. Якщо це не вдалося, то запитайте DNS-сервери, перелічені в /etc/resolv.conf.
  3. Якщо це також не вдається, ім'я хоста неможливо вирішити.

Оскільки ви згадуєте dnsmasq : Це DNS-сервер, який працює локально. Отже, у багатьох сучасних дистрибутивах Linux є /etc/resolv.confєдині моменти 127.0.0.1(саме тут слухається місцевий dnsmasq). Потім dnsmasq налаштований для пересилання запитів Інтернет-серверів DNS; dnsmasq налаштовується Менеджером мережі після підключення до Інтернету.


Це не системні виклики, це * libc-функції.
ДжошуаРЛІ

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