Вы наверняка знакомы с функциональностью сервера Angie в качестве обратного прокси и веб-сервера с поддержкой протокола HTTPS. Также Angie умеет проксировать и балансировать TCP и UDP-сервисы, включая DNS. Новый модуль DoH объединяет эти возможности, реализуя протокол DNS over HTTPS для клиентов. Если добавить модуль ACME с автоматическим получением TLS-сертификатов, получим готовое решение.
Навигация по циклу
Настройка location в Angie. Разделение динамических и статических запросов.
Перенаправления в Angie: return, rewrite и примеры их применения.
Сжатие текста в Angie: статика, динамика, производительность.
Настройка DNS over HTTPS с ACME сертификатами в Angie.
Видеоверсия
Для вашего удобства подготовлена видеоверсия этой статьи, доступна на Rutube, VKVideo и YouTube.
Что такое DoH и зачем он нужен?
Служба DNS (Domain Name System) играет ключевую роль в работе современного Интернета. Однако, первые версии стандарта разрабатывались без учета требований безопасности и конфиденциальности. Поэтому DNS — это открытый бинарный протокол, подверженный к перехвату и искажению в публичных сетях. Логичным развитием с точки зрения безопасности будет использование HTTPS в качестве транспорта для DNS. HTTPS реализует шифрование запросов и ответов DNS, что решает часть проблем безопасности.
Поддержка DoH со стороны клиентов достаточно широкая: основные браузеры (Chrome, Firefox, Safari), операционные системы (OpenWRT, Router OS, KeeneticOS), консольные утилиты (dig, curl, q).
Технически при использовании DoH сначала устанавливается обычное HTTPS-подключение, обычно по стандартному порту TCP 443. Если адрес DoH-сервера указывается в качестве имени, то потребуется вспомогательный DNS-сервер для преобразования имени в адрес. Далее клиент отправляет запрос методом GET или POST, в котором содержится тело DNS-запроса, тип контента указывается как application/dns-message. Успешный ответ отправляется с кодом 200 OK. Также в ответе устанавливается заголовок cache-control со значением параметра max-age, равным минимальному TTL (time to live), если его удалось получить в ответе DNS-сервера.
Пора попробовать модуль DoH в действии.
Модуль DoH в Angie
Модуль, реализующий DoH появился в версии 1.12. Он позволяет принимать DoH-подключения и проксировать DNS-запросы на обычные серверы по TCP и UDP. Помимо обычного проксирования можно настроить группу DNS-серверов для балансировки нагрузки и отказоустойчивости.
Рассмотрим базовую рабочую конфигурацию:
http { upstream dns_upstream { server 127.0.0.53:53; } server { listen 443 ssl; ssl_certificate /etc/angie/ssl/1.pem; ssl_certificate_key /etc/angie/ssl/1.key; server_name dns.test.ru; location / { doh_pass dns_upstream; } location /dns-query { doh_pass dns_upstream; } } }
Здесь мы создаём группу серверов (dns_upstream), где будет находиться список DNS-серверов. Пока в группе указан только локальный DNS-сервер systemd-resolved (127.0.0.53:53). Основной блок server описывает HTTPS-часть сервиса. Как обычно мы объявляем сокет директивой listen, домен в server_name, сертификат (ssl_certificate) и ключ (ssl_certificate_key). Запросы можно обрабатывать в отдельной локации по нужному URI (/dns-query) или без указания пути (/).
Ключевая директива здесь это doh_pass, которая отвечает за проксирование DNS-запросов на сервер или группу серверов. В примере выше мы сразу определили группу серверов (dns_upstream), что позволит легко добавить DNS-серверы в систему. При выборе сервера учитывайте требования безопасности, сервер должен находится в доверенной сети. Можно напрямую указать адрес сервера:
location / { doh_pass 127.0.0.53:53; }
Базовая настройка DoH выполнена, осталось проверить работоспособность схемы. Самый доступный инструмент с поддержкой DoH это утилита curl. Тестирование удобно выполнять с дополнительным флагом отладки (-v), чтобы получить максимум деталей по взаимодействию с сервером. Пример команды:
curl -v --head --doh-url https://dns.test.ru/dns-query https://ya.ru
Для теста нам достаточно запроса типа HEAD (параметр --head) и указания адреса DoH-сервера (--doh-url) последний параметр это адрес сайта для проверки. Если для теста используются недоверенные сертификаты, добавляем опцию --doh-insecure. Среди обширного выхлопа команды выделим ответы HTTP и DNS-записи:
... * using HTTP/1.x > POST / HTTP/1.1 > Host: dns.metodlab.ru > Accept: */* > Content-Type: application/dns-message > Content-Length: 23 ... < HTTP/1.1 200 OK < Server: Angie/1.12.1 < Date: Mon, 31 Aug 2026 11:32:06 GMT < Content-Type: application/dns-message < Content-Length: 71 < Connection: keep-alive < Cache-Control: max-age=77 ... * a DoH request is completed, 0 to go * DoH Host name: ya.ru * TTL: 77 seconds * DoH A: 5.255.255.242 * DoH A: 77.88.55.242 * DoH A: 77.88.44.242 * Host ya.ru:443 was resolved. ...
Первые два фрагмента показывают HTTP-запрос и ответ. В ответе указан заголовок Cache-Control (TTL записи). В третьем фрагменте содержимое ответа DNS (А-записи и TTL).
Мы добились работы основной функциональности, теперь посмотрим, что можно настроить дополнительно. Во-первых, curl поддерживает HTTP/2, поэтому активируем протокол в блоке server:
server { http2 on; }
По умолчанию Angie автоматически выбирает протокол для общения с DNS-сервером (TCP или UDP). Можно ограничить работу по одному протоколу (doh_transport):
server { doh_transport tcp; }
Как и в обычном проксировании для группы серверов можно включить keepalive-соединения (используется TCP):
upstream dns_upstream { server 192.168.0.1:53; server 192.168.0.2:53; keepalive 16; }
Дополнительно можно установить параметр сокета SO_KEEPALIVE для исходящих соединений с DNS-сервером:
server { doh_socket_keepalive on; }
Доступны настройки таймаутов при отправке запросов (doh_send_timeout) и получении ответов (doh_read_timeout). Также настраиваются буфер для ответа (doh_buffer_size) и ограничение запроса от клиента (doh_max_size). Все настройки описаны документации модуля.
Итак, DoH-сервер настроен, работоспособность проверена. Однако, мы обошли вопрос получения TLS-сертфикатов, в чём нам поможет модуль ACME.
Автоматические сертификаты с помощью ACME
Ранее мы подробно разбирали работу модуля ACME в отдельной статье. Здесь лишь стоит напомнить, что модуль ACME для Angie позволяет автоматизировать получение TLS-сертификатов по протоколу ACME с использованием проверок по HTTP, ALPN и DNS и внешних сервисов.
Дополним конфигурацию нашего сервера для получения автоматических сертификатов:
http { upstream dns_upstream { server 127.0.0.53:53; } acme_client ecdsa https://acme-v02.api.letsencrypt.org/directory; server { listen 443 ssl; acme ecdsa; ssl_certificate $acme_cert_ecdsa; ssl_certificate_key $acme_cert_key_ecdsa; server_name dns.test.ru; location / { doh_pass dns_upstream; } location /dns-query { doh_pass dns_upstream; } } }
Мы добавили описание сертификата (acme_client) и указали его в сервере. При первом старте Angie запустит процесс выпуска сертификата с проверкой по HTTP. Далее сертификат обновляется автоматически (перезагрузка конфигурации не требуется). Указание директивы resolver в современных версиях не требуется. Сокет для HTTP также будет открыт автоматически.
Напоминаю, что для получения wildcard-сертификата требуется DNS-проверка.
Теперь конфигурация получила законченный вид.
Итоги
В этой статье мы разобрались в базовых принципах работы протокола DNS over HTTPS (DoH). Используя модуль DoH сервера Angie настроили базовую конфигурацию с автоматическими TLS-сертификатами через ACME, а также обсудили возможности тонкой настройки взаимодействия с DNS-серверами.

