Pull to refresh

Взаимоотношения dhcpclient и resolv.conf'а в Linux

Reading time 3 min
Views 45K
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 вызываются до основного когда dhclient-script, exit в конце. В хуках можно прописать свою версию функции make_resolv_conf(), и тогда dhclient-script будет вызывать её, а не встроенную. Что именно происходит с арендой определяет переменная reason (примеры значений: PREINIT, BOUND, RENEW, REBIND, REBOOT, EXPIRE, FAIL, RELEASE, etc). Спасибо maxzhurkin за указания на (исправленные) неточности в этом разделе.

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-сервера в файл не добавлялись.
Tags:
Hubs:
+28
Comments 21
Comments Comments 21

Articles