DoH#

Added in version 1.12.0.

Implementa un servidor DNS over HTTPS (DoH) conforme a RFC 8484. Acepta consultas DNS transportadas por HTTP/HTTPS y las reenvía a un grupo de servidores DNS por UDP o TCP.

Un cliente DoH envía una consulta DNS ya sea como una solicitud GET, con el mensaje DNS codificado en Base64URL en el argumento de cadena de consulta dns, o como una solicitud POST, con el mensaje DNS sin procesar en el cuerpo de la solicitud. En ambos casos, el tipo de medio del mensaje DNS es application/dns-message.

Una respuesta DNS aceptada por el módulo con un RCODE distinto de cero se devuelve al cliente con el estado 200 (OK). El RCODE permanece en el mensaje DNS y no provoca un reintento bajo la condición invalid_response de doh_next_upstream.

La directiva doh_transport controla si las consultas usan UDP o TCP. Para protegerse contra la suplantación de respuestas fuera de ruta, el módulo aleatoriza el ID de consulta enviado al servidor DNS y restaura el ID original del cliente en la respuesta.

Nota

Esta aleatorización del ID de consulta usa un generador no criptográfico y ofrece solo una protección limitada; acceda a los servidores DNS a través de una red de confianza debidamente protegida, tal como se recomienda para la directiva resolver.

El campo de encabezado Cache-Control de la respuesta se deriva del TTL mínimo de la respuesta: se establece en max-age=<ttl>, o en no-store cuando no se puede determinar ningún TTL almacenable en caché.

Al compilar desde el código fuente, el módulo se puede deshabilitar con la opción de compilación --without-http_doh_module. En los paquetes e imágenes de nuestros repositorios, el módulo está incluido en la compilación.

Ejemplo de configuración#

Reenvío de consultas DNS over HTTPS a un grupo de servidores 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;
        }
    }
}

Directivas#

doh_bind#

Sintaxis

doh_bind address [transparent] | off;

Predeterminado

Contexto

http, server, location

Hace que las conexiones salientes a un servidor DNS se originen desde la dirección IP local especificada, con un puerto opcional. El valor del parámetro puede contener variables. El valor especial off cancela el efecto de la directiva doh_bind heredada del nivel de configuración anterior, permitiendo que el sistema asigne automáticamente la dirección IP y el puerto locales.

El parámetro transparent permite que las conexiones salientes a un servidor DNS se originen desde una dirección IP no local, por ejemplo, desde la dirección IP real de un cliente:

doh_bind $remote_addr transparent;

Para que este parámetro funcione, generalmente es necesario ejecutar los procesos de trabajo de Angie con privilegios de superusuario. En Linux esto no es necesario, ya que los procesos de trabajo heredan la capacidad CAP_NET_RAW del proceso maestro cuando se especifica el parámetro transparent.

doh_buffer_size#

Sintaxis

doh_buffer_size size;

Predeterminado

doh_buffer_size 16k;

Contexto

http, server, location

Establece el size del búfer usado para leer la respuesta recibida de un servidor DNS. El size no puede ser menor de 512 bytes.

doh_connect_timeout#

Sintaxis

doh_connect_timeout time;

Predeterminado

doh_connect_timeout 60s;

Contexto

http, server, location

Define un tiempo de espera para establecer una conexión con un servidor DNS.

doh_max_size#

Sintaxis

doh_max_size size;

Predeterminado

el tamaño de una página de memoria del sistema operativo

Contexto

http, server, location

Limita el tamaño de un mensaje de consulta DNS aceptado de un cliente. El size configurado debe ser de al menos 12 bytes. Se rechaza una consulta más corta de 12 bytes (el tamaño de un encabezado de mensaje DNS) o más larga que size.

doh_next_upstream#

Sintaxis

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

Predeterminado

doh_next_upstream error timeout;

Contexto

http, server, location

Especifica en qué casos una consulta debe pasarse al siguiente servidor del grupo upstream:

error

se produjo un error al establecer una conexión con el servidor, al pasarle una consulta o al leer la respuesta;

timeout

se produjo un tiempo de espera agotado al establecer una conexión con el servidor, al pasarle una consulta o al leer la respuesta;

invalid_response

el servidor devolvió una respuesta DNS no válida;

off

deshabilita el paso de una consulta al siguiente servidor.

El paso de una consulta al siguiente servidor puede limitarse mediante el número de intentos y el tiempo.

doh_next_upstream_timeout#

Sintaxis

doh_next_upstream_timeout time;

Predeterminado

doh_next_upstream_timeout 0;

Contexto

http, server, location

Limita el tiempo durante el cual una consulta puede pasarse al siguiente servidor. Establecer 0 deshabilita esta limitación.

doh_next_upstream_tries#

Sintaxis

doh_next_upstream_tries number;

Predeterminado

doh_next_upstream_tries 0;

Contexto

http, server, location

Limita el número de intentos posibles para pasar una consulta al siguiente servidor. Establecer 0 deshabilita esta limitación.

doh_pass#

Sintaxis

doh_pass address;

Predeterminado

Contexto

location, if in location

Establece la dirección de un servidor DNS al que se reenvían las consultas DNS. La dirección puede especificarse como un nombre de dominio o una dirección IP con un puerto:

doh_pass 127.0.0.1:53;

o como un grupo de servidores:

doh_pass dns_upstream;

Las consultas se reenvían al servidor por UDP o TCP, según lo configurado por la directiva doh_transport. Solo se puede especificar una directiva doh_pass en una ubicación.

doh_read_timeout#

Sintaxis

doh_read_timeout time;

Predeterminado

doh_read_timeout 60s;

Contexto

http, server, location

Define un tiempo de espera para leer una respuesta de un servidor DNS. El tiempo de espera se establece únicamente entre dos operaciones de lectura sucesivas, no para la transmisión de toda la respuesta. Si el servidor DNS no transmite nada dentro de este tiempo, la conexión se cierra.

doh_send_timeout#

Sintaxis

doh_send_timeout time;

Predeterminado

doh_send_timeout 60s;

Contexto

http, server, location

Establece un tiempo de espera para transmitir una solicitud a un servidor DNS. El tiempo de espera se establece únicamente entre dos operaciones de escritura sucesivas, no para la transmisión de toda la solicitud. Si el servidor DNS no recibe nada dentro de este tiempo, la conexión se cierra.

doh_socket_keepalive#

Sintaxis

doh_socket_keepalive on | off;

Predeterminado

doh_socket_keepalive off;

Contexto

http, server, location

Habilita la opción de socket SO_KEEPALIVE para las conexiones salientes a un servidor DNS. Con off, permanecen vigentes los ajustes de socket del sistema operativo.

doh_transport#

Sintaxis

doh_transport tcp | udp | auto;

Predeterminado

doh_transport auto;

Contexto

http, server, location

Selecciona el protocolo de transporte usado para reenviar consultas DNS a un servidor DNS:

auto

si la caché keepalive del upstream contiene una conexión TCP libre, la consulta se envía a través de ella (TCP); en caso contrario, primero se envía por UDP y se reintenta por TCP si el servidor responde con un mensaje truncado (se establece el indicador TC);

udp

las consultas se envían solo por UDP; una respuesta truncada se trata como un error, y la consulta no se reintenta por TCP;

tcp

las consultas se envían solo por TCP.