6 คะแนน โดย GN⁺ 2024-01-08 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • dns.toys คือเซิร์ฟเวอร์ DNS ที่ใช้ DNS query เหมือนอินเทอร์เฟซคำสั่ง ช่วยให้รันยูทิลิตีเล็ก ๆ ในเทอร์มินัลได้ด้วยแค่ dig
  • สามารถจัดการงานที่ปกติต้องเปิดหน้าค้นหาแล้วค่อนข้างยุ่งยากได้ทันที เช่น เวลาโลก สภาพอากาศ การแปลงหน่วยกว่า 70 รายการ และการแปลงสกุลเงินตามอัตราแลกเปลี่ยนรายวัน
  • ยังมีฟังก์ชันที่จำเป็นสำหรับนักพัฒนา เช่น การคำนวณช่วง CIDR, การสร้าง UUID v4·NanoID, การแปลง Unix epoch และการแปลงฐานตัวเลข
  • วิธีเรียกใช้คือระบุ @dns.toys และใน Bash·Fish·Zsh สามารถเพิ่ม alias dy เพื่อใช้งานให้สั้นลงได้
  • เป็นบริการที่เน้นความสนุกและความสะดวกในการตรวจสอบ·คำนวณอย่างรวดเร็วในเทอร์มินัลมากกว่าจะเป็นเครื่องมือสำหรับงานจริงจัง เหมาะกับงานค้นหาข้อมูลง่าย ๆ

ยูทิลิตีในเทอร์มินัลที่รันผ่าน DNS query

  • dns.toys ให้บริการหลายฟังก์ชันผ่านเซิร์ฟเวอร์ DNS โดยส่ง query ในรูปแบบโดเมนด้วย dig เพื่อรันคำสั่ง
  • เวลา·สภาพอากาศ·การแปลง

    • dig mumbai.time @dns.toys: ดู เวลาปัจจุบัน ของเมือง
    • dig 2023-05-28T14:00-mumbai-paris/fr.time @dns.toys: แปลงเขตเวลา ระหว่างเมือง
    • dig mumbai.weather @dns.toys: ดูสภาพอากาศของเมือง
    • dig 42km-mi.unit @dns.toys: แปลงระหว่างหน่วยกว่า 70 รายการ
    • dig 100USD-INR.fx @dns.toys: แปลงสกุลเงินตามอัตราแลกเปลี่ยนรายวัน
    • dig -4 ip @dns.toys: ตรวจสอบที่อยู่ IPv4 หรือ IPv6
  • ฟังก์ชันสำหรับการคำนวณ·นักพัฒนา

    • dig 10.0.0.0/24.cidr @dns.toys: คำนวณ IP แรกและสุดท้ายที่ใช้งานได้ในซับเน็ต
    • dig 100dec-hex.base @dns.toys: แปลงฐานตัวเลข ระหว่าง hex, dec, oct, bin
    • dig 784783800.epoch @dns.toys: แปลง Unix timestamp เป็นวันที่ที่อ่านได้
    • dig 5.uuid @dns.toys: สร้าง UUID v4
    • dig 5.10.nanoid @dns.toys: สร้าง NanoID ตามความยาวและจำนวนที่กำหนด
  • ฟังก์ชันของเล่น

    • dig pi @dns.toys: แสดงตัวเลข Pi
    • dig 3d20/2.dice @dns.toys: ทอยลูกเต๋าตามจำนวนลูกและจำนวนหน้าที่กำหนด
    • dig 2.coin @dns.toys: โยนเหรียญ
    • dig 1-100.rand @dns.toys: สร้างเลขสุ่มในช่วงที่กำหนด
    • dig excuse @dns.toys: แสดงข้ออ้างแบบสุ่มของนักพัฒนา

