Настройка DNS на Ubuntu Server 18.04 LTS
04.07.2020
Теги: DNS • Linux • Ubuntu • Кеширование • Конфигурация • Настройка • Сервер • Установка
Стало достаточно традиционным для Linux запускать небольшой локальный
DNS-сервер, который ускоряет работу, кешируя ответы на повторяющиеся
DNS-запросы. В этом случае в общесистемный /etc/resolv.conf
помещается директива nameserver 127.0.0.1
, а ip-адреса внешних DNS-серверов переносятся в настройки локального.
resolv.conf
. При одновременном доступе программы мешают друг другу и сохраняют неверную информацию в файл. Утилита resolvconf
действует как посредник между программами, которые предоставляют
информацию о сервере имен, и программами, которые используют информацию о
сервере имен.
При этом файл resolv.conf
заменяется символической ссылкой на /run/resolvconf/resolv.conf
и программы используют динамически сгенерированный файл. В системе без службы resolvconf.service
файл resolv.conf
поддерживается вручную или набором скриптов. И эти скрипты могут мешать друг другу при попытках одновременного доступа к файлу.
Всё работало хорошо, пока не появились NetworkManager и Systemd. Система инициализации Systemd имеет свой собственный резолвер systemd-resolved
, запущенный по умолчанию и требующий отдельной настройки. А NetworkManager пытается дружить со всеми — с resolvconf
, с Systemd
, с наиболее распространёнными DNS-резолверами.
Всё это привело к тому, что теперь в одной системе порт 53 может слушать
несколько разных резолверов, причём для избежания конфликтов NetworkManager
и systemd-resolved
используют вместо 127.0.0.1
другие ip-адреса в loopback-сети:
127.0.0.1
—dnsmasq
илиunbound
с настройками по умолчанию127.0.1.1
—dnsmasq
илиunbound
, запущенный NetworkManager127.0.0.53
—systemd-resolved
, запущенный по умолчанию
Настройка службы systemd-resolved
В Ubuntu Server эта служба уже установлена и запущена сразу после установки операционной системы. Но если это не так, установить ее несложно:
# apt install systemd-resolvedКопировать
Следующим шагом будет правка файла /etc/nsswitch.conf
— находим строку, которая начинается с hosts
:
# nano /etc/nsswitch.confКопировать
passwd: compat systemd group: compat systemd shadow: compat gshadow: files hosts: files resolve dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nisКопировать
Эта строка отвечает за последовательность обращений приложения к
системным компонентам с целью резолвинга доменного имени. В данном
случае сначала программа заглянет в файл /etc/hosts
, затем запросит демона systemd-resolved
, а потом — к DNS серверам.
Осталось сообщить systemd-resolved
ip-адреса DNS-серверов, к которым следует обращаться для резолвинга:
# nano /etc/systemd/resolved.confКопировать
[Resolve] # сервера DNS от Cloudflare DNS=1.1.1.1 1.0.0.1 #FallbackDNS= #Domains= #LLMNR=no #MulticastDNS=no #DNSSEC=no #Cache=yes #DNSStubListener=yesКопировать
Для целей совместимости с приложениями, которые не используют
библиотечные вызовы, а обращаются к DNS-серверам напрямую, получая их
ip-адреса из /etc/resolv.conf
, следует создать символическую ссылку. Обычно этого не требуется, ссылка уже существует после установки systemd-resolved
:
# ln -svi /run/systemd/resolve/stub-resolv.conf /etc/resolv.confКопировать
В файле /run/systemd/resolve/stub-resolv.conf
указан один-единственный сервер 127.0.0.53
:
$ cat /run/systemd/resolve/stub-resolv.confКопировать
nameserver 127.0.0.53
option edns0Копировать
Кроме того, можно создать символическую ссылку на /run/systemd/resolve/resolv.conf
. Этот файл содержит DNS-сервера, полученные от DHCP-сервера и из файла конфигурации /etc/systemd/resolved.conf
. В этом случае локальный кеширующий сервер не используется, что замедлит резолвинг.
# ln -svi /run/systemd/resolve/resolv.conf /etc/resolv.confКопировать
$ cat /run/systemd/resolve/resolv.confКопировать
nameserver 1.1.1.1 # из файла конфигурации /etc/systemd/resolved.conf nameserver 1.0.0.1 # из файла конфигурации /etc/systemd/resolved.conf nameserver 8.8.8.8 # этот DNS-сервер получен от DHCP-сервера сети # Too many DNS servers configured, the following entries may be ignored. nameserver 8.8.4.4 # этот DNS-сервер получен от DHCP-сервера сетиКопировать
Как видите, у меня DNS-серверов получилось слишком много, так что последняя запись может быть проигнорирована. Все готово, остается только разрешить запуск службы при загрузке системы, если это еще не было сделано:
# systemdctl enable systemd-resolved # rebootКопировать
Настройка службы resolvconf.service
Служба предоставляет остальным программам централизованный интерфейс для добавления и удаления записей в /etc/resolv.conf
при изменении сетевой конфигурации, запуске и остановке процессов и т.д.
# apt install resolvconfКопировать
После установки /etc/resolv.conf
будет представлять из себя ссылку на /run/resolvconf/resolv.conf
.
$ cat /run/resolvconf/resolv.confКопировать
nameserver 127.0.0.53
option edns0Копировать
При этом исходный файл /etc/resolv.conf
(который на самом деле ссылка на /run/systemd/resolve/resolv.conf
) будет сохранен как original
в директории /etc/resolvconf/resolv.conf.d/
(чтобы восстановить его при удалении службы resolvconf.service
). В этой же директории есть есть еще три файла — base
, head
и tail
— которые позволяют вручную добавить записи в динамически формируемый /run/resolvconf/resolv.conf
.
/etc/resolvconf/resolv.conf.d/base
File containing basic resolver information. The lines in this
file are included in the resolver configuration file even when no
interfaces are configured.
/etc/resolvconf/resolv.conf.d/head
File to be prepended to the dynamically generated resolver
configuration file. Normally this is just a comment line.
/etc/resolvconf/resolv.conf.d/tail
File to be appended to the dynamically generated resolver
configuration file. To append nothing, make this an empty
file. This file is a good place to put a resolver options line
if one is needed, e.g. options inet6Копировать
Теперь добавим пару записей в файл tail
(сервера OpenDNS):
# nano /etc/resolvconf/resolv.conf.d/tailКопировать
# сервера DNS от OpenDNS nameserver 208.67.222.222 nameserver 208.67.220.220Копировать
Перезагрузим службу и посмотрим сформированный /run/resolvconf/resolv.conf
:
# systemctl restart resolvconf.serviceКопировать
$ cat /run/resolvconf/resolv.confКопировать
nameserver 127.0.0.53 # сервера DNS от OpenDNS nameserver 208.67.222.222 nameserver 208.67.220.220Копировать
Первая запись — это резолвер systemd-resolved
, а две другие записи были добавлены в конец resolv.conf
из файла tail
. Благодаря тому, что первая запись это 127.0.0.53
— резолвинг будет работать быстро, потому что systemd-resolved
кеширует ответы DNS-серверов.
$ nslookup ya.ru Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: Name: ya.ru Address: 87.250.250.242 Name: ya.ru Address: 2a02:6b8::2:242Копировать
Но если мы остановим службу systemd-resolved
, резолвинг все равно будет работать, используя сервера 208.67.222.222
и 208.67.220.220
— хотя и гораздо медленнее.
# systemctl stop systemd-resolved.service # systemctl disable systemd-resolved.service # rebootКопировать
$ cat /etc/resolv.confКопировать
# сервера DNS от OpenDNS nameserver 208.67.222.222 nameserver 208.67.220.220Копировать
$ nslookup ya.ru Server: 208.67.222.222 Address: 208.67.222.222#53 Non-authoritative answer: Name: ya.ru Address: 87.250.250.242 Name: ya.ru Address: 2a02:6b8::2:242Копировать
Используем только resolv.conf
Так делать не рекомендуется, потому что резолвинг будет работать
медленно, но рассмотрим и этот вариант для полноты картины. Первым делом
изменим имя файла /etc/resolv.conf
на /etc/resolv.conf.back
, а потом создадим свой resolv.conf
:
# mv /etc/resolv.conf /etc/resolv.conf.back # nano /etc/resolv.confКопировать
# сервера DNS от Yandex nameserver 77.88.8.8 nameserver 77.88.8.1Копировать
Для Ubuntu Desktop запретим вездесущему NetworkManager вмешиваться в процесс распознавания доменных имен:
# nano /etc/NetworkManager/conf.d/dns.confКопировать
[main] dns=no rc-manager=unmanagedКопировать
Остановим службы resolvconf.service
и systemd-resolved.service
:
# systemctl stop resolvconf.service # systemctl disable resolvconf.service # systemctl stop systemd-resolved.service # systemctl disable systemd-resolved.service # rebootКопировать
Проверим, как теперь работает распознавание доменных имен:
$ nslookup ya.ru Server: 77.88.8.8 Address: 77.88.8.8#53 Non-authoritative answer: Name: ya.ru Address: 87.250.250.242 Name: ya.ru Address: 2a02:6b8::2:242Копировать
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка WireGuard на Ubuntu 20.04 LTS. Часть первая из двух
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 9 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 8 из 12
Поиск: Linux • Ubuntu • Кеширование • Конфигурация • Настройка • Сервер • Установка • DNS • nslookup • resolv.conf