2 điểm bởi GN⁺ 2024-07-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • Doggo là một ứng dụng dòng lệnh hiển thị kết quả truy vấn DNS bằng phân biệt màu sắc và dạng bảng, hướng tới đầu ra dễ đọc cho con người trong terminal
  • Trong môi trường tự động hóa có thể dùng đầu ra JSON, đồng thời cũng hữu ích cho phân tích sự cố nhờ đo thời gian phản hồi và chế độ debug
  • Có thể xử lý nhiều giao thức truyền tải như DNS over HTTPS, TLS, QUIC, TCP, UDP, DNSCrypt trong một công cụ
  • Hỗ trợ các tính năng EDNS như EDNS Client Subnet, NSID, DNS Cookies, EDNS Padding, Extended DNS Errors và xử lý glue record
  • Hoạt động trên Linux, macOS, Windows, FreeBSD, NetBSD; cung cấp cả giao diện web và shell completion, nên có thể dùng cả ở CLI cục bộ lẫn trình duyệt

Truy vấn DNS dễ đọc trong terminal

  • Doggo tự định vị là ứng dụng DNS dòng lệnh dành cho con người
  • Đầu ra mặc định được cấu thành theo định dạng dựa trên bảng và phân biệt màu sắc, thuận tiện để lướt nhanh phản hồi DNS
  • Khi cần scripting hoặc parsing, có thể dùng đầu ra JSON
  • Cung cấp cả chế độ debug và đo thời gian phản hồi, giúp kiểm tra không chỉ kết quả truy vấn mà cả quá trình hoạt động

Các giao thức và dữ liệu DNS được hỗ trợ

  • Hỗ trợ nhiều giao thức truyền tải DNS
    • DNS over HTTPS
    • DNS over TLS
    • DNS over QUIC
    • DNS over TCP
    • DNS over UDP
    • DNSCrypt
  • Cũng bao gồm rộng rãi các tính năng liên quan đến EDNS
    • Phản hồi nhận biết vị trí thông qua EDNS Client Subnet(ECS)
    • Name Server Identifier(NSID)
    • DNS Cookies
    • EDNS Padding
    • Extended DNS Errors(EDE)
  • Có thể xử lý glue record trong additional section và dữ liệu DNS bổ trợ
  • Internationalized Domain Names(IDN) hỗ trợ tự động chuyển đổi punycode
  • Cũng có thể xử lý Reverse DNS lookup và nhiều cờ DNS như AA, AD, CD, DO

Cấu hình, resolver và môi trường chạy

  • Có thể dùng cấu hình ndotssearch từ resolv.conf hoặc tham số dòng lệnh
  • Có thể chỉ định nhiều resolver và tùy chỉnh cả chiến lược truy vấn
  • Hỗ trợ cả IPv4 và IPv6
  • Cung cấp giao diện web tại doggo.mrkaran.dev
  • Cung cấp shell completion cho zshfish
  • Các nền tảng được hỗ trợ là Linux, macOS, Windows, FreeBSD, NetBSD

