2 puntos por GN⁺ 2024-07-02 | 1 comentarios | Compartir por WhatsApp
  • Doggo es un cliente de línea de comandos para consultas DNS que muestra los resultados con colores y en formato de tabla, con el objetivo de ofrecer una salida fácil de leer en la terminal
  • En entornos de automatización se puede usar salida JSON, y también sirve para analizar problemas con medición de tiempo de respuesta y modo de depuración
  • Puede manejar varios protocolos de transporte en una sola herramienta, como DNS over HTTPS, TLS, QUIC, TCP, UDP y DNSCrypt
  • Soporta funciones EDNS como EDNS Client Subnet, NSID, DNS Cookies, EDNS Padding, Extended DNS Errors, además del manejo de glue records
  • Funciona en Linux, macOS, Windows, FreeBSD y NetBSD, y además ofrece interfaz web y autocompletado de shell para usarse tanto en el CLI local como en el navegador

Consultas DNS fáciles de leer en la terminal

  • Doggo se presenta como un cliente DNS de línea de comandos pensado para personas
  • La salida predeterminada usa colores y un formato basado en tablas, lo que facilita revisar rápidamente las respuestas DNS
  • Si se necesita scripting o parsing, se puede usar salida JSON
  • También incluye modo de depuración y medición del tiempo de respuesta, para revisar no solo el resultado de la consulta sino también el proceso de ejecución

Protocolos DNS y datos compatibles

  • Soporta varios protocolos de transporte DNS
    • DNS over HTTPS
    • DNS over TLS
    • DNS over QUIC
    • DNS over TCP
    • DNS over UDP
    • DNSCrypt
  • También incluye ampliamente funciones relacionadas con EDNS
    • Respuestas con reconocimiento de ubicación mediante EDNS Client Subnet (ECS)
    • Name Server Identifier (NSID)
    • DNS Cookies
    • EDNS Padding
    • Extended DNS Errors (EDE)
  • Puede procesar glue records y datos DNS auxiliares de la additional section
  • Los Internationalized Domain Names (IDN) cuentan con conversión automática a punycode
  • También puede manejar consultas Reverse DNS y varias banderas DNS como AA, AD, CD y DO

Configuración, resolvers y entorno de ejecución

  • Se pueden usar las configuraciones ndots y search desde resolv.conf o desde argumentos de línea de comandos
  • Se pueden especificar varios resolvers y también personalizar la estrategia de consulta
  • Soporta tanto IPv4 como IPv6
  • Ofrece una interfaz web en doggo.mrkaran.dev
  • Incluye autocompletado de shell para zsh y fish
  • Las plataformas compatibles son Linux, macOS, Windows, FreeBSD y NetBSD

