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-сервера в файл не добавлялись.

Комментарии (14)


  1. maxzhurkin
    28.03.2016 10:12

    Про dhclient-script, а именно, про хуки бред написан:
    В начале dhclient-script определяются некоторые функции, которые могут быть переопределены в хуках entry.
    Эти функции могут быть вызваны в теле dhclient-script после вызовов хуков entry и до вызовов хуков exit, или эти функции могут быть вызваны в хуках exit
    А хуки exit предназначены для выполнения дополнительных действий.


    1. amarao
      28.03.2016 10:12

      Поясните насчёт "бред" побдробнее. Зарнее спасибо.


      1. maxzhurkin
        02.04.2016 08:51
        +1

        <бред>
        Entry вызываются когда dhcp-client только-только получает (получил) аренду, exit, соответственно, когда освободил (или она истекла).
        </бред>
        <на самом деле>
        и entry и exit хуки вызываются и при получении аренды и при освобождении, только первые — в начале скрипта, а последние — в конце
        </на самом деле>