Executando verificação de segurança...
2

DoH: como funciona a consulta DNS no Clear Address?

Olá, pessoal!

Recentemente, o valterpatrick sugeriu que mostrasse como as consultas DNS são realizadas no site clear-address.rda.run. Agradeço muito pela pergunta, pois ela abre espaço para discutirmos um tema que considero fascinante e muito útil: DNS over HTTPS (DoH).

Em vez de usar o protocolo DNS tradicional, que geralmente opera de forma não criptografada na porta 53, o site utiliza as APIs públicas de resolvedores DNS que suportam HTTPS. Na prática, isso significa que uma consulta DNS se transforma em uma simples chamada HTTP. Isso traz uma camada extra de privacidade e segurança, pois a consulta se camufla como tráfego HTTPS comum.

A Mágica por Trás da Cortina: As APIs

O backend do Clear Address faz chamadas para resolvedores DoH, como os oferecidos pela Cloudflare e pelo Google. A escolha entre eles pode variar, mas o princípio é exatamente o mesmo.

A ideia é enviar uma requisição GET para um endpoint específico, passando o domínio e o tipo de registro desejado como parâmetros na URL. O servidor responde com um JSON contendo os resultados da consulta.

DoH via Cloudflare

A Cloudflare é uma das provedoras mais conhecidas de serviços DoH. A documentação completa pode ser encontrada aqui.

Para consultar o registro AAAA (endereço IPv6) do próprio clear-address.rda.run, a URL da API fica assim:

https://cloudflare-dns.com/dns-query?name=clear-address.rda.run&type=AAAA

Usando cURL

Você pode testar isso diretamente no seu terminal com o cURL. O header Accept é importante para garantir que a Cloudflare nos devolva uma resposta em JSON.

curl -H 'Accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=clear-address.rda.run&type=AAAA'

Usando Go

No backend, o processo é similar. Aqui está um exemplo simples em Go de como fazer essa chamada e processar a resposta.

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

// Estrutura para receber a resposta da API da Cloudflare
type DNSResponse struct {
    Status   int  `json:"Status"`
    TC       bool `json:"TC"`
    RD       bool `json:"RD"`
    RA       bool `json:"RA"`
    AD       bool `json:"AD"`
    CD       bool `json:"CD"`
    Question []struct {
        Name string `json:"name"`
        Type int    `json:"type"`
    } `json:"Question"`
    Answer []struct {
        Name string `json:"name"`
        Type int    `json:"type"`
        TTL  int    `json:"TTL"`
        Data string `json:"data"`
    } `json:"Answer"`
}

func main() {
    // URL da API da Cloudflare para a consulta desejada
    url := "https://cloudflare-dns.com/dns-query?name=clear-address.rda.run&type=AAAA"

    // Cria uma nova requisição
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        panic(err)
    }

    // Adiciona o header 'Accept' para especificar o formato da resposta
    req.Header.Add("Accept", "application/dns-json")

    // Executa a requisição
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // Lê o corpo da resposta
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    // Decodifica o JSON na nossa struct
    var dnsResp DNSResponse
    if err := json.Unmarshal(body, &dnsResp); err != nil {
        panic(err)
    }

    // Imprime os resultados
    fmt.Println("Resultados da consulta DNS:")
    if len(dnsResp.Answer) > 0 {
        for _, answer := range dnsResp.Answer {
            fmt.Printf(" - Domínio: %s\n", answer.Name)
            fmt.Printf("   Tipo: AAAA\n")
            fmt.Printf("   TTL: %d\n", answer.TTL)
            fmt.Printf("   Endereço IPv6: %s\n", answer.Data)
        }
    } else {
        fmt.Println("Nenhum registro AAAA encontrado.")
    }
}

DoH via Google

O Google oferece um serviço similar, documentado aqui. A lógica é a mesma, mudando apenas a URL.

https://dns.google/resolve?name=clear-address.rda.run&type=AAAA

A implementação, seja com cURL ou Go, seguiria o mesmo padrão, adaptando-se apenas à estrutura do JSON de resposta do Google, que pode ter pequenas diferenças.

Backend vs. Frontend

Uma observação importante: no Clear Address, essas chamadas são sempre feitas pelo backend. Nunca tentei fazê-las diretamente pelo frontend (via JavaScript no navegador), então não sei dizer se haveria problemas com CORS (Cross-Origin Resource Sharing) ou a necessidade de algum header específico para que a requisição fosse aceita. Fazer pelo backend simplifica o processo e mantém a lógica de negócio no servidor.

Conclusão

E é isso! Sem grande complexidade, o Clear Address apenas utiliza as APIs públicas e bem documentadas de grandes players para resolver nomes de domínio de forma segura e privada.

Espero que este artigo tenha saciado a curiosidade e mostrado como é simples implementar algo parecido.

O que vocês acham dessa abordagem? Já usaram DoH em algum projeto? Deixem suas experiências e dúvidas nos comentários.

Um abraço,

Rodrigo de Avila

Carregando publicação patrocinada...
1

O seu artigo foi bem instrutivo, aprendi muito.
A pergunta que podemos fazer agora é:

  • Se for para fazer a validação do email, podemos usar apenas um dos dois servidores de DNS que você usou ou os dois?
  • Com base na sua experiência, o que indica para nós fazermos? Isto no caso de querermos implementar a consulta em nossos sistemas.
2

Obrigado pelo feedback!

  • A pesquisa pode ser feita em qualquer um dos dois servidores. Eles vão retornar os mesmos resultados, já que eles só estão respondendo a uma consulta DNS.
  • Ainda vou escrever um artigo mostrando como se faz o teste de e-mail usando DNS. Mas é basicamente procurar por registros DNS do tipo MX para o domínio do e-mail, que retorne servidores reais. E depois ir pesquisando se estes servidores realmente existem.