2 คะแนน โดย GN⁺ 2024-07-02 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Doggo เป็นไคลเอนต์บรรทัดคำสั่งสำหรับการค้นหา DNS ที่แสดงผลลัพธ์ด้วย การแยกสีและรูปแบบตาราง โดยมุ่งเน้นเอาต์พุตที่มนุษย์อ่านได้ง่ายในเทอร์มินัล
  • ในสภาพแวดล้อมการทำงานอัตโนมัติสามารถใช้ เอาต์พุตแบบ JSON ได้ และยังนำไปใช้วิเคราะห์ปัญหาด้วยการวัดเวลาตอบสนองและโหมดดีบักได้
  • สามารถจัดการโปรโตคอลขนส่งหลายแบบได้ในเครื่องมือเดียว เช่น DNS over HTTPS, TLS, QUIC, TCP, UDP และ DNSCrypt
  • รองรับ ความสามารถของ EDNS เช่น EDNS Client Subnet, NSID, DNS Cookies, EDNS Padding, Extended DNS Errors รวมถึงการจัดการ glue record
  • ทำงานได้บน Linux, macOS, Windows, FreeBSD, NetBSD และยังมีเว็บอินเทอร์เฟซกับการเติมคำสั่งเชลล์ ทำให้ใช้งานได้ทั้งจาก CLI ในเครื่องและเบราว์เซอร์

การค้นหา DNS ที่อ่านง่ายในเทอร์มินัล

  • Doggo วางตัวเป็น ไคลเอนต์ DNS บนบรรทัดคำสั่งสำหรับมนุษย์
  • เอาต์พุตเริ่มต้นถูกจัดเป็นรูปแบบตารางพร้อมการแยกสี จึงเหมาะสำหรับกวาดดูการตอบกลับ DNS ได้อย่างรวดเร็ว
  • หากต้องการใช้กับสคริปต์หรือการพาร์สข้อมูล สามารถใช้ เอาต์พุตแบบ JSON ได้
  • มีทั้งโหมดดีบักและการวัดเวลาตอบสนอง ทำให้ตรวจสอบได้ไม่ใช่แค่ผลลัพธ์การค้นหา แต่รวมถึงกระบวนการทำงานด้วย

โปรโตคอล DNS และข้อมูลที่รองรับ

  • รองรับโปรโตคอลขนส่ง DNS หลายแบบ
    • DNS over HTTPS
    • DNS over TLS
    • DNS over QUIC
    • DNS over TCP
    • DNS over UDP
    • DNSCrypt
  • ครอบคลุมฟังก์ชันที่เกี่ยวข้องกับ EDNS อย่างกว้างขวาง
    • การตอบกลับแบบรับรู้ตำแหน่งผ่าน EDNS Client Subnet(ECS)
    • Name Server Identifier(NSID)
    • DNS Cookies
    • EDNS Padding
    • Extended DNS Errors(EDE)
  • สามารถจัดการ glue record ใน additional section และข้อมูล DNS เสริมได้
  • รองรับการแปลง punycode อัตโนมัติสำหรับ Internationalized Domain Names(IDN)
  • รองรับ Reverse DNS lookup และแฟลก DNS หลากหลาย เช่น AA, AD, CD, DO

การตั้งค่า รีโซลเวอร์ และสภาพแวดล้อมการทำงาน

  • สามารถใช้การตั้งค่า ndots และ search จาก resolv.conf หรืออาร์กิวเมนต์บรรทัดคำสั่งได้
  • สามารถระบุรีโซลเวอร์ได้หลายตัว และยังปรับแต่ง กลยุทธ์การคิวรี ได้
  • รองรับทั้ง IPv4 และ IPv6
  • มี เว็บอินเทอร์เฟซ ที่ doggo.mrkaran.dev
  • มี shell completion สำหรับ zsh และ fish
  • แพลตฟอร์มที่รองรับคือ Linux, macOS, Windows, FreeBSD, NetBSD

