Настройка локального кеширующего DNS-резолвера
Не используйте Yandex Cloud DNS напрямую для запроса внешних доменных имён.
Вместо этого, установите и настройте локальный кеширующий DNS-резолвер, например, systemd-resolved
, dnsmasq
или unbound
. Это ускорит выполнение публичных DNS-запросов, уменьшит их количество и ваши расходы.
Если на виртуальной машине установлена операционная система Ubuntu версии 18.04 LTS или выше, то в ней по умолчанию уже используется кеширующий резолвер systemd-resolved
, и дополнительных действий по установке и настройке не требуется. Подробнее см. в разделе Проверьте работоспособность systemd-resolved.
Если на виртуальной машине используется более старая версия Ubuntu, например, 16.04 LTS — кеширующий DNS-резолвер нужно установить самостоятельно. Мы рекомендуем использовать dnsmasq
или unbound
. Подробнее см. в разделе Установите альтернативный резолвер.
Чтобы настроить локальный кеширующий DNS-резолвер:
- Подготовьте облако к работе.
- Подготовьте инфраструктуру.
- Проверьте работоспособность systemd-resolved.
- Установите альтернативный резолвер.
- Замените резолвер на альтернативный.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за постоянно запущенную виртуальную машину (см. тарифы Yandex Compute Cloud);
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Подготовьте инфраструктуру
- Создайте виртуальную машину с ОС Ubuntu. Например, Ubuntu 18.04 LTS.
- Привяжите к ВМ публичный IP-адрес.
Проверьте работоспособность systemd-resolved
-
Подключитесь к ВМ по SSH.
-
Узнайте состояние кеширующего DNS-резолвера
systemd-resolved
. Для этого в Ubuntu 18.04+ выполните команду:systemd-resolve --status
Так как утилита
systemd-resolved
была переименована вresolvectl
, для Ubuntu 22.04+ команда будет отличаться:resolvectl status
Результат:
<...> Link 2 (eth0) <...> Current DNS Server: 192.168.6.2 DNS Servers: 192.168.6.2 DNS Domain: ru-central1.internal auto.internal
При корректной конфигурации, в выводе команды в строке
Current DNS Server:
будет указан адрес сервера Yandex Cloud DNS — второй адрес в виртуальной сети. Например,192.168.6.2
для ВМ в подсети192.168.6.0/24
. -
Убедитесь, что внешние DNS-имена успешно резолвятся DNS-сервером
127.0.0.53#53
. Для этого используйте утилитуdig
:dig example.com
Результат:
<...> ;; Query time: 69 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) <...>
При этом все резолвы внешнего DNS-имени, кроме самого первого, выполняются практически мгновенно.
Установите альтернативный резолвер
Важно
Параметры конфигурации приведены для примера. Как настроить кеширующий резолвер с учетом нагрузки на ВМ и ваших потребностей см. в документации выбранного резолвера.
dnsmasq
-
Установите пакеты
dnsmasq
иdnsutils
:sudo apt-get update -y sudo apt-get install dnsmasq dnsutils -y
-
Отредактируйте конфигурационный файл
/etc/dnsmasq.conf
, увеличив размер кэша до 1000 и ограничив локальной машиной адреса, которые слушает кеширующий резолвер.-
Откройте файл:
sudo nano /etc/dnsmasq.conf
-
Вставьте в файл текст:
cache-size=1000 listen-address=127.0.0.1 interface=lo bind-interfaces
-
-
Перезапустите сервис
dnsmasq
, чтобы применить новые настройки. Проверьте, что статус сервисаdnsmasq
сменился наactive (running)
, а в конце лога сервиса присутствует строкаStarted dnsmasq.service
:sudo systemctl restart dnsmasq.service sudo systemctl status dnsmasq.service
Результат:
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled) Active: active (running) <...> <...> Oct 28 22:39:57 <...> systemd[1]: Starting dnsmasq - A lightweight DHCP and caching DNS server... Oct 28 22:39:57 <...> dnsmasq[<...>]: dnsmasq: syntax check OK. Oct 28 22:39:57 <...> dnsmasq[<...>]: started, version 2.75 cachesize 150 <...> Oct 28 22:39:58 <...> dnsmasq[<...>]: using nameserver 192.168.6.2#53 Oct 28 22:39:58 <...> systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.
Также обратите внимание на адрес в строке
using nameserver <...>
. Там должен находиться адрес сервера Yandex Cloud DNS — второй адрес в виртуальной сети. Например,192.168.6.2
для ВМ в подсети192.168.6.0/24
. -
С помощью утилиты
dig
проверьте, что внешние DNS-имена успешно резолвятся:dig example.com @127.0.0.1 | grep -B3 Query
Результат:
;; ANSWER SECTION: example.com. 65420 IN A 93.184.216.34 ;; Query time: 3 msec
unbound
-
Установите пакеты
unbound
иdnsutils
:sudo apt-get update -y sudo apt-get install unbound dnsutils -y
-
Укажите настройки сервера в конце глобального конфигурационного файла
/etc/unbound/unbound.conf
или в отдельном конфигурационном файле с именем/etc/unbound/unbound.conf.d/<имя_файла>.conf
.-
Откройте файл:
sudo nano /etc/unbound/unbound.conf
-
Вставьте в конец файла текст:
server: port: 53 interface: 127.0.0.1 access-control: 127.0.0.0/8 allow do-ip4: yes do-ip6: no do-udp: yes do-tcp: yes num-threads: 2 num-queries-per-thread: 1024 hide-identity: yes hide-version: yes prefetch: yes verbosity: 1
-
-
Запустите сервис
unbound
, чтобы применить новые настройки. Проверьте, что статус сервисаunbound
сталactive (running)
, а в конце лога сервиса присутствует строкаStarted unbound.service
:sudo systemctl start unbound.service sudo systemctl status unbound.service
Результат:
● unbound.service - Unbound DNS server Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled) Active: active (running) <...> <...> Oct 29 00:21:06 <...> unbound[<...>]: * Starting DNS server unbound Oct 29 00:21:06 <...> unbound[<...>]: [<...>:0] info: start of service (unbound 1.5.8). Oct 29 00:21:06 <...> unbound[<...>]: ...done. Oct 29 00:23:21 <...> systemd[1]: Started unbound.service.
-
С помощью утилиты
dig
проверьте, что внешние DNS-имена успешно резолвятся:dig example.com @127.0.0.1 | grep -B3 Query
Результат:
;; ANSWER SECTION: example.com. 86400 IN A 93.184.216.34 ;; Query time: 611 msec
Замените резолвер на альтернативный
Если требуется заменить systemd-resolved
на другой локальный кеширующий DNS-резолвер:
-
Установите альтернативный резолвер по инструкции из раздела Альтернативные резолверы.
-
Отредактируйте конфигурационный файл
/etc/systemd/resolved.conf
, чтобы выключить stub-резолвер и указать127.0.0.1
в качестве адреса DNS-сервера:-
Откройте файл:
sudo nano /etc/unbound/unbound.conf
-
Вставьте в файл после строки
[Resolve]
текст:DNS=127.0.0.1 DNSStubListener=no
-
-
Создайте симлинк:
sudo ln -svi /run/systemd/resolve/resolv.conf /etc/resolv.conf
-
Перезапустите сервис
systemd-resolved
:systemctl restart systemd-resolved
-
Проверьте, что
dig
теперь использует сервер127.0.0.1#53
, а не127.0.0.53#53
:dig example.com
Результат:
<...> ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) <...>
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы удалите ВМ.