shell alias สำหรับเรียกใช้ให้สั้นลง

  • เมื่อเพิ่มคำสั่งย่อ dy แล้ว จะเรียกใช้ได้สั้นลง เช่น dy mumbai.weather
    • Bash: เพิ่ม alias dy="dig +short @dns.toys" ลงใน ~/.bashrc
    • Fish: เพิ่ม alias dy="dig +noall +answer +additional $argv @dns.toys" ลงใน ~/.config/fish/config.fish
    • Zsh: เพิ่ม alias dy="dig +short @dns.toys" ลงใน ~/.zshrc
  • ผู้ใช้ที่ใช้เวลาในเทอร์มินัลเป็นส่วนใหญ่สามารถจัดการงานอย่าง การแปลงหน่วย หรือการตรวจสอบสภาพอากาศได้รวดเร็ว โดยไม่ต้องเปิดหน้าค้นหาที่หนักกว่า

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

 
GN⁺ 2024-01-08
ความคิดเห็นจาก Hacker News
  • นึกถึงทริกเล็ก ๆ ที่เคยใช้ตอนทำยูทิลิตี้ Dynamic DNS เอง เพื่อคำนวณที่อยู่ IP ของเครื่องตัวเองให้ “เสถียร”
    รีโซลเวอร์ของ OpenDNS (resolver1.opendns.com เป็นต้น) จะ resolve myip.opendns.com เป็นที่อยู่ IP จริงให้ ขึ้นอยู่กับสถานะการเชื่อมต่อว่าจะได้เรคคอร์ด A หรือ AAAA และ IP ของรีโซลเวอร์เหล่านี้มักเป็น anycast IP เลยอยากเชื่อว่าน่าจะเร็วกว่าเล็กน้อยเมื่อเทียบกับการเรียก HTTP service แบบศูนย์กลางที่อาจล่มได้ทุกเมื่อ
    แน่นอนว่า OpenDNS ก็อาจหายไปได้ทุกเมื่อเหมือนกัน แต่ผมมองว่าความเสี่ยงนั้นยังดีกว่าบริการ HTTP แนว “ที่อยู่ IP ของฉันคืออะไร?” จำนวนมาก เคยได้ยินมาด้วยว่าเดิมที DNS ถูกตั้งใจให้จัดการข้อมูลในขอบเขตที่กว้างกว่าชื่อโดเมน ซึ่งสิ่งอย่าง TXT record ก็เป็นร่องรอยของแนวคิดนั้น เว็บไซต์นี้แสดงให้เห็น ประโยชน์ที่ได้จาก DNS ได้ดี

    • Google และ Akamai ก็ให้บริการ DNS เช่นกัน
      dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
      dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
    • ระหว่าง OpenDNS กับ YouTube อะไรมีโอกาสล่มมากกว่ากัน
      curl -4si0A "" https://www.youtube.com|sed -n '/ip=/{s/.*ip=//;s/\.*//p;};'|uniq
      ระหว่าง OpenDNS กับ Cloudflare อะไรมีโอกาสล่มมากกว่ากัน วิธีด้านล่างใช้ได้กับที่อยู่ IP ใด ๆ ของ Cloudflare และไม่ต้องใช้ TLS ด้วย
      printf 'GET /cdn-cgi/trace HTTP/1.0\r\nHost: cloudflare.com |nc -vvn 104.18.25.13 80 |sed -n /ip=/p
      รายการ IP ของ Cloudflare รับได้ด้วย curl -4si0A "" https://api.cloudflare.com/client/v4/ips มีเว็บไซต์จำนวนมากที่แสดง IP ของไคลเอนต์ไว้บนหน้าเว็บหรือใน HTTP header และไม่จำเป็นต้องเป็นเว็บ “What is my IP” โดยเฉพาะ
      เว็บไซต์ที่บล็อกคำขอบางแบบด้วย Cloudflare ก็เป็นอีกทางเลือกได้ เช่น ส่ง HTTP request ไปยัง StackOverflow โดยไม่มี User-Agent header
      curl -si40A "" http://stackoverflow.com|sed -n '/cf-footer-ip">/{s/.*">//;s/<.*//p;}'
      ก็น่าทึ่งทีเดียวที่เว็บ “What is my IP” ประสบความสำเร็จ ทั้งที่ IP ของตัวเองปรากฏอยู่บนเว็บไซต์เป็นแสน ๆ แห่งอยู่แล้ว ส่วนเรื่องประโยชน์ของ DNS ดู https://www.netmeister.org/blog/dns-rrs.html ประกอบได้
    • เห็นด้วยที่ว่าบริการ HTTP ส่วนใหญ่สำหรับดึง IP ดูไม่น่าไว้ใจนักในแง่ uptime
      แต่ก็มี https://icanhazip.com/ ที่ Cloudflare ดูแลอยู่ และฝั่งนี้ดูมีโอกาสเสถียรกว่า
      https://ipv4.icanhazip.com/
      https://ipv6.icanhazip.com/
    • เป็นไอเดียที่ดีมาก ดูเรียบง่ายกว่า โปรโตคอล STUN มาก
  • เป็นแฟนตัวยงของ Julia Evans และเธอก็ทำของเล่นที่มีประโยชน์เกี่ยวกับ DNS ไว้หลายอย่าง
    https://jvns.ca/
    https://dns-lookup.jvns.ca/
    https://messwithdns.net/

  • บทความที่เกี่ยวข้อง
    DNS Toys - https://news.ycombinator.com/item?id=31704789 - มิถุนายน 2022, ความคิดเห็น 104 รายการ
    DNS Toys: Useful utilities and services over DNS - https://news.ycombinator.com/item?id=31637226 - มิถุนายน 2022, ความคิดเห็น 1 รายการ

  • เป็นงานนำเสนอเมื่อไม่นานมานี้ของผู้เขียนโปรเจกต์นี้ มี เบื้องหลังสนุก ๆ ว่าโปรเจกต์เกิดขึ้นมาได้อย่างไร
    https://youtu.be/ANmFZ8rbmnc?si=ndEWH4xY2oxJuEnB

  • แปลกที่
    dig A0.0,0.0/0.0,90.0.aerial @dns.toys
    และ
    dig A0.0,0.0/90.0,0.0.aerial @dns.toys
    ทั้งคู่คืนค่า TXT "aerial distance = 10007.06 KM"
    เส้นรอบวงตามเส้นศูนย์สูตรคือ 40,075.017 กม. และเส้นรอบวงผ่านขั้วโลกคือ 40,007.863 กม. ต่อให้สมมติว่าโลกเป็น ทรงวัว ในจินตนาการก็คงไม่เสียหายมาก และช่วยเลี่ยงอนุกรมชวนปวดหัวสำหรับหาค่าระยะทางสั้นที่สุดระหว่างสองจุดบนผิวทรงรีได้

    • น่าสนใจนะ ค่ารอบวงสองค่านั้นจริง ๆ แล้วใกล้กันมากกว่าที่ผมคิดไว้เยอะ
  • เกี่ยวข้องกันเล็กน้อย มีบริการที่ให้รายชื่อผู้ประกอบการในสหราชอาณาจักรผ่านการ lookup ด้วย DNS ด้วย เป็นแนวคิดเดียวกันคือให้บริการ ข้อมูลที่ไม่ใช่ DNS ผ่านบริการ DNS
    https://www.num.uk/
    แต่ดูจาก roadmap แล้วก็เหมือนว่าอาจไม่ได้ดูแลบริการนี้ต่อแล้ว

    • คำว่า “ใช้ผิดวัตถุประสงค์” ควรหลีกเลี่ยง เว้นแต่จะหมายถึงทำนองว่า “SOAP และ XHR เป็นการ ‘ใช้ผิดวัตถุประสงค์’ ของ HTTP”
      คลาส IN(internet) ตอนนี้อาจดูเหมือนต้นซีดาร์ที่ยืนโดดเด่นขึ้นมาจากวิวัฒนาการ แต่ในยุคแคมเบรียนก็เคยมีคลาส CH(chaos) และ HS(hesiod) อยู่ด้วย ควรกลับไปดูวัตถุประสงค์และเป้าหมายของโปรเจกต์เหล่านั้นอีกครั้ง
      การใช้ผิดวัตถุประสงค์ในปัจจุบันกลับใกล้เคียงกับการปรับให้เหมาะกับเว็บเซอร์วิสบนคลาวด์ หรือ “happy eyeballs” เท่านั้น โดยยอมเสียอย่างอื่นทั้งหมด เช่น หน้าต่าง 10 มิลลิวินาทีสำหรับการส่งซ้ำ หรือ qname minimization ดูเหมือนว่าเรื่องอย่าง bufferbloat ก็ไม่ได้ตระหนักกันดีนัก ยังมีโลกอีกใบที่ต่างไปโดยสิ้นเชิงอยู่นอกเหนือจากการ resolve A/AAAA
      ในโถงทางเดินของงานประชุมอินเทอร์เน็ต การเห็นคนสองคนที่เสียบ pocket protector ไว้ประลองดาบกัน หรืออย่างน้อยก็เอาดินสอจิ้มกัน ไม่ใช่เรื่องหายาก RFC คือ “Request For Comments” และ BCP(Best Current Practice) ก็ถูกละเลยเป็นประจำ
  • ชอบนะ แต่ก็อยากให้ dig ติดตั้งอยู่ในทุกแพลตฟอร์ม
    ใช้บน Windows ไม่ได้เลยน่าหงุดหงิดเสมอ และลองเช็กดูแล้ว Debian ก็ไม่ได้มีมาให้โดยค่าเริ่มต้นเหมือนกัน แน่นอนว่าติดตั้งได้ง่าย ส่วน OpenBSD กับ Mac OS X มีมาให้ อันนั้นก็ดี

    • Dog เป็นแบบ ข้ามแพลตฟอร์ม และมีฟีเจอร์ดี ๆ อย่างเอาต์พุต JSON ด้วย
      https://dns.lookup.dog/
    • ไม่จำเป็นต้องใช้ dig เสมอไป nslookup หรือ host ก็ทำงานได้
      บน Windows ก็น่าจะมีเครื่องมือ lookup DNS อะไรสักอย่างอยู่แล้ว
  • ช่วยอธิบายให้คนโง่ในเธรดนี้เหมือนอธิบายให้เด็กห้าขวบฟังได้ไหม รู้ว่ามันทำเพื่อความสนุก แต่ไม่เข้าใจเลย ไม่รู้ด้วยว่ามันทำงานอย่างไร และรู้ว่าเป็นเพราะผมไม่รู้อะไรเอง

    • โดยแก่นแล้วคือการ resolve โดเมนที่ไม่มีอยู่จริงผ่าน เซิร์ฟเวอร์ DNS แบบกำหนดเอง
      ตัวอย่างเช่น dig 100USD-INR.fx @dns.toys หมายถึง “ให้ใช้ dns.toys เป็นเซิร์ฟเวอร์ DNS เพื่อ resolve 100USD-INR.fx” แล้วมันจะคืน TXT record ที่มีคำตอบจริงกลับมา
      .fx เป็นโดเมนที่ไม่มีอยู่จริง จึงไม่ได้แอบอ้างเป็นใคร และถ้าเปลี่ยน @dns.toys เป็นอย่าง @8.8.8.8 ก็จะ resolve อะไรไม่ได้
    • ให้นึกถึงเว็บอย่าง news.ycombinator.com เบราว์เซอร์จะใช้ชื่อนั้นไปค้นหา IP จากเซิร์ฟเวอร์พิเศษ ในโดเมนนั้นอาจเก็บไว้ประมาณนี้
      A IP = ...1
      AAAA IP = ...2
      ตรงนี้ A คือชนิดของ record แต่ก็มี record ชนิดอื่นด้วย
      TXT gender = 'male'
      มีสมมติฐานบางอย่างที่คนมักถือว่าเป็นจริงโดยนัยเกี่ยวกับ DNS คือผู้คนใช้ DNS เหมือนตู้สลับสายไปยังบริการอื่น ๆ และค่าภายในตู้สลับสายนั้นโดยมากเป็นแบบคงที่
      แต่ตรงนี้กำลังทำสิ่งที่ต่างออกไปโดยสิ้นเชิง เพราะคืนค่าที่เปลี่ยนไปตามโดเมน หากจะทำแบบนี้ต้องมี เซิร์ฟเวอร์ DNS ที่ทำเอง แต่ตัวโปรโตคอล DNS เองค่อนข้างเรียบง่าย
      เหตุผลที่แฮ็กนี้ฉลาดคือ DNS เป็นหนึ่งในโปรโตคอลที่ใช้กันแพร่หลายและรองรับกันมากที่สุด ไลบรารีโปรแกรมมิงสายหลักทั้งหมดรองรับ และยังมีเครื่องมือ command line จำนวนมากที่มีอยู่ในระบบปฏิบัติการอยู่แล้ว หากให้บริการบน DNS ก็เข้าถึงได้จากเครื่องมือและไลบรารีด้วย dependency ขั้นต่ำ
      นอกจากนี้ยังทำให้ DNS ถูกใช้โดยตรงเป็น บริการแอปพลิเคชัน ไม่ใช่ตู้สลับสายของบริการอินเทอร์เน็ตทั่วไป จึงพลิกสมมติฐานทั่วไปเกี่ยวกับวิธีที่ควรใช้ระบบ DNS เวลาเอาไปเชื่อมกับซอฟต์แวร์เดิมก็ไม่ต้อง integration ซับซ้อน และอาจมองได้ว่า request ของ DNS ตรงไปตรงมากว่าเว็บ API ทั่วไป มีความเป็นไปได้ว่าจะมีข้อดีด้านการต้านทานการเซ็นเซอร์ด้วย
    • คิดว่าเซิร์ฟเวอร์ DNS เป็นเว็บเซิร์ฟเวอร์พิเศษที่ใช้พอร์ตและโปรโตคอลต่างออกไปก็ได้
      เหมือนที่ส่ง request ไปยังเว็บเซิร์ฟเวอร์ด้วย HTTP เราก็โต้ตอบกับเซิร์ฟเวอร์ DNS ด้วยโปรโตคอล DNS คล้ายกับการใช้ telnet เลียนแบบ request ของ HTTP หรือ SMTP คือสื่อสารกับเซิร์ฟเวอร์บางชนิดตามชุดกฎเฉพาะ
      เซิร์ฟเวอร์นี้ทำการคำนวณบางอย่างก่อนให้ผลลัพธ์ ซึ่งเป็นจุดที่ต่างจาก DNS record ส่วนใหญ่ที่ปกติเราคาดว่าจะเป็นข้อมูลคงที่
    • โปรโตคอล DNS เป็นเพียงข้อความบน UDP เวลาสร้าง request DNS ระบบจะเปิด socket แล้วเขียน google.com ลงไป จากนั้นอ่าน response
      ถ้าเซิร์ฟเวอร์ถูกตั้งค่าเป็นเซิร์ฟเวอร์ DNS อย่างถูกต้อง มันจะตอบกลับเป็น DNS record ที่เหมาะสมในรูปข้อความ google.com เป็น CNAME ที่ชี้ไปยังซับโดเมนบางตัวที่ใช้ทำ load balancing ดังนั้นเซิร์ฟเวอร์จะตอบประมาณ CNAME blabla.google.com และถ้าต้องการก็อาจ resolve blabla.google.com ให้ด้วย เพื่อประหยัดการส่ง request เพิ่ม
      โปรโตคอล DNS ที่กำหนดใน RFC บางฉบับระบุว่าต้องทำ request และ response ในรูปแบบเฉพาะ หนึ่งในนั้นคือสำหรับโดเมนระดับบนสุดที่ไม่มีอยู่จริง เช่น .time ซึ่งปัจจุบันไม่มีอยู่ เซิร์ฟเวอร์ต้องตอบ nxdomain แต่ในทางปฏิบัติไม่มีอุปกรณ์ทางเทคนิคใดขวางไม่ให้เซิร์ฟเวอร์ตอบค่าอะไรก็ได้ เช่น เวลาปัจจุบัน
      โดยทั่วไป สิ่งเดียวที่ปกป้องผู้ใช้ไว้คือความคาดหวังว่าผู้ให้บริการ DNS ไม่ว่าจะสาธารณะหรือส่วนตัว จะไม่คืนข้อมูลมั่ว ๆ แม้ HTTPS จะช่วยบรรเทาได้ระดับหนึ่ง แต่ DNS record เองแทบจะ ปลอมแปลงได้ไม่จำกัด และไม่มีวิธีย้อนกลับ
  • แปลกใจที่ฟีเจอร์เหล่านี้ไม่ได้ให้บริการผ่านซับโดเมนใด ๆ ของ dns.toys ถ้าเป็นแบบนั้นก็จะ resolve ได้โดยไม่ต้องใช้ nameserver พิเศษ

    • ถ้าใช้ nameserver เริ่มต้น ความ ซับซ้อนของ DNS ทั่วไปอย่าง caching ก็จะเข้ามาเกี่ยวข้องทั้งหมด
  • ช่วงนี้ใช้สิ่งนี้เป็นหลัก
    https://addr.tools/
    https://dnscheck.tools/
    https://myip.addr.tools/help