Вы наверняка знакомы с функциональностью сервера Angie в качестве обратного прокси и веб-сервера с поддержкой протокола HTTPS. Также Angie умеет проксировать и балансировать TCP и UDP-сервисы, включая DNS. Новый модуль DoH объединяет эти возможности, реализуя протокол DNS over HTTPS для клиентов. Если добавить модуль ACME с автоматическим получением TLS-сертификатов, получим готовое решение.

Навигация по циклу

  1. Почему стоит переходить на Angie.

  2. Установка Angie из пакетов и в докере.

  3. Переезд с Nginx на Angie. Пошаговая инструкция.

  4. Настройка location в Angie. Разделение динамических и статических запросов.

  5. Перенаправления в Angie: return, rewrite и примеры их применения.

  6. Сжатие текста в Angie: статика, динамика, производительность.

  7. Серверное кэширование в Angie: тонкости настройки.

  8. Настройка TLS в Angie: безопасность и скорость.

  9. Настройка Angie в роли обратного HTTP‑прокси.

  10. Балансировка нагрузки для HTTP(S) в Angie.

  11. Мониторинг Angie с помощью Console Light и API.

  12. Балансировка и проксирование L4-трафика в Angie.

  13. Клиентское кэширование в Angie.

  14. Динамические группы проксируемых серверов в Angie.

  15. Мониторинг Angie с Prometheus и Grafana.

  16. Отказоустойчивый кластер Angie с VRRP и Keepalived.

  17. Контроль доступа в Angie.

  18. Аутентификация клиентов в Angie с помощью TLS‑сертификатов.

  19. Кастомизация Angie (njs, Lua, Perl).

  20. Запуск CGI‑скриптов в Angie.

  21. Защита от DoS‑атак в Angie стандартными модулями.

  22. Защита от DoS‑атак в Angie (дополнительные средства).

  23. Автоматические TLS‑сертификаты в Angie с модулем ACME.

  24. HTTP/2 и HTTP/3: настройка, достоинства и недостатки.

  25. Работа с картинками в Angie.

  26. Инструменты для бенчмарка веб‑сервера.

  27. Тест современных компрессоров для HTTP.

  28. Визуализация кастомных метрик Angie в Grafana.

  29. Влияние TLS‑библиотек и настроек на производительность.

  30. Сборка Angie из исходных кодов.

  31. Оптимизация Angie для высоких нагрузок.

  32. Логирование в Angie.

  33. Работа с переменными в Angie.

  34. Работа с HTTP-заголовками запроса и ответа.

  35. Настройка 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-серверами.

Комментарии (0)