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#
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#
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#
Define um timeout para estabelecer uma conexão com um servidor DNS.
doh_max_size#
| |
Padrão | o tamanho de uma página de memória do sistema operacional |
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#
| |
Padrão |
|
http, server, location |
Especifica em quais casos uma consulta deve ser passada para o próximo servidor no grupo upstream:
| ocorreu um erro ao estabelecer uma conexão com o servidor, ao passar uma consulta para ele ou ao ler a resposta; |
| ocorreu um timeout ao estabelecer uma conexão com o servidor, ao passar uma consulta para ele ou ao ler a resposta; |
| o servidor retornou uma resposta DNS inválida; |
| 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#
| |
Padrão |
|
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#
| |
Padrão |
|
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#
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#
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#
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#
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#
Seleciona o protocolo de transporte usado para encaminhar consultas DNS a um servidor DNS:
| 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 |
| as consultas são enviadas somente por UDP; uma resposta truncada é tratada como um erro, e a consulta não é reenviada por TCP; |
| as consultas são enviadas somente por TCP. |