Top.Mail.Ru
поддержка 24/7
поддержка 24/7

Установка и настройка dnsmasq и unbound

Автор: Виталий Солдатов

Как повысить отказоустойчивость DNS? Использовать кэширующие dns-серверы и не использовать штатную службу. Инструкция от нашего инженера.

В обычных обстоятельствах при стандартной нагрузке сети DNS-серверы работают как часы и не дают повода задумываться об их отказе. Однако весной 2022 года увеличилось общее количество DDoS-атак, что заставляет DNS-серверы испытывать повышенные нагрузки. Время ответа на запросы становится критически большим, а иногда сервер выдаёт ошибку в связи с таймаутом.

Чтобы при таких повышенных нагрузках система работала корректно, можно повысить отказоустойчивость DNS следующими способами:

  1. Использование двух и более DNS-серверов одновременно
  2. Использование в сети кэширующих резолверов

Наш инженер написал подробную инструкцию, как это сделать. Обратите внимание, что эта инструкция справедлива лишь для ОС 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'ам.

Загрузка ...