หน้าแรก / บทความ / พื้นฐานเว็บ

DNS คืออะไร? ดูชื่อเว็บกลายเป็น IP ด้วยตาตัวเองผ่าน nslookup

เข้าใจ DNS แบบเห็นภาพ ตั้งแต่ Resolver, Root, TLD จนถึง TTL แล้วลองถามหา IP เอง ด้วยคำสั่งที่มีในเครื่องอยู่แล้ว ไม่ต้องติดตั้งอะไรเพิ่ม

ทุกครั้งที่เราพิมพ์ github.com หรือ devkub.net ลงในเบราว์เซอร์ จะมีงานเล็กๆ งานหนึ่งเกิดขึ้นก่อนที่หน้าเว็บจะโหลดเสมอ คือการถามว่า "ชื่อนี้อยู่ที่ไหน" งานนี้เป็นหน้าที่ของ DNS มันทำงานเงียบจนเราแทบไม่รู้ตัว แต่วันไหนที่มันมีปัญหา เว็บทั้งเว็บก็เปิดไม่ขึ้นเลย

บทความนี้จะพาไปเข้าใจ DNS แบบเห็นภาพ แล้วลงมือดูด้วยตาตัวเองว่าชื่อเว็บกลายเป็นตัวเลขได้ยังไง ใช้แค่คำสั่งที่ติดมากับเครื่องอยู่แล้ว ทั้ง Windows, Mac และ Linux ไม่ต้องติดตั้งอะไรเพิ่มครับ

จบบทความนี้คุณจะ:

  • อธิบายได้ว่า Resolver, Root, TLD และ Authoritative ต่างกันยังไง
  • ใช้ nslookup ถามหา IP ของเว็บไหนก็ได้ และอ่านผลลัพธ์ออก
  • รู้จักระเบียน DNS ที่เจอบ่อย (A, AAAA, CNAME, MX, TXT)
  • ไล่เช็กได้ว่าเว็บที่เปิดไม่ขึ้น เป็นเพราะ DNS หรือเปล่า

ถ้าอยากเห็นภาพรวมก่อน ดูคลิปสั้นนี้ได้เลย ยาวแค่ 1 นาทีครับ

ดูคลิปนี้บน YouTube

DNS คือสมุดโทรศัพท์ของอินเทอร์เน็ต

ลองนึกถึงรายชื่อในมือถือของเรา เวลาจะโทรหาแม่ เราไม่ได้จำเบอร์ 10 หลัก แค่กดที่ชื่อ "แม่" แล้วมือถือก็หาเบอร์ให้เอง

อินเทอร์เน็ตก็ทำแบบเดียวกัน คอมพิวเตอร์คุยกันด้วยตัวเลขที่เรียกว่า IP Address แต่คนจำตัวเลขแบบนี้ไม่ไหว เราจึงตั้งชื่อให้จำง่ายอย่าง devkub.net แล้วให้ DNS (Domain Name System) เป็นคนแปลชื่อกลับเป็นตัวเลขให้

ฝั่งใช้อะไรเทียบกับมือถือ
คนชื่อเว็บ devkub.netชื่อ "แม่" ในรายชื่อ
เครื่องIP เช่น 192.0.2.172เบอร์โทร 10 หลัก
คนแปลDNSแอปรายชื่อที่หาเบอร์ให้

เรื่องตัวเลขในบทความนี้ IP ที่ขึ้นต้นด้วย 192.0.2. ในบทความเป็นเลขสมมติจากช่วงที่สงวนไว้ใช้ในเอกสารโดยเฉพาะ ไม่ใช่ IP ของเว็บจริง เวลาลองเอง ตัวเลขที่คุณได้จะไม่เหมือนในบทความ และไม่จำเป็นต้องเหมือนของเพื่อนด้วย

ศัพท์ 6 คำที่ต้องรู้

ระบบ DNS มีผู้เล่นหลายตัว ลองนึกภาพว่าเราไปติดต่อหน่วยงานใหญ่แห่งหนึ่ง แต่ไม่รู้ว่าต้องไปห้องไหน

