Настраиваем локальный 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
Помогла статья? Поддержи автора и новые статьи будут выходить чаще: