Doggo - ไคลเอนต์ DNS บนบรรทัดคำสั่งที่เป็นมิตรกับผู้ใช้
(doggo.mrkaran.dev)- 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 ความคิดเห็น
ความเห็นจาก Hacker News
ดูเจ๋งมาก ช่วยแชร์เพิ่มเติมได้ไหมว่าทำไมถึงสร้างขึ้นมา, การตัดสินใจด้านการออกแบบ, และบริบทเบื้องหลัง?
ndotsและอยากทำ DNS client ที่ใช้งานง่าย ซึ่งจะไม่เจอพฤติกรรมไม่คาดคิดเพราะสภาพแวดล้อมของโฮสต์ผมทำด้วย Go ซึ่งเป็นภาษาที่ใช้เป็นหลัก และเพราะไม่อยากเพิ่ม dependency ภายนอกถ้าไม่จำเป็นจริง ๆ เลยไม่ได้ใช้ CLI framework โดยเฉพาะส่วนที่ชอบคือการทำยูทิลิตีเล็ก ๆ help.go สำหรับเรนเดอร์ข้อความช่วยเหลือที่มีสีและการจัดรูปแบบ
เวลาผ่านไปก็ได้รับ contribution จากภายนอกที่ดี ๆ และที่สำคัญมากคือ @jedisct1 เพิ่ม การรองรับ DNSCrypt ให้ ส่วนรีลีส v1.0 ถูกเลื่อนมาตลอดเกินหนึ่งปี เพราะชีวิต โปรเจกต์อื่น ๆ และการผัดวันประกันพรุ่งนิดหน่อยปนกันไป จนสัปดาห์ที่แล้วถึงได้กำหนดเดดไลน์แล้วดันให้จบ
บทความเกี่ยวกับ
ndots: https://mrkaran.dev/posts/ndots-kubernetes/เลือกชื่อได้ยอดเยี่ยม เพราะน้องหมา(doggo) ชอบขุด(dig)
digเหมือนกันดีที่มี Docker image ด้วย ถ้าเพิ่มตัวเลือก
--rmสำหรับเก็บกวาดหลังรัน และ-tสำหรับสีในเอกสารก็น่าจะดีdocker run --rm -it ghcr.io/mr-karan/doggo:latest mrkaran.dev MXอาจเป็นคำถามโง่ ๆ หน่อย แต่ทำไม output ถึงออกมา ซ้ำสองครั้ง ทั้งหมด?
พอรัน
doggo google.comจะได้ A record เดียวกันจาก127.0.2.2:53และ127.0.2.3:53อย่างละชุด และdoggo news.ycombinator.comก็แสดงผลจาก 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
dogที่เขียนด้วย Rust และเพราะไม่รู้ Rust แต่ก็อยากเพิ่มฟีเจอร์ เลยถือเป็นโอกาสดีที่จะเขียน DNS client ใหม่ตั้งแต่ต้นด้วย Goดังนั้นชื่อจึงเป็น
dog + go => doggodogดูเหมือนจะ ไม่ได้รับการดูแลต่อ แล้วมีเหตุผลไหมว่าทำไมเครื่องมือแบบนี้ถึงเขียนด้วย Go กันเยอะ? สงสัยว่าเป็นเพราะ standard library หรือแค่บังเอิญ
Python, Java, JavaScript, C# ฯลฯ พูดแบบเดียวกันได้ยาก
เครื่องมือจำนวนมากอย่าง k8s, Terraform และ provider ของมันเขียนด้วย Go และสำหรับการเขียนเครื่องมือภายใน ก็ถือว่านิยมพอ ๆ กับ Python
ตาม README บอกว่าได้รับแรงบันดาลใจจาก
dogที่เขียนด้วย Rust และเพราะไม่รู้ Rust แต่ก็อยากเพิ่มฟีเจอร์ เลยได้ลองเขียน DNS client เองด้วย Go ดังนั้นชื่อจึงเป็นdog + go => doggohttps://github.com/ogham/dog
อันนี้เกี่ยวข้องกับ Dog ไหม? ฟีเจอร์ดูแทบจะเหมือนกัน
ทั้งคู่ต้องระบุ query เฉพาะที่จะรัน (A, AAAA ฯลฯ) ทำไมไม่ตั้งค่าเริ่มต้นเป็นการ query ทุก record? อย่างน้อยตอน query โดเมนเดียวก็น่าจะทำได้
https://github.com/mr-karan/doggo
digโดยค่าเริ่มต้นจะแสดงแค่ A record และผมก็รักษาพฤติกรรมให้เหมือนกันสงสัยว่าหมายถึง record type ที่เป็นไปได้ทั้งหมดจริง ๆ หรือหมายถึงแค่บางตัวที่พบบ่อย เช่น
MX, AAAA, A, CNAME, TXTยินดีกับรีลีส 1.0 ด้วย doggo เป็น เครื่องมือ DNS หลัก ของผมมาพักหนึ่งแล้ว และชอบมันมาก