Переходим на systemd-resolved

12/13/2016

Установка и первичная настройка настройка systemd-resolved

LLMNR в systemd-resolved

Установка и первичная настройка systemd-resolved

Для работы с systemd-resolved вам понадобится демон systemd-resolved. В Ubuntu он уже входит в пакет systemd (в 16.04 точно), а вот в Centos 7 его придется доустановить:

yum install systemd-resolved

Так же необходимо убедиться в наличии библиотеки libnss_resolve.so - без нее приложения не смогут связываться с резолвером.

В Centos эта библиотека входит в пакет systemd-resolved, а в ubuntu придется выполнить:

apt install libnss-resolve

Следующим шагом будет правка файла /etc/nsswitch.conf. Находим строчку, начинающуюся с "hosts:" и приводим к виду:

hosts: files resolve

Поясним. Эта строка отвечает за последовательность обращений приложения к системным компонентам с целью резолвинга интересующего приложение имени. В данном случае сначала программа заглянет в файл /etc/hosts и, если не обнаружит там возможностей по разыменованию (совпадения по имени), обратиться уже к демону systemd-resolved с просьбой сделать это для себя любимой. Ранее в этой строке у вас скорее всего было упоминание слова "dns", заставляющее приложение самостоятельно обращаться к DNS серверам с целью резолвинга. Мы удалили эту возможность за более ненадобностью. К тому же этот способ значительно медленнее, чем обращение напрямую к локально установленному демону systemd-resolved, который, к слову, еще и поддерживает кэширование полученных записей. Конечно же, самое первое обращение всё равно будет сопровождаться запросом systemd-resolved к DNS серверам, но потом накопленный кэш существенно ускорит эти операции. Небольшое замечание: конечно же, приложение само не делает никаких обращений - оно просто не умеет. Всё это делается по средствам библиотечных вызовов. Именно поэтому мы доустанавливали библиотеки в начале статьи и именно поэтому использование systemd-resolved эффективнее, потому что библиотечные вызовы быстрее, чем обращения, производимые с использованием стека TCP/IP.

Открытым остался вопрос о том, как сообщить systemd-resolved IP-адреса DNS серверов, к которым следует обращаться для разыменования запросов приложений. Можно определить DNS сервера в файле /etc/systemd/resolved.conf, можно их определить в файлах ".network" демона systemd-networkd, а можно, пользуясь DHCP с привлечением того же systemd-networkd получать эти адреса автоматически от сервера DHCP. Но для этого у вас должен быть запущен и настроен systemd-networkd. Если его нет, или вы не хотите его использовать, то единственным вариантом остается /etc/systemd/resolved.conf.

Для целей совместимости с приложениями, которые по каким-либо причинам не используют библиотечные вызовы, а обращаются к DNS серверам напрямую, получая их IP-адреса из /etc/resolv.conf, следует создать символическую ссылку:

ln -svi /run/systemd/resolve/resolv.conf /etc/resolv.conf
ls -la /etc/resolv.conf
lrwxrwxrwx 1 root root 32 дек 13 09:11 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf

Нам остается только запустить сервис и наслаждаться резолвингом с помощью systemd-resolved:

systemdctl enable systemd-resolved
systemdctl start systemd-resolved

LLMNR в systemd-resolved

Отдельного упоминания заслуживает поддержка в systemd-resolved протокола LLMNR (Link-Local Multicast Name Resolution). Этот протокол позволяет узлам в одной сети (широковещательном домене) обращаться друг к другу по имени хоста, не прибегая к услугам DNS вообще. Работает это следующим образом: какая-нибудь программа пытается обратиться к хосту в своей сети по имени, используя, как мы уже упоминали, библиотечные вызовы; локальный DNS-резолвер, как например герой нашей статьи - systemd-resolved, сначала попытается найти запрашиваемый хост в своей сети, делая групповой запрос на адрес 224.0.0.252 для ipv4 и FF02::1:3 для ipv6; если в сети есть хосты с поддержкой LLMNR и среди них окажется тот, имя которого будет соответствовать запрашиваемому, systemd-resolved незамедлительно вернет запрашивающей программе IP-адрес интересующего ее хоста. Однако стоит заметить, что для работы этого протокола очень важно правильно конфигурировать hostname на каждом компьютере в сети. Вы должны использовать короткую нотацию - не FQDN. В linux имя хоста указывается в /etc/hostname. Вы также можете использоать команду 'hostnamectl set-hostname NAME' для горячего изменения hostname компьютера. Ну и конечно же, LLMNR должен быть включен в вашем systemd-resolved. Это можно проверить по выводу команды ss:

ss -ntpul | grep 5355
udp UNCONN  0 0     *:5355 *:* users:(("systemd-resolve",pid=15784,fd=12))
udp UNCONN  0 0     :::5355 :::* users:(("systemd-resolve",pid=15784,fd=11))
tcp  LISTEN      0 128 *:5355 *:* users:(("systemd-resolve",pid=15784,fd=14))
tcp  LISTEN      0 128 :::5355 :::* users:(("systemd-resolve",pid=15784,fd=15))

Да, стандартный порт LLMNR - 5355 для TCP и UDP. Если вы обнаружили, что LLMNR порт никем не слушается, проверьте настройки в файле /etc/systemd/resolved.conf - LLMNR должен быть выставлен в "yes".

В завершении статьи небольшое отступление, советы по использованию:

  • Используйте systemd-resolved в паре с systemd-networkd. У вас появится возможность автоматически получать настройки DNS с DHCP сервера
  • Удалите другие локальные кэширующие DNS заглушки - они больше не нужны. К ним относятся dnsmasq и прочие

Добавить комментарий