Взаємовідносини dhcpclient і resolv.conf'а в Linux

Abstract: опис того, як оновлюється файл /etc/resolv.conf в умовах працюючого dhcp-клієнта, специфіка різних ОС і варіанти реалізації.

Охоплення: Debian, Ubuntu, Centos/Fedora/RHEL; dhclient з resolvconf і без. NetworkManager не враховується.

Лірика: Я тільки що витратив кілька днів (подробиці англійською [1], [2]) розбираючись як правильно зберігати 'options rotate' у /etc/resolv.conf в різних дистрибутивах при працюючим DHCP. Виявилося, виразної документації з цього питання немає, і довелося збирати інформацію з різних джерел, вихідних текстів і експериментальних даних. Далі буде сухо і по справі.

Про що мова?

У комп'ютера мережевий інтерфейс принципово може бути налаштований трьома видами: вручну/спеціалізованим софтом, статично заданими налаштуваннями і через DHCP-клієнт. (Є ще скільки-то екзотики, але ці три — основні методи). Перший метод нам не цікавий, зі статичною конфігурацією все просто — як написано, так і буде. DHCP цікавий тим, що комп'ютер запитує налаштування мережі «у кого-то». Протокол DCHP має безліч опцій (параметрів), які можуть змінювати абсолютно несподівані налаштування комп'ютера — годинний пояс, адресу сервера з точним часом, таблицю маршрутизації, ім'я або домен сервера, і т. д. З усього цього нас цікавить можливість задавати налаштування DNS.

Традиційно, налаштування DNS-ресолвера зберігаються у файлі /etc/resolv.conf, і після оновлення dhcp-оренди цей файл оновлюється. У цій статті пояснюється, як саме "-ся" цей файл.

Пристрій DHCP client
Існує декілька реалізацій dhcp-клієнта, нас цікавить ISC DHCP, як найбільш поширена.
Сам клієнт називається /sbin/dhclient, однак, стандартно, для оновлення налаштувань, викликається не він, а /sbin/dhclient-script. dhclient-script викликає dhclient і використовує його відповідь для зміни різних частин системи. У самому dhclient-script є функція make_resolv_conf, яка, власне, і створює файл resolv.conf.

Для зручності модифікації (і заплутування системних адміністраторів) у dhclient-script'а є хуки. Їх становище відрізняється (в Ubuntu Xenial і Debian Stretch це /etc/dhcp/dhclient-exit-hooks.d, для якої версії Centos — /etc/dhclient-enter-hooks/ тощо). Хуки є двох видів — entry і exit. Entry викликаються коли dhcp-client тільки-тільки отримує (отримав) оренду, exit, відповідно, коли звільнив (або вона закінчилася). У хуках можна прописати свою версію функції make_resolv_conf(), і тоді dhclient-script буде викликати її, а не вбудовану.

resolvconf
Цим активно користуються автори пакету resolvconf, який дозволяє формувати файл /etc/resolv.conf за заданим шаблоном (а не фіксовано, як у випадку рідний реалізації dhclient-script). Вони кладуть файл (Debian/Ubuntu) /etc/dhcp/dhclient-enter-hooks.d/resolvconf, який викликає resolvconf -u (оновлення) для створення нової версії resolvconf'а.

Щоб не заважати жити dhcpclient-script, resolvconf управляє файлом /run/resolvconf/resolv.conf, а пакет resolvconf (не плутати з програмою, яку він надає) при встановленні замінює /etc/resolvconf на симлинк ../run/resolvconf/resolv.conf.

Типовою проблемою при використанні resolvconf'а є відсутність симлинка. Якщо його немає, то dhclient-script буде просто перезаписувати /etc/resolv.conf з налаштуваннями від DHCP-сервера, а resolvconf буде оновлювати свій файл у куточку, лише видаючи попередження, що /etc/resolv.conf не симлинк.

Шаблони resolvconf'а досить прості:
  • /etc/resolvconf/resolv.conf.d/head
  • /etc/resolvconf/resolv.conf.d/base
  • /etc/resolvconf/resolv.conf.d/tail
head і tail просто дописуються куди належить, а от base дозволяє всякі дивні штуки, які описуються в man resolvconf в розділі «CONSUMERS OF NAMESERVER INFORMATION»).

Специфіка RHEL/Centos/Fedora
Red Hat використовує свою версію скрипта dhclient-script, досить велику і складну, враховує безліч налаштувань з ifcfg-ethXXX, зокрема, яка цікавила мене опцію RES_OPTIONS. Debian і Ubuntu використовують здебільшого апстримовую версію, в якій такі дослідження відсутні. В Centos 7 свій час в цьому скрипті був баг, приводив до того, що при наявності рядки 'options' у /etc/resolv.conf при перезавантаженні, з нього вилучалися всі інші рядки, крім рядки з options, причому нові DNS-сервера в файл не додавалися.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.