คำเทียบกับหน้าที่
IP Addressที่อยู่จริงของบ้านตัวเลขที่คอมใช้หากัน
Resolverพนักงานต้อนรับรับคำถามจากเรา แล้ววิ่งถามต่อจนได้คำตอบ ส่วนใหญ่เป็นของผู้ให้บริการเน็ต
Rootป้ายบอกทางหน้าตึกไม่รู้คำตอบเอง แต่รู้ว่า .com หรือ .net ต้องไปถามใคร
TLDเคาน์เตอร์ของแต่ละแผนกดูแลนามสกุลโดเมน เช่น .com .net .th และรู้ว่าโดเมนไหนใครเป็นเจ้าของคำตอบ
Authoritativeเจ้าของเรื่องตัวจริงเก็บข้อมูลของโดเมนนั้นไว้ และตอบ IP ได้
TTLวันหมดอายุบนโน้ตบอกว่าคำตอบนี้จำไว้ได้นานกี่วินาที ก่อนต้องไปถามใหม่

ไม่ต้องท่องให้ครบตอนนี้ครับ เดี๋ยวเราจะเห็นแต่ละตัวโผล่มาในผลลัพธ์ของคำสั่งจริง

เดินทางทีละขั้น จากชื่อเว็บถึง IP

เวลาเราพิมพ์ devkub.net ครั้งแรก การค้นหาจะเดินทางประมาณนี้

เส้นทางการถามหา IP 5 ขั้น จากเครื่องเราไปยัง Resolver, Root, TLD และ Authoritative
Resolver วิ่งถามต่อแทนเรา เราถามแค่ครั้งเดียว
  1. เครื่องเรา → Resolver เครื่องเราถามพนักงานต้อนรับว่า devkub.net อยู่ที่ไหน
  2. Resolver → Root Root ไม่รู้คำตอบ แต่บอกได้ว่าโดเมน .net ต้องไปถามเครื่องไหน
  3. Resolver → TLD เคาน์เตอร์ .net บอกต่อว่าเจ้าของคำตอบของ devkub.net คือเครื่องไหน
  4. Resolver → Authoritative เจ้าของตัวจริงตอบกลับมาว่า IP คืออะไร
  5. Resolver → เครื่องเรา ได้ IP แล้ว เบราว์เซอร์ก็ไปเปิดเว็บที่ตัวเลขนั้น

ทั้งหมดนี้เกิดขึ้นในเสี้ยววินาที ที่เร็วขนาดนั้นได้เพราะทุกจุดมี ความจำ (cache) ของตัวเอง ทั้งเบราว์เซอร์ ระบบปฏิบัติการ และ Resolver ถ้าเพิ่งมีคนถามชื่อเดียวกันไปเมื่อกี้ Resolver ก็ตอบจากความจำได้ทันที ไม่ต้องวิ่งไปถาม Root ใหม่ทุกครั้ง

ทำไมต้องมีหลายชั้น ถ้าทั้งโลกมีเครื่องเดียวที่เก็บทุกชื่อ เครื่องนั้นจะรับคำถามไม่ไหว และถ้ามันล่ม อินเทอร์เน็ตก็ล่มทั้งหมด การแบ่งเป็น Root → TLD → Authoritative ทำให้แต่ละที่ดูแลแค่ส่วนของตัวเอง เจ้าของโดเมนก็แก้ข้อมูลของตัวเองได้โดยไม่ต้องขอใคร

ถามหา IP ครั้งแรกด้วย nslookup

nslookup คือคำสั่งสำหรับถาม DNS ตรงๆ มีในเครื่องอยู่แล้วทั้ง 3 ระบบ

เปิด Terminal ก่อน

  • Windows: กดปุ่ม Start พิมพ์ PowerShell แล้วกด Enter (ใช้ Command Prompt ก็ได้)
  • Mac: กด Cmd+Space พิมพ์ Terminal แล้วกด Enter
  • Linux: ส่วนใหญ่กด Ctrl+Alt+T

จากนั้นพิมพ์คำสั่งนี้แล้วกด Enter

Terminal
nslookup github.com
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
Server:         192.168.1.1
Address:        192.168.1.1#53
 
