Как повысить отказоустойчивость DNS? Использовать кэширующие dns-серверы и не использовать штатную службу. Инструкция от нашего инженера.
В обычных обстоятельствах при стандартной нагрузке сети DNS-серверы работают как часы и не дают повода задумываться об их отказе. Однако весной 2022 года увеличилось общее количество DDoS-атак, что заставляет 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).
Расскажем подробнее о настройке и установке каждого из них.
all-servers позволяет обращаться к обоим dns-серверам одновременно, что исключает таймаут при запросе к недоступному dns-серверу.localУстановка пакета:
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 есть несколько команд. Например, запрос ниже покажет список серверов, количество отправленных к ним запросов, количество неудачных попыток по каждому из серверов в формате "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 будет проводиться в операционной системе 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'ам.