Настройка DNS over HTTPS с ACME сертификатами в Angie

Вы наверняка знакомы с функциональностью сервера 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-серверами.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.