1 bình luận

 
GN⁺ 2024-07-02
Ý kiến trên Hacker News
  • Trông thật sự rất hay. Bạn có thể chia sẻ thêm vì sao bạn tạo ra nó, các quyết định thiết kế, và bối cảnh hậu trường không?

    • Mình làm nó như một dự án phụ để học và theo sở thích. Năm 2021, khi đang làm việc nhiều với cụm K8s, mình biết đến ndots, và muốn tạo một DNS client dễ dùng, không gặp hành vi ngoài dự kiến do môi trường host
      Mình viết bằng Go, ngôn ngữ mình dùng chủ yếu, và vì không muốn thêm phụ thuộc bên ngoài nếu không thật sự cần thiết nên mình không dùng CLI framework. Mình đặc biệt thích phần tạo tiện ích nhỏ help.go để render văn bản trợ giúp có màu sắc và định dạng
      Theo thời gian, dự án cũng nhận được những đóng góp bên ngoài rất tốt, đặc biệt là @jedisct1 đã thêm hỗ trợ DNSCrypt, đây là đóng góp lớn. Bản phát hành v1.0 bị trì hoãn hơn một năm, do cuộc sống, các dự án khác và một chút trì hoãn; mãi tuần trước mình mới đặt hạn chót và thúc đẩy để hoàn tất
      Bài viết liên quan đến ndots: https://mrkaran.dev/posts/ndots-kubernetes/
  • Chọn tên rất hay. Chó con (doggo) thích đào đất (dig) mà

    • Hôm nay mới biết còn có dog nữa. Có lẽ đây cũng là lỗi gõ nhầm phổ biến của dig
  • Docker image cũng hay. Sẽ tốt hơn nếu tài liệu thêm tùy chọn --rm để dọn dẹp sau khi chạy và -t để có màu
    docker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MX

    • Hơi tò mò, có lý do gì để phải mất công đóng gói một tiện ích DNS CLI không có phụ thuộc thành Docker container không?
  • Có thể là câu hỏi hơi ngớ ngẩn, nhưng vì sao toàn bộ output lại xuất hiện hai lần?
    Khi chạy doggo google.com, cùng một bản ghi A được trả về lần lượt từ 127.0.2.2:53127.0.2.3:53; doggo news.ycombinator.com cũng tương tự, in ra kết quả từ hai nameserver

    • Có vẻ như nó in một lần cho mỗi nameserver đã cấu hình. Có lẽ vì dù hiếm, chúng thực sự có thể trả về các câu trả lời khác nhau
    • Mình thử trên máy chủ DNS AdGuard của mình thì chỉ có một mục. Có vẻ liên quan đến cấu hình nameserver
      Bạn có thể thử tái hiện bằng cách chỉ định nameserver tùy chỉnh như @1.1.1.1 không? doggo google.com --short chỉ trả về một giá trị 142.250.185.238
  • Sẽ thật tuyệt nếu công cụ này hỗ trợ loại truy vấn tương đương với ANY

  • Dự án hay đấy. Năm ngoái khi phát triển x-cmd pkg mình biết đến nó; lúc đó phiên bản mới nhất là 0.5.7, giờ đã là 1.0.2 nên có vẻ cần nâng cấp phiên bản
    Cũng có video demo: https://x-cmd.com/pkg/doggo

  • Làm mình nhớ đến https://github.com/ogham/dog

    • Theo README trên GitHub của doggo, nó hoàn toàn được truyền cảm hứng từ dog viết bằng Rust; tác giả không biết Rust nhưng muốn thêm tính năng, nên xem đây là cơ hội tốt để tự viết một DNS client từ đầu bằng Go
      Vì vậy tên cũng trở thành dog + go => doggo
    • Đáng tiếc là dog có vẻ không còn được bảo trì
  • Có lý do nào khiến nhiều công cụ kiểu này được viết bằng Go không? Không rõ là vì thư viện chuẩn, hay chỉ là ngẫu nhiên

    • Go về cơ bản tạo ra binary biên dịch tĩnh trong hầu hết trường hợp. Không runtime, không interpreter, không phụ thuộc
      Python, Java, JavaScript, C# v.v. thì khó nói điều tương tự
    • Cũng có thể là lý do văn hóa. Go xuất hiện nhiều trong mảng DevOps/hạ tầng đám mây
      Rất nhiều công cụ như k8s, Terraform và các provider của nó được viết bằng Go, và trong việc viết công cụ nội bộ thì nó khá cạnh tranh với Python về độ phổ biến
    • Trong trường hợp này, có vẻ tác giả dùng Go vì đã biết Go sẵn
      Theo README, dự án được truyền cảm hứng từ dog viết bằng Rust; tác giả không biết Rust nhưng muốn thêm tính năng, nên đã tự viết DNS client bằng Go. Vì vậy tên cũng là dog + go => doggo
      https://github.com/ogham/dog
    • Go giúp hoàn thành công việc, và kết quả sẽ còn bền lâu về sau
    • Dĩ nhiên là vì có thể đặt tên thành một trò chơi chữ
  • Cái này có liên quan đến Dog không? Tính năng trông gần như giống hệt
    Cả hai đều yêu cầu loại truy vấn cụ thể cần chạy (A, AAAA, v.v.), vậy vì sao không mặc định truy vấn mọi bản ghi? Ít nhất khi truy vấn một domain duy nhất thì có vẻ làm được
    https://github.com/mr-karan/doggo

    • Ở đây mọi bản ghi chính xác nghĩa là gì? dig mặc định chỉ hiển thị bản ghi A, và mình cũng giữ hành vi giống vậy
      Mình muốn biết bạn đang nói đến toàn bộ mọi loại bản ghi có thể có, hay một vài loại phổ biến như MX, AAAA, A, CNAME, TXT
  • Chúc mừng bản phát hành 1.0. doggo đã là công cụ DNS chính của mình một thời gian, và mình thật sự rất thích nó