Non-authoritative answer:
Name:   github.com
Address: 192.0.2.10

มาอ่านทีละบรรทัดกันครับ

  • Server และ Address สองบรรทัดแรก คือ Resolver ที่เครื่องเราถามอยู่ ถ้าเป็นเน็ตบ้าน มักเป็น IP ของเราเตอร์ เช่น 192.168.1.1 ส่วน #53 คือพอร์ตมาตรฐานของ DNS (บน Windows จะไม่มี #53 และบรรทัด Server อาจขึ้นว่า UnKnown ไม่ต้องตกใจ)
  • Non-authoritative answer แปลว่าคำตอบนี้มาจาก Resolver ที่ถามต่อหรือจำไว้ให้ ไม่ได้มาจากเจ้าของคำตอบตัวจริงโดยตรง ตรงกับขั้นที่ 1 และ 5 ในภาพด้านบน
  • Name และ Address ล่างสุด คือชื่อที่เราถาม และ IP ที่ได้กลับมา

เช็กว่าได้แล้ว: มีบรรทัด Address อยู่ใต้ Name: github.com อย่างน้อยหนึ่งบรรทัด

ลองเปลี่ยน github.com เป็นเว็บที่ชอบดูครับ บางเว็บจะได้ IP กลับมาหลายตัว เพราะเว็บใหญ่มีเซิร์ฟเวอร์หลายเครื่องกระจายอยู่หลายที่ DNS จึงตอบหลายตัวเพื่อแบ่งคนเข้า ไม่ให้กองอยู่ที่เครื่องเดียว

เปลี่ยนคนตอบ ลองถาม 1.1.1.1 และ 8.8.8.8

Resolver ไม่ได้มีแค่ของผู้ให้บริการเน็ต ยังมี Resolver สาธารณะที่ใครก็ใช้ได้ฟรี ที่ดังที่สุดคือของ Cloudflare (1.1.1.1) และของ Google (8.8.8.8) เราสั่ง nslookup ให้ไปถามตัวไหนก็ได้ ด้วยการใส่ IP ของมันต่อท้าย

Terminal
nslookup github.com 1.1.1.1
nslookup github.com 8.8.8.8
ผลลัพธ์ที่ควรเห็น (ประมาณนี้)
Server:         1.1.1.1
Address:        1.1.1.1#53
 
Non-authoritative answer:
Name:   github.com
Address: 192.0.2.10

เช็กว่าได้แล้ว: บรรทัด Server เปลี่ยนเป็นตัวที่เราเลือก แปลว่าเราเปลี่ยน "พนักงานต้อนรับ" ได้เอง

ทริกนี้มีประโยชน์มากเวลาแก้ปัญหา ถ้า Resolver ของเน็ตบ้านตอบไม่ได้ แต่ 1.1.1.1 ตอบได้ ก็รู้ทันทีว่าปัญหาอยู่ที่ Resolver เดิม ไม่ใช่ที่ตัวเว็บ

คำตอบไม่เหมือนกันก็ไม่ผิด Resolver แต่ละตัวอาจได้ IP ไม่เหมือนกัน เพราะเว็บใหญ่มักเลือกตอบเซิร์ฟเวอร์ที่อยู่ใกล้ Resolver ตัวนั้นที่สุด ขอแค่ทุกตัวตอบกลับมาได้ ก็ถือว่า DNS ทำงานปกติ

ดูสิ่งที่เครื่องจำไว้ และล้างความจำ

อย่างที่บอกไปว่าเครื่องเราจำคำตอบไว้ด้วย บน Windows เราเปิดดูความจำนี้ได้ตรงๆ

PowerShell (Windows)
ipconfig /displaydns
ผลลัพธ์ที่ควรเห็น (ตัดมาบางส่วน)
    github.com
    ----------------------------------------
    Record Name . . . . . : github.com
    Record Type . . . . . : 1
    Time To Live  . . . . : 42
    Data Length . . . . . : 4
    Section . . . . . . . : Answer
    A (Host) Record . . . : 192.0.2.10

บรรทัด Time To Live คือ TTL หน่วยเป็นวินาที ตัวเลขจะลดลงเรื่อยๆ ถ้าสั่งซ้ำ พอถึง 0 เครื่องจะลืมคำตอบนี้ แล้วไปถาม Resolver ใหม่ ส่วน Record Type: 1 คือระเบียนแบบ A ซึ่งเดี๋ยวจะได้รู้จักในหัวข้อถัดไป

บางครั้งเราอยากให้เครื่องลืมทุกอย่างทันที เช่น เว็บเพิ่งย้ายเซิร์ฟเวอร์ แต่เครื่องเรายังวิ่งไปที่เดิม ให้ล้างความจำด้วยคำสั่งตามระบบที่ใช้

PowerShell (Windows)
ipconfig /flushdns
Terminal (Mac)
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Terminal (Linux ที่ใช้ systemd-resolved เช่น Ubuntu)
resolvectl flush-caches

Mac และ Linux ไม่มีคำสั่งเปิดดูความจำแบบ ipconfig /displaydns ส่วนคำสั่งล้างความจำก็ต่างกันไปตามรุ่นของระบบ ถ้าคำสั่งข้างบนใช้ไม่ได้ ให้ค้นด้วยชื่อรุ่นที่ใช้ เช่น "flush DNS macOS" ตามด้วยชื่อรุ่นครับ

ระเบียน DNS ที่เจอบ่อย

สมุดของ DNS ไม่ได้เก็บแค่ IP ข้อมูลแต่ละบรรทัดเรียกว่า ระเบียน (record) และมีหลายประเภท

ประเภทใช้ทำอะไรตัวอย่าง
Aชื่อ → IPv4devkub.net → 192.0.2.172
AAAAชื่อ → IPv6 (IP รุ่นใหม่ ตัวยาวกว่า)devkub.net → 2001:db8::1
CNAMEชื่อเล่น ให้ไปใช้คำตอบของอีกชื่อwww.devkub.net → devkub.net
MXอีเมลของโดเมนนี้ส่งไปเครื่องไหนgmail.com → เซิร์ฟเวอร์อีเมลของ Google
TXTข้อความ ใช้ยืนยันความเป็นเจ้าของโดเมนรหัสยืนยันจาก Google หรือ GitHub

เราสั่งให้ nslookup ถามเฉพาะประเภทที่ต้องการได้ด้วย -type=

Terminal
nslookup -type=AAAA github.com
nslookup -type=MX gmail.com
nslookup -type=TXT github.com

เช็กว่าได้แล้ว: คำสั่ง MX จะได้รายชื่อเซิร์ฟเวอร์อีเมลพร้อมตัวเลขลำดับความสำคัญ เช่น mail exchanger = 5 gmail-smtp-in.l.google.com ส่วนคำสั่ง AAAA ถ้าเว็บนั้นไม่มี IPv6 จะไม่มีบรรทัด Address กลับมา ไม่ได้แปลว่าคำสั่งพัง

เจอตอนไหนในชีวิตจริง วันที่คุณซื้อโดเมนแล้วจะต่อกับโฮสต์หรืออีเมล หน้าตั้งค่า DNS จะให้เลือกประเภทพวกนี้แหละครับ เช่น เว็บโฮสต์บอกให้เพิ่ม A record ชี้ไปที่ IP ของเขา หรือ GitHub Pages ให้เพิ่ม CNAME ชี้ไปที่ ชื่อผู้ใช้.github.io

แถม ดูการเดินทางครบทุกขั้นด้วย dig

ผลของ nslookup เป็นคำตอบสุดท้ายจาก Resolver เราจึงไม่เห็นขั้น Root, TLD และ Authoritative ระหว่างทาง ถ้าใช้ Mac หรือ Linux จะมีอีกคำสั่งชื่อ dig ที่สั่งให้เดินตามทีละขั้นด้วยตัวเองได้

Terminal (Mac / Linux)
dig +trace github.com

ผลลัพธ์จะยาวหน่อย ให้มองหา 4 ช่วงนี้จากบนลงล่าง

  1. รายชื่อเครื่อง a.root-servers.net, b.root-servers.net ไปจนถึง m.root-servers.net คือ Root
  2. รายชื่อเครื่องที่ดูแล com. เช่น a.gtld-servers.net คือ TLD
  3. รายชื่อเครื่องที่ดูแล github.com. คือ Authoritative
  4. บรรทัดท้ายๆ ที่มีคำว่า A ตามด้วย IP คือคำตอบ

ตรงกับภาพ 5 ขั้นด้านบนทุกอย่าง ต่างกันแค่ครั้งนี้ dig ทำหน้าที่ Resolver ให้เราดูกับตา ส่วน Windows ไม่มี dig ติดมาให้ ข้ามหัวข้อนี้ไปได้เลยครับ

เว็บไม่ขึ้น เป็นที่ DNS หรือเปล่า

เวลาเปิดเว็บไม่ขึ้น ให้เริ่มจาก nslookup ชื่อเว็บ ก่อนเสมอ แล้วดูว่าเจออาการไหน

อาการแปลว่าลองทำ
ขึ้น Non-existent domain หรือ NXDOMAINไม่มีชื่อนี้ในสมุดเช็กการสะกดชื่อเว็บ หรือโดเมนอาจหมดอายุแล้ว
ขึ้น timed outถาม Resolver แล้วไม่มีใครตอบลอง nslookup ชื่อเว็บ 1.1.1.1 ถ้าได้ แปลว่า Resolver เดิมมีปัญหา
ได้ IP แต่เว็บยังไม่ขึ้นDNS ทำงานปกติปัญหาอยู่ที่ตัวเว็บหรือเน็ต ไม่ใช่ DNS
เพิ่งย้ายเว็บ แต่ยังไปที่เดิมคำตอบเก่ายังไม่หมด TTLล้างความจำของเครื่อง แล้วรอสักพัก

กฎจำง่ายๆ คือ ถ้า nslookup ได้ IP ที่ถูกต้อง แปลว่าสมุดโทรศัพท์ไม่ผิด ให้ไปหาปัญหาที่อื่นต่อ เช่น ดู HTTP Status Code ว่าเซิร์ฟเวอร์ตอบอะไรกลับมา

ทิปสำหรับคนดูแลเว็บ ก่อนย้ายเว็บไปเซิร์ฟเวอร์ใหม่ ให้ลด TTL ของระเบียนลงล่วงหน้าสัก 1 วัน เช่นจาก 3600 เหลือ 300 วินาที พอถึงวันย้ายจริง เครื่องทั่วโลกจะลืมคำตอบเก่าภายใน 5 นาที แทนที่จะต้องรอเป็นชั่วโมง

สรุป

  • DNS คือคนแปลชื่อเว็บที่คนจำง่าย ให้เป็น IP ที่เครื่องใช้หากัน เหมือนรายชื่อในมือถือ
  • การค้นหาเดินจาก Resolver → Root → TLD → Authoritative แล้ว Resolver จำคำตอบไว้ตาม TTL
  • nslookup ชื่อเว็บ ใช้ถามหา IP ได้ทุกเครื่อง ใส่ 1.1.1.1 หรือ 8.8.8.8 ต่อท้ายเพื่อเปลี่ยนคนตอบ และใช้ -type= ถามระเบียนประเภทอื่น
  • ระเบียนที่เจอบ่อยคือ A, AAAA, CNAME, MX และ TXT
  • ถ้า nslookup ได้ IP ถูก ปัญหาไม่ได้อยู่ที่ DNS

อยากอ่านต่อ คู่มือคำสั่ง nslookup ฉบับเต็มอยู่ที่ Microsoft Learn และคำอธิบาย DNS สั้นๆ อยู่ที่ MDN

พร้อมแล้วก็ไปทำ Quiz ท้ายบทด้านล่างเพื่อรับ XP ได้เลยครับ

Quiz ท้ายบท

5 ข้อ · ข้อละ 10 XP

ทดสอบความเข้าใจเรื่อง DNS ตอบถูกข้อละ 10 XP

  • 5 ข้อ
  • ไม่จับเวลา
  • เฉลยทันทีทุกข้อ