• Настройка DNS на Ubuntu Server 18.04 LTS

 #10724   IgorA100
 15 янв 2024, 20:53
Настройка службы 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Копировать

Источники:
https://tokmakov.msk.ru/blog/item/522
https://www.tecmint.com/set-permanent-d ... tu-debian/