DoH#

Добавлено в версии 1.12.0.

Реализует сервер DNS over HTTPS (DoH) в соответствии с RFC 8484. Принимает DNS-запросы, передаваемые по HTTP/HTTPS, и проксирует их к группе DNS-серверов по UDP или TCP.

DoH-клиент отправляет DNS-запрос либо методом GET, передавая DNS-сообщение в закодированном Base64URL виде в аргументе строки запроса dns, либо методом POST, передавая необработанное DNS-сообщение в теле запроса. В обоих случаях тип содержимого DNS-сообщения — application/dns-message.

Принятый модулем DNS-ответ с ненулевым значением RCODE возвращается клиенту со статусом 200 (OK). Значение RCODE сохраняется в DNS-сообщении и не приводит к повторной попытке по условию invalid_response директивы doh_next_upstream.

Директива doh_transport определяет использование UDP или TCP для передачи запросов. Для защиты от подмены ответов сторонним источником модуль подставляет случайный идентификатор запроса, отправляемого DNS-серверу, и восстанавливает исходный идентификатор клиента в ответе.

Примечание

Эта рандомизация идентификатора запроса использует некриптографический генератор и обеспечивает лишь ограниченную защиту; используйте DNS-серверы, доступные в защищенной доверенной сети, как это рекомендуется для директивы resolver.

Поле заголовка ответа Cache-Control формируется на основе минимального TTL из ответа: оно устанавливается в max-age=<ttl> либо в no-store, если пригодное для кэширования значение TTL определить не удалось.

При сборке из исходного кода модуль можно отключить с помощью параметра сборки --without-http_doh_module. В пакетах и образах из наших репозиториев модуль включен в сборку.

Пример конфигурации#

Проксирование запросов DNS over HTTPS к группе DNS-серверов:

http {
    upstream dns_upstream {
        server 127.0.0.1:53;
    }

    server {
        listen 443 ssl;
        server_name dns.example.com;

        ssl_certificate     dns.example.com.crt;
        ssl_certificate_key dns.example.com.key;

        location /dns-query {
            doh_pass dns_upstream;
        }
    }
}

Директивы#

doh_bind#

Синтаксис

doh_bind адрес [transparent] | off;

По умолчанию

Контекст

http, server, location

Задает локальный IP-адрес с необязательным портом, который будет использоваться в исходящих соединениях с DNS-сервером. В значении параметра можно использовать переменные. Специальное значение off отменяет действие унаследованной с более высокого уровня конфигурации директивы doh_bind, позволяя системе самостоятельно выбирать локальный IP-адрес и порт.

Параметр transparent позволяет задать нелокальный IP-адрес, который будет использоваться в исходящих соединениях с DNS-сервером, например, реальный IP-адрес клиента:

doh_bind $remote_addr transparent;

Для работы параметра обычно требуется запускать рабочие процессы Angie с привилегиями суперпользователя. В Linux это не требуется, так как при указании параметра transparent рабочие процессы наследуют capability CAP_NET_RAW от главного процесса.

doh_buffer_size#

Синтаксис

doh_buffer_size размер;

По умолчанию

doh_buffer_size 16k;

Контекст

http, server, location

Задает размер буфера, в который читается ответ, получаемый от DNS-сервера. Значение не может быть меньше 512 байт.

doh_connect_timeout#

Синтаксис

doh_connect_timeout время;

По умолчанию

doh_connect_timeout 60s;

Контекст

http, server, location

Задает таймаут для установления соединения с DNS-сервером.

doh_max_size#

Синтаксис

doh_max_size размер;

По умолчанию

размер одной страницы памяти операционной системы

Контекст

http, server, location

Ограничивает размер DNS-запроса, принимаемого от клиента. Значение размера должно быть не меньше 12 байт. Запрос отклоняется, если его он меньше 12 байт (это размер заголовка DNS-сообщения) или превышает размер.

doh_next_upstream#

Синтаксис

doh_next_upstream error | timeout | invalid_response | off ...;

По умолчанию

doh_next_upstream error timeout;

Контекст

http, server, location

Определяет, в каких случаях запрос будет передан следующему серверу в группе upstream:

error

произошла ошибка при установлении соединения с сервером, передаче ему запроса или чтении ответа;

timeout

произошел таймаут при установлении соединения с сервером, передаче ему запроса или чтении ответа;

invalid_response

сервер вернул некорректный DNS-ответ;

off

запрещает передачу запроса следующему серверу.

Передача запроса следующему серверу может быть ограничена по количеству попыток и по времени.

doh_next_upstream_timeout#

Синтаксис

doh_next_upstream_timeout время;

По умолчанию

doh_next_upstream_timeout 0;

Контекст

http, server, location

Ограничивает время, в течение которого запрос может быть передан следующему серверу в группе. Значение 0 отключает это ограничение.

doh_next_upstream_tries#

Синтаксис

doh_next_upstream_tries число;

По умолчанию

doh_next_upstream_tries 0;

Контекст

http, server, location

Ограничивает число попыток передачи запроса следующему серверу в группе. Значение 0 отключает это ограничение.

doh_pass#

Синтаксис

doh_pass адрес;

По умолчанию

Контекст

location, if в location

Задает адрес DNS-сервера, которому проксируются DNS-запросы. Адрес может быть доменным именем или IP-адресом с указанием порта:

doh_pass 127.0.0.1:53;

или в виде группы серверов:

doh_pass dns_upstream;

Запросы передаются серверу через UDP или TCP в соответствии с директивой doh_transport. В одной локации может быть указана только одна директива doh_pass.

doh_read_timeout#

Синтаксис

doh_read_timeout время;

По умолчанию

doh_read_timeout 60s;

Контекст

http, server, location

Задает таймаут при чтении ответа DNS-сервера. Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями чтения. Если по истечении этого времени DNS-сервер ничего не передаст, соединение закрывается.

doh_send_timeout#

Синтаксис

doh_send_timeout время;

По умолчанию

doh_send_timeout 60s;

Контекст

http, server, location

Задает таймаут при передаче запроса DNS-серверу. Таймаут устанавливается не на всю передачу запроса, а только между двумя операциями записи. Если по истечении этого времени DNS-сервер ничего не получит, соединение закрывается.

doh_socket_keepalive#

Синтаксис

doh_socket_keepalive on | off;

По умолчанию

doh_socket_keepalive off;

Контекст

http, server, location

Включает параметр сокета SO_KEEPALIVE для исходящих соединений с DNS-сервером. При указании off действуют системные настройки сокета.

doh_transport#

Синтаксис

doh_transport tcp | udp | auto;

По умолчанию

doh_transport auto;

Контекст

http, server, location

Выбирает транспортный протокол, используемый для передачи DNS-запросов DNS-серверу:

auto

если в кэше соединений keepalive группы серверов есть свободное TCP-соединение, запрос отправляется по нему (TCP); в противном случае он сначала отправляется по UDP, а при усеченном ответе сервера (установлен флаг TC) повторяется по TCP;

udp

запросы отправляются только по UDP; усеченный ответ считается ошибкой, а запрос не повторяется по TCP;

tcp

запросы отправляются только по TCP.