1 ความคิดเห็น

 
GN⁺ 2024-07-02
ความเห็นจาก Hacker News
  • ดูเจ๋งมาก ช่วยแชร์เพิ่มเติมได้ไหมว่าทำไมถึงสร้างขึ้นมา, การตัดสินใจด้านการออกแบบ, และบริบทเบื้องหลัง?

    • ทำขึ้นเป็นโปรเจกต์ข้างเคียงเพื่อเรียนรู้และทำเป็นงานอดิเรก ตอนปี 2021 ระหว่างที่ทำงานกับ คลัสเตอร์ K8s อยู่เยอะ ก็ได้รู้จัก ndots และอยากทำ DNS client ที่ใช้งานง่าย ซึ่งจะไม่เจอพฤติกรรมไม่คาดคิดเพราะสภาพแวดล้อมของโฮสต์
      ผมทำด้วย Go ซึ่งเป็นภาษาที่ใช้เป็นหลัก และเพราะไม่อยากเพิ่ม dependency ภายนอกถ้าไม่จำเป็นจริง ๆ เลยไม่ได้ใช้ CLI framework โดยเฉพาะส่วนที่ชอบคือการทำยูทิลิตีเล็ก ๆ help.go สำหรับเรนเดอร์ข้อความช่วยเหลือที่มีสีและการจัดรูปแบบ
      เวลาผ่านไปก็ได้รับ contribution จากภายนอกที่ดี ๆ และที่สำคัญมากคือ @jedisct1 เพิ่ม การรองรับ DNSCrypt ให้ ส่วนรีลีส v1.0 ถูกเลื่อนมาตลอดเกินหนึ่งปี เพราะชีวิต โปรเจกต์อื่น ๆ และการผัดวันประกันพรุ่งนิดหน่อยปนกันไป จนสัปดาห์ที่แล้วถึงได้กำหนดเดดไลน์แล้วดันให้จบ
      บทความเกี่ยวกับ ndots: https://mrkaran.dev/posts/ndots-kubernetes/
  • เลือกชื่อได้ยอดเยี่ยม เพราะน้องหมา(doggo) ชอบขุด(dig)

    • เพิ่งรู้วันนี้ว่ามี dog ด้วย น่าจะเป็นคำพิมพ์ผิดที่พบบ่อยของ dig เหมือนกัน
  • ดีที่มี Docker image ด้วย ถ้าเพิ่มตัวเลือก --rm สำหรับเก็บกวาดหลังรัน และ -t สำหรับสีในเอกสารก็น่าจะดี
    docker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MX

    • สงสัยว่า ทำไมต้องลำบากขนาดนั้นเพื่อทำ ยูทิลิตี DNS CLI ที่ไม่มี dependency ให้เป็น Docker container?
  • อาจเป็นคำถามโง่ ๆ หน่อย แต่ทำไม output ถึงออกมา ซ้ำสองครั้ง ทั้งหมด?
    พอรัน doggo google.com จะได้ A record เดียวกันจาก 127.0.2.2:53 และ 127.0.2.3:53 อย่างละชุด และ doggo news.ycombinator.com ก็แสดงผลจาก nameserver สองตัวเหมือนกัน

    • ดูเหมือนจะแสดงผล หนึ่งครั้งต่อ nameserver ที่ตั้งค่าไว้ จริง ๆ แล้วแม้จะพบไม่บ่อย แต่แต่ละตัวอาจให้คำตอบต่างกันได้ เลยน่าจะเป็นแบบนั้น
    • ลองกับ AdGuard DNS server ของผมแล้วมีรายการเดียว ดูเหมือนจะเกี่ยวกับการตั้งค่า nameserver
      ลองระบุ custom nameserver อย่าง @1.1.1.1 เพื่อทำซ้ำได้ไหม? doggo google.com --short คืนค่าแค่ 142.250.185.238 ตัวเดียว
  • ถ้าเครื่องมือนี้รองรับ ประเภท query ที่เทียบเท่า ANY ได้ก็คงดีมาก

  • โปรเจกต์เจ๋งมาก ผมรู้จักตอนพัฒนา x-cmd pkg เมื่อปีที่แล้ว ตอนนั้นเวอร์ชันล่าสุดคือ 0.5.7 แต่ตอนนี้เป็น 1.0.2 แล้ว ดูเหมือนต้องอัปเกรดเวอร์ชัน
    มีวิดีโอเดโมด้วย: https://x-cmd.com/pkg/doggo

  • นึกถึง https://github.com/ogham/dog

    • ตาม README ของ doggo บน GitHub บอกว่าได้รับแรงบันดาลใจอย่างเต็มที่จาก dog ที่เขียนด้วย Rust และเพราะไม่รู้ Rust แต่ก็อยากเพิ่มฟีเจอร์ เลยถือเป็นโอกาสดีที่จะเขียน DNS client ใหม่ตั้งแต่ต้นด้วย Go
      ดังนั้นชื่อจึงเป็น dog + go => doggo
    • น่าเสียดายที่ dog ดูเหมือนจะ ไม่ได้รับการดูแลต่อ แล้ว
  • มีเหตุผลไหมว่าทำไมเครื่องมือแบบนี้ถึงเขียนด้วย Go กันเยอะ? สงสัยว่าเป็นเพราะ standard library หรือแค่บังเอิญ

    • Go โดยพื้นฐานแล้วมักสร้าง ไบนารีแบบคอมไพล์สแตติก ได้ ไม่มี runtime, interpreter หรือ dependency
      Python, Java, JavaScript, C# ฯลฯ พูดแบบเดียวกันได้ยาก
    • อาจเป็นเหตุผลด้านวัฒนธรรมก็ได้ Go ปรากฏตัวเยอะในสาย DevOps/โครงสร้างพื้นฐานคลาวด์
      เครื่องมือจำนวนมากอย่าง k8s, Terraform และ provider ของมันเขียนด้วย Go และสำหรับการเขียนเครื่องมือภายใน ก็ถือว่านิยมพอ ๆ กับ Python
    • ในกรณีนี้ดูเหมือนผู้สร้างรู้อยู่แล้วว่าใช้ Go ได้ จึงใช้ Go
      ตาม README บอกว่าได้รับแรงบันดาลใจจาก dog ที่เขียนด้วย Rust และเพราะไม่รู้ Rust แต่ก็อยากเพิ่มฟีเจอร์ เลยได้ลองเขียน DNS client เองด้วย Go ดังนั้นชื่อจึงเป็น dog + go => doggo
      https://github.com/ogham/dog
    • Go ช่วยให้งานเสร็จ และผลลัพธ์ก็จะอยู่ต่อไปได้นาน
    • แน่นอน เพราะเอามาตั้งชื่อเป็น มุกเล่นคำ ได้
  • อันนี้เกี่ยวข้องกับ Dog ไหม? ฟีเจอร์ดูแทบจะเหมือนกัน
    ทั้งคู่ต้องระบุ query เฉพาะที่จะรัน (A, AAAA ฯลฯ) ทำไมไม่ตั้งค่าเริ่มต้นเป็นการ query ทุก record? อย่างน้อยตอน query โดเมนเดียวก็น่าจะทำได้
    https://github.com/mr-karan/doggo

    • ในที่นี้ ทุก record หมายถึงอะไรกันแน่? dig โดยค่าเริ่มต้นจะแสดงแค่ A record และผมก็รักษาพฤติกรรมให้เหมือนกัน
      สงสัยว่าหมายถึง record type ที่เป็นไปได้ทั้งหมดจริง ๆ หรือหมายถึงแค่บางตัวที่พบบ่อย เช่น MX, AAAA, A, CNAME, TXT
  • ยินดีกับรีลีส 1.0 ด้วย doggo เป็น เครื่องมือ DNS หลัก ของผมมาพักหนึ่งแล้ว และชอบมันมาก