Настраиваем локальный DNS-резольвер Unbound с поддержкой DNS-over-TLS (DoT)

Протокол DNS лежит в основе работы интернета, но он был разработан еще в те времена, когда о безопасности передачи данных не задумывались. Сегодня этот недостаток критичен: пассивный наблюдатель может отследить всю вашу интернет-активность, а активный злоумышленник - подменить ответы сервера и перенаправить вас на фишинговый сайт. Чтобы обезопасить себя, настроим локальный DNS-резольвер, который будет обращаться к вышестоящим серверам по защищенному протоколу DNS-over-TLS.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark. Реклама ИП Скоромнов Д.А. ИНН 331403723315

Unbound - это свободный DNS‑сервер с открытым исходным кодом, который может работать в режиме валидирующего, рекурсивного и кеширующего резольвера. Его разработку ведет компания NLnet Labs и распространяет его под лицензией BSD, в данной статье мы рассмотрим его установку и настройку на современные системы Debian или Ubuntu.

Установка и настройка Unbound

Unbound присутствует в репозиториях всех основных DEB-based систем и для его установки достаточно команды:

1 apt install unbound

Конфигурационный файл располагается в /etc/unbound/unbound.conf и по умолчанию не содержит настроек.

Поэтому начнем наполнять его нужными опциями, которые мы сгруппировали по секциям.

Базовые параметры

Первым делом внесем следующие опции:

1server:
2    use-syslog: yes
3    username: "unbound"
4    directory: "/etc/unbound"
5    tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
6    verbosity: 2

Открывает настройки секция server и все что будет перечислено ниже будет входить в нее, пока мы не объявим новые секции, ну а пока мы задаем:

  • use-syslog - пишем логи в syslog/journald
  • username - задаем пользователя, от которого будет работать сервер - unbound
  • directory - каталог с настройками службы
  • tls-cert-bundle - корневые сертификаты CA для проверки TLS-соединений
  • verbosity - подробность лога, для продуктивных систем оптимально 2, для отладки можете увеличить до 5

Сетевые параметры

Ниже добавляем:

1    do-ip6: no
2    interface: 192.168.3.103
3    port: 53
  • do-ip6 - отключаем IPv6, сервер не будет слушать на нем адреса и не будет отправлять запросы по IPv6
  • interface - интерфейс, на котором сервер принимает запросы
  • port - используемый порт, стандартный 53

Кеширование

Далее добавим опции отвечающие за кеширование:

1    prefetch: yes
2    cache-max-ttl: 86400
3    cache-min-ttl: 900
4    aggressive-nsec: yes
  • prefetch - включаем предварительную выборку, Unbound будет самостоятельно обновлять истекающие записи в кеше, чтобы уменьшить задержку для клиента
  • cache-max-ttl - максимальный срок хранения записи в кеше - 24 часа, даже если вышестоящий сервер сообщил более высокий срок жизни записи
  • cache-min-ttl - минимальный срок действия записи - 15 минут, даже если вышестоящий сервер отдает более низкое значение
  • aggressive-nsec - использование NSEC/NSEC3 для агрессивного отрицательного кеширования (ускоряет ответы на отсутствующие домены)

Безопасность и приватность

Минимально необходимый набор опций:

1    root-hints: /usr/share/dns/root.hints
2    harden-dnssec-stripped: yes
3    hide-identity: yes
4    hide-version: yes
5    use-caps-for-id: yes
  • root-hints - файл с адресами корневых DNS-серверов, нужен если Unbound сам делает рекурсивные запросы
  • harden-dnssec-stripped - если зона подписана, но ответ не содержит подписи DNSSEC, то он отбрасывается как небезопасный
  • hide-identity - скрываем информацию о сервере
  • hide-version - скрываем информацию о версии сервера
  • use-caps-for-id - используем случайный регистр в запросах, отвечающий сервер должен сохранить регистр в ответе, иначе ответ отбрасывается

Защита от DNS-rebinding

Следующие опции содержат списки приватных сетей:

1    private-address: 192.168.0.0/16
2    private-address: 169.254.0.0/16
3    private-address: 172.16.0.0/12
4    private-address: 10.0.0.0/8
5    private-address: fd00::/8
6    private-address: fe80::/10

