DoH#

Adicionado na versão 1.12.0.

Implementa um servidor DNS over HTTPS (DoH), conforme definido pela RFC 8484. Aceita consultas DNS transportadas por HTTP/HTTPS e as encaminha para um grupo de servidores DNS por UDP ou TCP.

Um cliente DoH envia uma consulta DNS como uma requisição GET, com a mensagem DNS codificada em Base64URL no argumento de string de consulta dns, ou como uma requisição POST, com a mensagem DNS bruta no corpo da requisição. Em ambos os casos, o tipo de mídia da mensagem DNS é application/dns-message.

Uma resposta DNS aceita pelo módulo com um RCODE diferente de zero é retornada ao cliente com o status 200 (OK). O RCODE permanece na mensagem DNS e não aciona uma nova tentativa sob a condição invalid_response de doh_next_upstream.

A diretiva doh_transport controla se as consultas usam UDP ou TCP. Para proteger contra a falsificação de respostas fora de caminho, o módulo randomiza o ID de consulta enviado ao servidor DNS e restaura o ID original do cliente na resposta.

Nota

Essa randomização do ID de consulta usa um gerador não criptográfico e oferece apenas proteção limitada; acesse os servidores DNS por meio de uma rede confiável devidamente protegida, como recomendado para a diretiva resolver.

O campo de cabeçalho Cache-Control da resposta é derivado do TTL mínimo da resposta: é definido como max-age=<ttl>, ou como no-store quando não é possível determinar nenhum TTL armazenável em cache.

Ao compilar a partir do código-fonte, o módulo pode ser desabilitado com a opção de compilação --without-http_doh_module. Nos pacotes e imagens de nossos repositórios, o módulo está incluído na compilação.

Exemplo de Configuração#

Encaminhamento de consultas DNS over HTTPS para um 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;
        }
    }
}

Diretivas#

doh_bind#

Sintaxe

doh_bind address [transparent] | off;

Padrão

Contexto

http, server, location

Faz com que as conexões de saída para um servidor DNS se originem do endereço IP local especificado, com uma porta opcional. O valor do parâmetro pode conter variáveis. O valor especial off cancela o efeito da diretiva doh_bind herdada do nível de configuração anterior, permitindo que o sistema atribua automaticamente o endereço IP e a porta locais.

O parâmetro transparent permite que as conexões de saída para um servidor DNS se originem de um endereço IP não local, por exemplo, do endereço IP real de um cliente:

doh_bind $remote_addr transparent;

Para que esse parâmetro funcione, geralmente é necessário executar os processos worker do Angie com privilégios de superusuário. No Linux isso não é necessário, pois os processos worker herdam a capacidade CAP_NET_RAW do processo mestre quando o parâmetro transparent é especificado.

doh_buffer_size#

Sintaxe

doh_buffer_size size;

Padrão

doh_buffer_size 16k;

Contexto

http, server, location

Define o size do buffer usado para ler a resposta recebida de um servidor DNS. O size não pode ser menor que 512 bytes.

doh_connect_timeout#

Sintaxe

doh_connect_timeout time;

Padrão

doh_connect_timeout 60s;

Contexto

http, server, location

Define um timeout para estabelecer uma conexão com um servidor DNS.

doh_max_size#

Sintaxe

doh_max_size size;

Padrão

o tamanho de uma página de memória do sistema operacional

Contexto

http, server, location

Limita o tamanho de uma mensagem de consulta DNS aceita de um cliente. O size configurado deve ser de pelo menos 12 bytes. Uma consulta mais curta que 12 bytes (o tamanho de um cabeçalho de mensagem DNS) ou maior que size é rejeitada.

doh_next_upstream#

Sintaxe

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

Padrão

doh_next_upstream error timeout;

Contexto

http, server, location

Especifica em quais casos uma consulta deve ser passada para o próximo servidor no grupo upstream:

error

ocorreu um erro ao estabelecer uma conexão com o servidor, ao passar uma consulta para ele ou ao ler a resposta;

timeout

ocorreu um timeout ao estabelecer uma conexão com o servidor, ao passar uma consulta para ele ou ao ler a resposta;

invalid_response

o servidor retornou uma resposta DNS inválida;

off

desabilita a passagem de uma consulta para o próximo servidor.

A passagem de uma consulta para o próximo servidor pode ser limitada pelo número de tentativas e pelo tempo.

doh_next_upstream_timeout#

Sintaxe

doh_next_upstream_timeout time;

Padrão

doh_next_upstream_timeout 0;

Contexto

http, server, location

Limita o tempo durante o qual uma consulta pode ser passada para o próximo servidor. Definir 0 desabilita essa limitação.

doh_next_upstream_tries#

Sintaxe

doh_next_upstream_tries number;

Padrão

doh_next_upstream_tries 0;

Contexto

http, server, location

Limita o número de tentativas possíveis para passar uma consulta para o próximo servidor. Definir 0 desabilita essa limitação.

doh_pass#

Sintaxe

doh_pass address;

Padrão

Contexto

location, if in location

Define o endereço de um servidor DNS para o qual as consultas DNS são encaminhadas. O endereço pode ser especificado como um nome de domínio ou endereço IP com uma porta:

doh_pass 127.0.0.1:53;

ou como um grupo de servidores:

doh_pass dns_upstream;

As consultas são encaminhadas ao servidor por UDP ou TCP, conforme configurado pela diretiva doh_transport. Apenas uma diretiva doh_pass pode ser especificada em uma location.

doh_read_timeout#

Sintaxe

doh_read_timeout time;

Padrão

doh_read_timeout 60s;

Contexto

http, server, location

Define um timeout para ler uma resposta de um servidor DNS. O timeout é definido apenas entre duas operações de leitura sucessivas, não para a transmissão de toda a resposta. Se o servidor DNS não transmitir nada dentro desse tempo, a conexão é fechada.

doh_send_timeout#

Sintaxe

doh_send_timeout time;

Padrão

doh_send_timeout 60s;

Contexto

http, server, location

Define um timeout para transmitir uma requisição a um servidor DNS. O timeout é definido apenas entre duas operações de escrita sucessivas, não para a transmissão de toda a requisição. Se o servidor DNS não receber nada dentro desse tempo, a conexão é fechada.

doh_socket_keepalive#

Sintaxe

doh_socket_keepalive on | off;

Padrão

doh_socket_keepalive off;

Contexto

http, server, location

Habilita a opção de socket SO_KEEPALIVE para conexões de saída a um servidor DNS. Com off, as configurações de socket do sistema operacional permanecem em vigor.

doh_transport#

Sintaxe

doh_transport tcp | udp | auto;

Padrão

doh_transport auto;

Contexto

http, server, location

Seleciona o protocolo de transporte usado para encaminhar consultas DNS a um servidor DNS:

auto

se o cache de keepalive do upstream contiver uma conexão TCP livre, a consulta é enviada por ela (TCP); caso contrário, ela é enviada primeiro por UDP e reenviada por TCP se o servidor responder com uma mensagem truncada (o flag TC é definido);

udp

as consultas são enviadas somente por UDP; uma resposta truncada é tratada como um erro, e a consulta não é reenviada por TCP;

tcp

as consultas são enviadas somente por TCP.