Автор: Виталий Солдатов
Как повысить отказоустойчивость DNS? Использовать кэширующие dns-серверы и не использовать штатную службу. Инструкция от нашего инженера.
В обычных обстоятельствах при стандартной нагрузке сети DNS-серверы работают как часы и не дают повода задумываться об их отказе. Однако весной 2022 года увеличилось общее количество DDoS-атак, что заставляет DNS-серверы испытывать повышенные нагрузки. Время ответа на запросы становится критически большим, а иногда сервер выдаёт ошибку в связи с таймаутом.
Чтобы при таких повышенных нагрузках система работала корректно, можно повысить отказоустойчивость DNS следующими способами:
- Использование двух и более DNS-серверов одновременно
- Использование в сети кэширующих резолверов
Наш инженер написал подробную инструкцию, как это сделать. Обратите внимание, что эта инструкция справедлива лишь для ОС Linux.
Публичные рекурсивные серверы
Публичные информационные системы с доступом в интернет используют различные публичные dns-серверы. Критерием выбора тут могут выступать стабильная доступность и минимальное время отклика. Выбор серверов в любом случае остается на ваше усмотрение. Операторы связи или другие владельцы автономных систем со своей стороны обязаны подключиться к национальной системе доменных имен (НСДИ), выдавать их dns-серверы в качестве резолверов клиентам напрямую или обеспечить взаимодействие путём настройки собственных dns-серверов. Публичные резолверы НСДИ приведены в таблице ниже, мы будем использовать их далее в качестве примера при настройке dnsmasq
.
имя | a.res-nsdi.ru | b.res-nsdi.ru |
ipv4 | 195.208.4.1 | 195.208.5.1 |
ipv6 | 2a0c:a9c7:8::1; | 2a0c:a9c7:9::1 |
Допустим, в вашем программном обеспечении присутствует функционал, который обращается к сторонним API по доменному имени. Использование штатной службы распознавания доменных имён systemd-resolved
увеличит время обращения к API при недоступности одного из dns-серверов. В такой ситуации возможен или сбой в работе вашей программы, или существенное увеличение времени её работы, что в свою очередь негативно скажется на ваших клиентах.
Чтобы избежать таких сбоев, можно использовать легковесный и быстроконфигурируемый DNS-, DHCP- и TFTP-сервер, предназначенный для обеспечения доменными именами и связанными с ними сервисами небольших сетей dnsmasq
в операционных системах ubuntu/debian вместо штатной службы systemd-resolved
.
Кроме этого, можно развернуть в своей локальной сети или в виртуальной инфраструктуре собственные кэширующие dns-серверы на базе unbound
(проверяющий, рекурсивный и кэширующий продукт распознавания DNS от NLnet Labs).
Расскажем подробнее о настройке и установке каждого из них.
Преимущества использования dnsmasq:
- Опция
all-servers
позволяет обращаться к обоим dns-серверам одновременно, что исключает таймаут при запросе к недоступному dns-серверу - Не имеет ограничений на использование зоны
.local
Установка и настройка dnsmasq
Установка пакета:
apt update && apt install dnsmasq -y
Создание конфигурационного файла:
cat << EOF > /etc/dnsmasq.d/dns.conf port=53 listen-address=127.0.0.1,127.0.0.53 server=195.208.4.1 server=195.208.5.1 no-resolv all-servers cache-size=10000 EOF
Удаление символьной ссылки и создание нового resolv.conf
:
rm /etc/resolv.conf -f cat << \EOF > /etc/resolv.conf nameserver 127.0.0.53 EOF
Остановка старой службы, запуск новой:
systemctl stop systemd-resolved systemctl disable systemd-resolved systemctl restart dnsmasq
Диагностика dnsmasq
Для диагностики работы в dnsmasq
есть несколько команд. Например, запрос ниже покажет список серверов, количество отправленных к ним запросов, количество неудачных попыток по каждому из серверов в формате "195.208.4.1#53 100 0" "195.208.5.1#53 100 10"
dig +short chaos txt servers.bind
Другие команды относятся к статистике кэша:
dig +short chaos txt insertions.bind dig +short chaos txt evictions.bind dig +short chaos txt misses.bind dig +short chaos txt hits.bind
Простота команд позволяет организовать мониторинг. Если у вас используется система мониторинга на базе Prometheus, для сбора статистики можно использовать dnsmasq_exporter.
Установив ранее dnsmasq
на каждой виртуальной машине, можно собрать статистику по запросам и в случае, если суммарное количество запросов превышает миллион, можно настроить в виртуальной инфраструктуре дополнительно два кэширующих dns-сервера.
Установка и настройка unbound
В конкретном примере установка unbound
будет проводиться в операционной системе FreeBSD.
После установки ОС необходимо установить обновления, unbound
и необходимые пакеты для мониторинга работы сервиса unbound_exporter
и виртуальной машины node_exporter
:
freebsd-update fetch freebsd-update install pkg pkg update pkg install wget unbound unbound_exporter node_exporter open-vm-tools-nox11
До настройки конфигурации необходимо разово выполнить подготовительные работы:
wget https://www.internic.net/domain/named.root -O /usr/local/etc/unbound/root.hints unbound-control-setup unbound-anchor -F chown unbound:unbound /usr/local/etc/unbound/*
Создается конфигурационный файл /usr/local/etc/unbound/unbound.conf
, где num-threads
равен количеству vCPU. Все другие параметры следует сравнить с указанными в unbound.conf.sample
и при необходимости выбрать лучшее для вас значение. В access-control
указываются сети с вашими dns-клиентами.
server: interface: 0.0.0.0 num-threads: 2 root-hints: "/usr/local/etc/unbound/root.hints" verbosity: 1 extended-statistics: yes do-ip4: yes do-ip6: no do-udp: yes do-tcp: yes cache-min-ttl: 3600 cache-max-ttl: 86400 rrset-cache-size: 256m msg-cache-size: 256m outgoing-range: 32768 so-rcvbuf: 32m num-queries-per-thread: 4096 infra-cache-numhosts: 100000 access-control: 127.0.0.0/8 allow access-control: 192.168.0.0/16 allow access-control: 10.0.0.0/8 allow hide-identity: yes hide-version: yes harden-glue: yes harden-dnssec-stripped: yes harden-below-nxdomain: yes harden-referral-path: yes qname-minimisation: yes aggressive-nsec: yes unwanted-reply-threshold: 10000000 prefetch: yes prefetch-key: yes rrset-roundrobin: yes minimal-responses: yes remote-control: control-enable: yes control-interface: 127.0.0.1 control-port: 8953 control-use-cert: "yes" server-key-file: "/usr/local/etc/unbound/unbound_server.key" server-cert-file: "/usr/local/etc/unbound/unbound_server.pem" control-key-file: "/usr/local/etc/unbound/unbound_control.key" control-cert-file: "/usr/local/etc/unbound/unbound_control.pem"
Программа unbound-checkconf
поможет проверить конфигурационный файл на наличие ошибок. При отсутствии ошибок нужно включить сервисы и запустить:
sysrc unbound_enable="yes" sysrc unbound_exporter_enable="yes" sysrc unbound_exporter_ca="/usr/local/etc/unbound/unbound_server.pem" sysrc unbound_exporter_cert="/usr/local/etc/unbound/unbound_control.pem" sysrc unbound_exporter_key="/usr/local/etc/unbound/unbound_control.key" sysrc node_exporter_enable="yes" serivce unbound start serivce unbound_exporter start serivce node_exporter start
Осталось заменить текущие dns-серверы в /etc/resolv.conf
на локальный:
nameserver 127.0.0.1
Проверка работоспособности выполняется встроенной в пакет командой drill
:
root@unbound:/ # drill www.corpsoft24.ru ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 40194 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; www.corpsoft24.ru. IN A ;; ANSWER SECTION: www.corpsoft24.ru. 3600 IN A 178.20.237.7 ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 2 msec ;; SERVER: 127.0.0.1 ;; WHEN: Sun Apr 10 19:06:57 2022 ;; MSG SIZE rcvd: 51 root@unbound:/ # drill www.corpsoft24.ru ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 26303 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; www.corpsoft24.ru. IN A ;; ANSWER SECTION: www.corpsoft24.ru. 3592 IN A 178.20.237.7 ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 0 msec ;; SERVER: 127.0.0.1 ;; WHEN: Sun Apr 10 19:07:05 2022 ;; MSG SIZE rcvd: 51
Результаты подтверждают работоспособность сервиса. Повторный запрос был обработан практически мгновенно, поскольку запись уже появилась в кэше.
Если у вас используется система мониторинга на базе Prometheus, то вы можете настроить регулярный опрос установленных exporter'ов и получить наглядную статистику по работе ваших dns-серверов. Дополнительно следует настроить пакетный фильтр pf
и ограничить доступ к sshd, exporter'ам.