Настройка 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
- Установка почтового сервера Mailcow на Ubuntu 22.04 LTS
- Установка 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
Поиск: Linux • Ubuntu • Кеширование • Конфигурация • Настройка • Сервер • Установка • DNS • nslookup • resolv.conf