2 pontos por GN⁺ 2024-07-02 | 1 comentários | Compartilhar no WhatsApp
  • Doggo é um cliente de DNS em linha de comando que mostra os resultados de consultas DNS em cores e formato de tabela, com foco em uma saída fácil de ler no terminal
  • Em ambientes de automação, é possível usar saída em JSON, e a ferramenta também pode ser usada para análise de problemas com medição de tempo de resposta e modo de depuração
  • Vários protocolos de transporte podem ser usados em uma única ferramenta, como DNS over HTTPS, TLS, QUIC, TCP, UDP e DNSCrypt
  • Suporta recursos de EDNS como EDNS Client Subnet, NSID, DNS Cookies, EDNS Padding, Extended DNS Errors, além do tratamento de glue records
  • Funciona em Linux, macOS, Windows, FreeBSD e NetBSD, e ainda oferece interface web e autocompletar de shell para uso tanto no CLI local quanto no navegador

Consultas DNS fáceis de ler no terminal

  • Doggo se apresenta como um cliente de DNS em linha de comando feito para pessoas
  • A saída padrão usa cores e formato baseado em tabelas, facilitando uma leitura rápida das respostas DNS
  • Quando há necessidade de scripting ou parsing, é possível usar saída em JSON
  • Também oferece modo de depuração e medição de tempo de resposta, permitindo verificar não só o resultado da consulta, mas também o processo de execução

Protocolos e dados DNS suportados

  • Suporta vários protocolos de transporte DNS
    • DNS over HTTPS
    • DNS over TLS
    • DNS over QUIC
    • DNS over TCP
    • DNS over UDP
    • DNSCrypt
  • Também inclui amplo suporte a recursos relacionados a EDNS
    • Respostas com reconhecimento de localização por meio de EDNS Client Subnet (ECS)
    • Name Server Identifier (NSID)
    • DNS Cookies
    • EDNS Padding
    • Extended DNS Errors (EDE)
  • Consegue processar glue records na additional section e dados auxiliares de DNS
  • Para Internationalized Domain Names (IDN), oferece conversão automática para punycode
  • Também lida com reverse DNS lookup e vários flags de DNS, como AA, AD, CD e DO

Configuração, resolvedores e ambiente de execução

  • É possível usar as configurações ndots e search a partir de resolv.conf ou de argumentos de linha de comando
  • É possível especificar vários resolvedores e também personalizar a estratégia de consulta
  • Suporta tanto IPv4 quanto IPv6
  • Oferece uma interface web em doggo.mrkaran.dev
  • Oferece autocompletar de shell para zsh e fish
  • As plataformas suportadas são Linux, macOS, Windows, FreeBSD e NetBSD

1 comentários

 
GN⁺ 2024-07-02
Comentários no Hacker News
  • Parece muito legal. Você poderia compartilhar mais sobre por que criou, as decisões de design e o contexto dos bastidores?

    • Fiz como um projeto paralelo de aprendizado e hobby. Em 2021, enquanto eu lidava bastante com clusters K8s, conheci o ndots e passei a querer criar um cliente DNS fácil de usar que não tivesse comportamentos inesperados por causa do ambiente do host.
      Fiz em Go, que é o que uso principalmente, e não quis adicionar dependências externas se não fossem realmente necessárias, então não usei nenhum framework de CLI. Gosto especialmente da parte em que criei um pequeno utilitário help.go para renderizar textos de ajuda com cores e formatação.
      Com o tempo, recebi boas contribuições externas, especialmente do @jedisct1, que adicionou suporte a DNSCrypt. O lançamento da v1.0 ficou sendo adiado por mais de um ano; foi uma combinação de vida, outros projetos e um pouco de procrastinação, e só na semana passada eu defini um prazo e empurrei até o fim.
      Post sobre ndots: https://mrkaran.dev/posts/ndots-kubernetes/
  • Excelente escolha de nome. Cachorros (doggo) gostam de cavar (dig)

    • Descobri hoje que também existe o dog. Provavelmente também é um erro de digitação comum de dig
  • Também é bom ter uma imagem Docker. Seria legal adicionar à documentação as opções --rm para limpar depois da execução e -t para cores.
    docker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MX

    • Só por curiosidade: qual seria o motivo para se dar ao trabalho de criar um contêiner Docker para um utilitário CLI de DNS sem dependências?
  • Pode ser uma pergunta meio boba, mas por que toda a saída aparece duas vezes?
    Quando executo doggo google.com, recebo o mesmo registro A vindo de 127.0.2.2:53 e de 127.0.2.3:53, e com doggo news.ycombinator.com acontece o mesmo, mostrando resultados dos dois nameservers

    • Parece que ele imprime uma vez para cada nameserver configurado. Deve ser porque, embora seja raro na prática, eles podem dar respostas diferentes
    • Tentei no meu servidor DNS do AdGuard e apareceu só uma entrada. Parece estar relacionado à configuração de nameservers.
      Você consegue reproduzir especificando um nameserver customizado, como @1.1.1.1? doggo google.com --short retornou apenas 142.250.185.238
  • Seria muito bom se essa ferramenta desse suporte a um tipo de consulta equivalente a ANY

  • Projeto bacana. Conheci no ano passado enquanto desenvolvia o x-cmd pkg; na época a versão mais recente era a 0.5.7, e agora está na 1.0.2, então parece que preciso atualizar a versão.
    Também há um vídeo de demonstração: https://x-cmd.com/pkg/doggo

  • Me lembrou o https://github.com/ogham/dog

    • Segundo o README do doggo no GitHub, ele foi totalmente inspirado no dog, escrito em Rust, e como o autor não conhecia Rust mas queria adicionar recursos, aproveitou como uma boa oportunidade para escrever um cliente DNS do zero em Go.
      Daí o nome também virou dog + go => doggo
    • Infelizmente, o dog parece estar sem manutenção
  • Existe algum motivo para tantas ferramentas assim serem escritas em Go? Fico me perguntando se é por causa da biblioteca padrão ou se é só coincidência

    • Go basicamente gera binários compilados estaticamente por padrão. Sem runtime, sem interpretador, sem dependências.
      É difícil dizer o mesmo de Python, Java, JavaScript, C# etc.
    • Também pode ser uma questão cultural. Go tem muita exposição na área de DevOps/infraestrutura em nuvem.
      Muitas ferramentas, como k8s, Terraform e seus providers, foram escritas em Go, e ele costuma disputar popularidade com Python para escrever ferramentas internas
    • Neste caso, parece que a pessoa usou Go porque já conhecia a linguagem.
      Segundo o README, ele foi inspirado no dog, escrito em Rust, e como não conhecia Rust mas queria adicionar recursos, acabou escrevendo um cliente DNS próprio em Go. Por isso o nome também é dog + go => doggo.
      https://github.com/ogham/dog
    • Go ajuda você a terminar o trabalho, e o resultado continua durando por muito tempo
    • Claro, porque dá para transformar o nome em um trocadilho
  • Isso tem relação com o Dog? As funcionalidades parecem quase idênticas.
    Ambos exigem um tipo específico de consulta a executar (A, AAAA etc.); por que não usar como padrão uma consulta a todos os registros? Pelo menos ao consultar um único domínio, isso parece possível.
    https://github.com/mr-karan/doggo

    • O que exatamente você quer dizer com todos os registros aqui? O dig por padrão mostra só registros A, e mantive o comportamento igual.
      Fiquei em dúvida se você quer dizer todos os tipos de registros possíveis ou apenas alguns comuns como MX, AAAA, A, CNAME, TXT
  • Parabéns pela release 1.0. O doggo tem sido minha principal ferramenta de DNS há um tempo, e eu gosto muito dele