1 comentarios

 
GN⁺ 2024-07-02
Opiniones en Hacker News
  • Se ve realmente genial. ¿Podrías compartir más sobre por qué lo creaste, las decisiones de diseño y el contexto detrás de escena?

    • Lo hice como proyecto paralelo de aprendizaje y hobby. En 2021, mientras trabajaba mucho con clústeres de K8s, conocí ndots y quise crear un cliente DNS fácil de usar que no tuviera comportamientos inesperados por culpa del entorno del host.
      Lo hice en Go, que es lo que uso principalmente, y como no quería agregar dependencias externas si no eran estrictamente necesarias, no usé ningún framework de CLI. Me gusta especialmente haber creado una pequeña utilidad help.go para renderizar texto de ayuda con colores y formato.
      Con el tiempo recibí buenas contribuciones externas, en especial la de @jedisct1, que agregó soporte para DNSCrypt, algo importante. El lanzamiento de v1.0 se fue posponiendo durante más de un año por una mezcla de vida, otros proyectos y algo de procrastinación, y recién la semana pasada me puse una fecha límite y lo saqué adelante.
      Artículo sobre ndots: https://mrkaran.dev/posts/ndots-kubernetes/
  • Excelente elección de nombre. A los perritos (doggo) les gusta cavar (dig).

    • Hoy me enteré de que también existe dog. Probablemente también sea un error tipográfico común de dig.
  • También está bueno que haya una imagen de Docker. Sería bueno agregar en la documentación las opciones --rm para limpiar después de ejecutar y -t para los colores.
    docker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MX

    • Pregunta sincera: ¿hay alguna razón para tomarse tanto trabajo en convertir en contenedor Docker una utilidad CLI de DNS sin dependencias?
  • Quizá sea una pregunta un poco tonta, pero ¿por qué toda la salida aparece dos veces?
    Cuando ejecuto doggo google.com, aparecen los mismos registros A desde 127.0.2.2:53 y 127.0.2.3:53; con doggo news.ycombinator.com pasa lo mismo, se imprimen los resultados de dos servidores de nombres.

    • Parece que imprime una vez por cada servidor de nombres configurado. Supongo que es porque, aunque en la práctica sea raro, podrían dar respuestas distintas.
    • Lo probé con mi servidor DNS de AdGuard y solo sale una entrada. Parece estar relacionado con la configuración de servidores de nombres.
      ¿Puedes reproducirlo especificando un servidor de nombres personalizado como @1.1.1.1? doggo google.com --short me devolvió solo 142.250.185.238.
  • Sería muy bueno que esta herramienta admitiera un tipo de consulta equivalente a ANY.

  • Gran proyecto. Lo conocí el año pasado mientras desarrollaba x-cmd pkg; en ese momento la versión más reciente era la 0.5.7, y ahora ya está en 1.0.2, así que parece que toca actualizar la versión.
    También hay un video demo: https://x-cmd.com/pkg/doggo

  • Me recuerda a https://github.com/ogham/dog

    • Según el README de doggo en GitHub, está completamente inspirado en dog, escrito en Rust; como no sabía Rust pero quería agregar funciones, lo tomó como una buena oportunidad para escribir desde cero un cliente DNS en Go.
      Por eso el nombre también es dog + go => doggo.
    • Lamentablemente, parece que dog ya no tiene mantenimiento.
  • ¿Hay alguna razón por la que muchas de estas herramientas estén escritas en Go? Me pregunto si será por la biblioteca estándar o si es pura casualidad.

    • Go genera, en general, binarios compilados estáticamente por defecto. Sin runtime, sin intérprete, sin dependencias.
      Es difícil decir lo mismo de Python, Java, JavaScript, C#, etc.
    • También puede ser una cuestión cultural. Go tiene mucha presencia en el ámbito de DevOps/infraestructura cloud.
      Muchas herramientas como k8s, Terraform y sus providers están escritas en Go, y para herramientas internas suele competir en popularidad con Python.
    • En este caso, parece que la persona que lo creó ya sabía Go y por eso lo usó.
      Según el README, se inspiró en dog, escrito en Rust, y como no sabía Rust pero quería agregar funciones, decidió escribir él mismo un cliente DNS en Go. Por eso el nombre también es dog + go => doggo.
      https://github.com/ogham/dog
    • Go te permite terminar el trabajo, y el resultado sigue funcionando por mucho tiempo.
    • Obviamente, porque permite hacer un juego de palabras con el nombre.
  • ¿Esto está relacionado con Dog? Las funciones se ven casi idénticas.
    Ambos requieren indicar una consulta específica a ejecutar (A, AAAA, etc.); ¿por qué no usar como valor predeterminado consultar todos los registros? Al menos al consultar un solo dominio parece algo viable.
    https://github.com/mr-karan/doggo

    • ¿Qué significa exactamente todos los registros en este contexto? dig por defecto solo muestra registros A, y mantuve el mismo comportamiento.
      Me pregunto si te refieres a todos los tipos de registro posibles, o a algunos de los comunes como MX, AAAA, A, CNAME, TXT.
  • Felicitaciones por el lanzamiento 1.0. doggo ha sido mi herramienta DNS principal desde hace un tiempo y me encanta.