Если публичный домен вернет один из этих адресов - то такой ответ будет отброшен, аналогичные правила действуют и для обратных PTR-запросов.

Контроль доступа (ACL)

Важная настройка, которая не позволит вашему резольверу стать проходным двором:

1    access-control: 127.0.0.1/32 allow_snoop
2    access-control: ::1 allow_snoop
3    access-control: 127.0.0.0/8 allow
4    access-control: 192.168.3.0/24 allow
  • allow_snoop - разрешает как рекурсивные запросы, так и операции с кешем
  • allow - разрешает обычную рекурсию

Фактически здесь перечислены все, кто может работать с нашим резольвером. Для самого хоста мы разрешаем доступ к кешу, что может понадобиться при отладке, для остальных пользователей нашей локальной сети 192.168.3.0/24 разрешаем рекурсивные запросы.

Производительность

Ниже включим следующий блок:

1   num-threads: 4
2   msg-cache-slabs: 8
3   rrset-cache-slabs: 8
4   infra-cache-slabs: 8
5   key-cache-slabs: 8
6   rrset-cache-size: 256m
7   msg-cache-size: 128m
8   so-rcvbuf: 8m
  • num-threads - количество потоков, должно являться степенью двойки, желательно выставлять по количеству процессорных ядер/потоков
  • *-cache-slabs - количество слотов для разделения кеша, также должно быть степенью двойки и быть равным или превышать num-threads
  • rrset-cache-size - кеш для набора ресурсных записей
  • msg-cache-size - кеш для набора ответов, рекомендуется как rrset-cache-size/2
  • so-rcvbuf - размер буфера приема сокета

Эти настройки оптимальны для большинства небольших и средних сетей.

Пересылка запросов на вышестоящие DNS-серверы

Наконец мы перешли к тому, для чего все это и затевалось - к пересылке запросов вышестоящим DNS-серверам, но не просто пересылке, а с использованием DNS-over-TLS (DoT).

Для глобального форвардинга добавим следующую секцию:

1forward-zone:
2    name: "."
3    forward-ssl-upstream: yes
4    forward-addr: 1.1.1.1@853#one.one.one.one
5    forward-addr: 1.0.0.1@853#one.one.one.one
  • name - имя зоны, точка - "." - обозначает корневую зону, что соответствует любым запросам
  • forward-ssl-upstream - включает DoT
  • forward-addr - адрес сервера, порт 853 (стандарт для DoT) и имя хоста (SNI) для проверки TLS-сертификата

Последняя опция - имя хоста - не является обязательной, все будет работать и без нее, но в этом случае ваш сервер окажется уязвим к атакам "человек посередине", так как позволит перехватить и подделать ваш запрос.

Но возможности Unbound этим не исчерпываются, допустим, мы дополнительно хотим разрешать все имена зоны RU на серверах Яндекса. Нет ничего сложного - добавляем еще одну секцию:

1forward-zone:
2    name: "ru."
3    forward-ssl-upstream: yes
4    forward-addr: 77.88.8.8@853#common.dot.dns.yandex.net

Синтаксис секции полностью соответствует секции выше, единственный момент на который следует обратить внимание - имя зоны всегда должно заканчиваться на точку.

А как быть если нужно разрешать еще и локальные имена без поддержки DoT? Допустим у нас есть локальный домен excample.loc? Вопрос решается еще одной секцией:

1forward-zone:
2    name: "example.loc."
3    forward-addr: 192.168.3.101
4    forward-addr: 192.168.3.103

Здесь тоже все понятно, но обратите внимание - опцию forward-ssl-upstream мы не указываем, так как по умолчанию использование шифрования отключено.

Также добавьте в секцию server опцию:

1private-domain: "example.loc."

В противном случае все ответы от этой зоны будут заблокированы защитой от DNS-rebinding.

По окончании настройки сохраните файл конфигурации выполните его проверку:

1unbound-checkconf

Затем перезапустите службу DNS-резольвера:

1systemctl restart unbound

Ваш кеширующий DNS-резольвер с поддержкой DNS-over-TLS (DoT) готов к работе.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark. Реклама ИП Скоромнов Д.А. ИНН 331403723315

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал