DNS Server เค้าทำกันอย่างไร ใช้โปรแกรมใดในการทำระบบ เรามาลองทำ LAB เพื่อเรียนรู้กันครับ

Ake_.Net JPK
7 min readFeb 13, 2024

--

จากบทความ ที่ผมได้อธิบายเกี่ยวกับระบบ DNS ว่าคืออะไร ต้นคิดมาจากอะไร มีประโยชน์อย่างไรในโลก Internet อ่านบทความเดิมของผมได้ในลิงค์นี้ครับ -> https://medium.com/@akenetjpk/ba095fb15c55

สำหรับบทความนี้ ผมจะมาลองทำ LAB เพื่อดูการทำงาน และ เรียนรู้การคอนฟิก เกี่ยวกับโปรแกรมที่ใช้ทำ Name Server เพื่อใช้เก็บ Record Domain name เพื่อเปิดให้ User หรือ Name Server , Resolver DNS อื่นๆ เข้ามา Query ข้อมูล Domain record ต่างๆเพื่อนำไปใช้งานได้ครับ

โปรแกรมนั้นก็คือโปรแกรม BIND นั่นเองครับ โปรแกรมสุดฮิตที่ใช้ทำ Name Server ครับ เพื่อที่เราจะได้รู้ว่ารูปแบบ หรือ Syntax ของโปรแกรมเป็นอย่างไร เก็บข้อมูลไว้อย่างไร เพื่อความเข้าใจมากขึ้นในระบบ DNS ครับ

รูปแสดง เลขลำดับขั้นตอนการทำงานของระบบ DNS / DNS architecture cr. รูปจาก https://www.researchgate.net/figure/DNS-architecture-DNS-Domain-Name-System-gTLD-general-Top-Level-Domain_fig2_345017736
รูปแสดง ลำดับขั้นตอนการทำงานของระบบ DNS โดยเครื่อง Recursive DNS Server ( Ubuntu Server Linux OS ) โดยยกตัวอย่างโดเมน www.ntplc.co.th

จากรูป Network Diagram เราจะเห็นเครื่อง Server ฝั่งทางขวา Root Server , TLD Server และ Name Server

ตัวโปรแกรมที่นิยมนำมาใช้งานกันนั้นคือโปรแกรม BIND ซึ่งสามารถติดตั้งในระบบปฏิบัติ Linux , Unix ได้ และ จากรูป Network Diagram จะเห็นเครื่องฝั่งทางซ้าย Resolver DNS Server เครื่องนี้ ก็ใช้โปรแกรม BIND ทำหน้าที่ในการ Resolver DNS ได้เช่นกัน

รูปแสดง ตัวอย่างการตั้งค่า DNS Server ที่ Users เพื่อใช้งาน จากรูป Network Diagram เครื่อง Users ยกตัวอย่างใช้งานระบบปฏิบัติการ Windows โดยตั้งค่า DNS Server เป็น 192.168.3.188 ( Resolver DNS ) ซึ่งคือ Users จะส่ง DNS Request ไปที่เครื่อง IP .188 นั่นเอง เพื่อสอบถามว่า เว็บไซต์/โดเมน ต่างๆที่เราต้องการเข้าถึงนั้นมี IP Address อะไร เราก็จะเข้าถึงเว็บไซต์/โดเมนเนม นั้นๆได้ เพราะในเครือข่าย Internet จะเข้าถึงกันได้ด้วยระบบ IP

การ Resolver DNS ก็คือ การที่ User มา Query ข้อมูลจากเรา ( Resolver DNS Server ) แล้วเรา ไม่มีข้อมูล Domain name record ที่ User ต้องการ

ดังนั้น Resolver DNS Server จะทำหน้าที่ ไปสอบถาม ( Query ) จาก Name Server อื่นๆ โดยไล่ลำดับตั้งแต่ Root Server -> TLD Server -> Authoritative Name Server เพื่อนำข้อมูลมาตอบกลับให้ User ได้

ซึ่ง Resolver DNS Server ที่นิยมใช้กัน โดยเปิดให้ใช้ได้แบบ Public ก็คือ เช่น IP : 8.8.8.8 ของบริษัท Google หรือ IP: 1.1.1.1 ของบริษัท Cloudflare

รูปแสดง ข้อมูล DNS lookup ของโดเมน ntplc.co.th จากเว็บที่ให้บริการ DNS Lookup ในที่นี้ใช้เว็บ https://centralops.net/co/ ในการ Lookup จะเห็นว่า จดโดเมน ntplc.co.th ได้จดทะเบียนโดเมนกับบริษัท THNIC โดยระบุ Name Server ที่ใช้เก็บ Record ไว้กับ 4 Name Server ซึ่ง 1 ในนั้นจะมี Name Server ที่เป็น Master Name Server เพื่อให้ Slave Name Server อื่นๆ Transfer ข้อมูล Record Domain ต่างๆจาก Master Name Server มาเก็บไว้ เพื่อการสำรองข้อมูล และการกระจายโหลดในการรองรับการ Query
รูปแสดง ข้อมูล DNS lookup ของโดเมน ntplc.co.th จากโปรแกรม dig ใน Ubuntu Server ในการ Lookup เพื่อดูค่า Name Server จะเห็นว่าระบุ Name Server ที่ใช้เก็บ Record ไว้กับ 4 Name Server ซึ่ง 1 ในนั้นจะมี Name Server ที่เป็น Master Name Server เพื่อให้ Slave Name Server อื่นๆ Transfer ข้อมูล Record Domain ต่างๆจาก Master Name Server มาเก็บไว้ เพื่อการสำรองข้อมูล และการกระจายโหลดในการรองรับการ Query

การจะทำเครื่อง Name Server ขึ้นมาใช้งานได้เองนั้น คนอื่นๆในเครือข่าย Internet จะไม่รู้จักและจะไม่เห็นข้อมูล Domain Record ใน Name Server ของเรา

( นอกจาก User คนนั้น จะนำ IP Address ของ Name Server ของเราไปตั้งค่าใน DNS Server ในการตั้งค่าใช้งานโดยตรง )

การที่จะให้ทั่วโลกรู้จัก เราต้องไปจดทะเบียนกับบริษัทที่ดูแล Top Level Domains นั้นๆ เช่น ถ้าเราอยากจะเป็นผู้ดูแล Record ที่เก็บ Sub Domain ต่างๆที่อยู่ภายใต้โดเมน ntplc.co.th เราต้องไปแจ้งจดทะเบียนกับบริษัทที่ดูแล .th ซึ่งก็คือบริษัท THNIC เมื่อคนอื่นในเครือข่าย Internet ต้องการเข้าถึงโฮสต์ ที่มีหรืออยู่ภายใต้โดเมนชื่อ ntplc.co.th ก็จะรู้ว่าต้องมาดึงข้อมูล Record ต่างๆจาก Name Server ที่เราดูแลอยู่

จากนั้น Name Server ก็จะตอบกลับข้อมูลไป ว่าโฮสต์ที่อยู่ภายใต้โดเมน ntplc.co.th มี IP Address ใดหรือ เก็บข้อมูล Type ใดไว้ ก็จะตอบข้อมูลไปให้ User ได้ครับ

ขั้นตอนการติดตั้งโปรแกรม BIND9 เพื่อทำระบบ Resolver DNS Server & Name Server

  1. ติดตั้งระบบปฏิบัติ Ubuntu Server Linux ลงที่เครื่อง Resolver DNS ในรูป Network Diagram การติดตั้ง Ubuntu Server LinuxOS ดูวิธีการติดตั้งได้ในบทความของผมบทความนี้ได้ครับ -> https://medium.com/@akenetjpk/02f41db83c34

2. ทำการใช้โปรแกรม putty เพื่อ login เข้าใช้งาน Ubuntu Server จากนั้นใช้คำสั่ง

ss -4aultn

เพื่อดูว่า เครื่อง Ubuntu Server เปิดใช้งานพอร์ทใด Services ใด ไว้โดย Default ใดบ้าง จะเห็นว่า มีพอร์ท :53 udp/tcp ที่เกี่ยวกับการให้บริการ Query DNS เปิดใช้งานอยู่โดย Default

รูปแสดง สถานะ Services ของโปรแกรม systemd-resolved

โดยเครื่อง Ubuntu Server ก็ได้ตั้งค่า DNS Server เป็น IP Address : 127.0.0.53 ตั้งค่าได้ในไฟล์ /etc/resolv.conf ซึ่งก็คือเป็น IP Address ของตนเอง (Loopback IP) ที่ได้มาจากโปรแกรม systemd-resolved ครับ

คือเมื่อต้องการ Query DNS ก็จะ Query จากตนเอง แต่ค่า Default นั้น จะไม่ยังไม่สามารถให้บริการเป็น Resolver DNS Server ให้กับ Users ได้ครับ

ในบทความนี้ เราจะใช้โปรแกรม BIND9 เพื่อทำเครื่อง Resolver DNS Server และ Name Server เพื่อให้บริการรับ DNS Request จาก Users ได้ครับ

3. ทำการพิมพ์คำสั่ง

sudo apt update

จากนั้น ใช้คำสั่ง

sudo apt install bind9 -y

เพื่อทำการติดตั้งโปรแกรม BIND9 เมื่อติดตั้งเสร็จแล้ว ให้ใช้คำสั่ง

sudo systemctl status bind9

เพื่อดูว่า สถานะโปรแกรม active หรือไม่ ถ้า active แล้ว แสดงว่าติดตั้งเสร็จสมบูรณ์แล้ว

รูปแสดง การตรวจสอบ Port Service BIND9 และ การส่ง DNS Request จาก Users

3. ตรวจสอบ port services โดยใช้คำสั่ง

ss -4aultn

จะเห็นว่า โปรแกรม BIND9 ได้ Listening ผ่าน IP Address : 127.0.0.1 และ IP Address : 192.168.1.4 พอร์ท 53 ( เพื่อรอรับ Request จาก Users )

ซึ่งเป็น IP Address ที่ต่างกับ โปรแกรม systemd-resolved ที่ใช้ IP Address : 127.0.0.53 ครับ กล่าวคือ Services DNS นี้ ไม่ได้ใช้ IP ซ้ำซ้อนกันครับ

ดังนั้นแล้ว เครื่อง Ubuntu Server สามารถเลือกใช้ได้ ว่าจะใช้งาน DNS ผ่าน IP Address : 127.0.0.53 หรือ 127.0.0.1 โดยแก้ไขได้ในไฟล์ /etc/resolv.conf ครับ

4. เครื่อง Ubuntu Server นี้ ตั้ง IP Address : 192.168.1.4 ไว้ จากนั้นทดสอบโดย เครื่อง Users ที่ใช้ Windows ได้ใช้โปรแกรม nslookup ผ่าน command line ใช้คำสั่ง

nslookup facebook.com 192.168.1.4

เพื่อทำการส่ง Request DNS ไปถามเครื่อง Ubuntu Server ( ที่ติดตั้งโปรแกรม BIND9 ไว้เสร็จแล้วซึ่งจะทำงานเป็น Resolver DNS Server ได้เลยโดย Default )

โดยจะเห็นว่าเมื่อเครื่อง Windows ได้ทำการส่ง Request DNS ไปนั้น เครื่อง Ubuntu Server ตอบกลับข้อมูลมาให้ตามรูปด้านบน

รูปแสดง เลขลำดับขั้นตอนการทำงานของระบบ DNS / DNS architecture cr. รูปจาก https://www.researchgate.net/figure/DNS-architecture-DNS-Domain-Name-System-gTLD-general-Top-Level-Domain_fig2_345017736

เครื่องที่ทำหน้าที่เป็น Resolver DNS Server ในตัวระบบเอง คือ จะมี Zone default เพื่อใช้ทำการ Lookup ไปสอบถามข้อมูลที่ตนเองไม่มี ไปยัง Root Server ได้

แต่ถ้าในตนเอง มี Zone domain หรือ ข้อมูล domain ที่ Users นั้นสอบถามมา ก็จะใช้ข้อมูลในตนเอง ตอบกลับ Users ได้เลย

การที่เครื่อง Resolver DNS Server นี้มีข้อมูล Zone Domain ในตนเอง ที่ User ได้สอบถามมา ( DNS Request ) ดังนั้นการทำงานของเครื่องนี้จะทำงานเป็น Name Server ได้ด้วยครับ

รูปแสดง Zone default ของโปรแกรม BIND9 อยู่ใน Directory : /etc/bind/

5. ทำไมในโปรแกรม BIND9 รู้จัก Root Server?

ก็เพราะว่า ค่า Default ของโปรแกรม BIND9 ในไฟล์ /etc/bind/named.conf.default-zones มีการคอนฟิกไว้แล้ว คือ Zone “.” ( ราก , root )

เมื่อได้รับ DNS Request เข้ามาแล้ว ในตนเองไม่มี Zone domain ที่ User ต้องการ

รูปแสดง Record default ของ Zone “.” ( root zone ) ที่ใช้สำหรับอ่านข้อมูลเพื่อไปยัง Root Server อยู่ในไฟล์ /usr/share/dns/root.hints

6. จากนั้นตัวโปรแกรม BIND9 จะเริ่มทำการ Resolver DNS โดยเริ่มจาก ไปสอบถามที่ Root Server ซึ่งการจะไปยัง Root Server ได้นั้น ก็ต้องรู้ IP ของ Root Server ซึ่งตัวโปรแกรมมีค่า Default ที่ระบุเป็น Zone “.” ไว้แล้วว่า มี Record domain : a to m .root-servers.net ทั้ง 13 Server แล้ว ว่าจะต้องไปที่ IP Address ใดตามรูปด้านบนครับ

7. จะเห็นว่าโปรแกรม BIND9 จะอ่านคอนฟิกจากไฟล์ named.conf.xxx ต่างๆที่อยู่ใน directory : /etc/bind

ซึ่งในไฟล์ named.conf.default-zones ก็จะมีค่า Zone default มาให้ด้วยเบื้องต้นแล้ว ระบบจึงทำงานเป็น Resolver DNS Server ได้

ดังนั้นการที่จะให้ Name Server ตอบ DNS Request ได้ เราต้องมี Zone DNS , Zone Domain ที่ User ต้องการ

ซึ่งก็คือ เราต้องทำการ สร้าง Zone file และ ใส่ Record ที่มีข้อมูลการ map domain กับ IP Address หรือกับ text ต่างๆ ตามแต่ละ Types ของ Domain เพื่อให้โปรแกรม ฺBIND9 ได้มีฐานข้อมูลไว้ตอบกลับ User ได้ครับ

ถ้าเราไม่ไปจดทะเบียน Name Server ของเรากับผู้ที่ดูแล TLD Server เราก็สามารถใช้ในองค์กร หรือในเครือข่ายคอมพิวเตอร์ที่เราดูแลอยู่ ได้ปกติได้เลยครับ

8. จากตัวอย่าง Syntax ของการคอนฟิกเพื่อสร้าง Zone ดูจากไฟล์ named.conf.default-zones จะเห็นว่ามีทั้ง Zone ที่เป็น Forward Zone คือ

zone "localhost" {
type master;
file "/etc/bind/db.local";
};

และ Zone ที่เป็น Reverse Zone คือ

zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};

เราสามารถสร้าง Zone อิงตาม Syntax ได้เลย จะเห็นว่า การตั้งชื่อ Zone ก็คือ ตั้งชื่อ Domain ที่เราต้องการใช้

ส่วน Record ของ การ map domain ต่างๆ ก็จะอยู่ในส่วนของ file “/…/…/…” ครับ

Record ของการ Map Domain ตรงนี้ เราจะเรียกกันว่า RR หรือ Resource Record เป็นโครงสร้างข้อมูลในระบบ DNS (Domain Name System) ที่ใช้เก็บข้อมูลเกี่ยวกับการแปลงชื่อโดเมนเป็น IP Address และข้อมูล DNS อื่นๆ ในแต่ละ Resource Record มีรูปแบบที่กำหนดไว้เพื่อเก็บประเภทข้อมูลต่างๆ ในระบบ DNS ครับ

Resource Record ประกอบด้วยส่วนต่าง ๆ ดังนี้ :

Name Field: ระบุชื่อโดเมนหรือชื่อโซนของ Resource Record.
Type Field: ระบุประเภทของ Resource Record เช่น A, MX, CNAME, NS , TXT
Class Field: ระบุคลาสของ Resource Record, โดยส่วนใหญ่ใช้คลาส IN (Internet).
TTL (Time-to-Live) Field: ระบุระยะเวลาที่ข้อมูลนี้ถูกเก็บไว้ในแคชของ DNS resolver (หน่วยเป็นวินาที).
Data Field: เก็บข้อมูลที่เป็นลักษณะของประเภทของ Resource Record.

แต่ละประเภทของ Resource Record จะมีลักษณะและข้อมูลที่เก็บแตกต่างกันตามประเภทของ DNS record นั้น ๆ Resource Record ใช้เพื่อกำหนดข้อมูลของระบบ DNS เช่น การเปลี่ยนแปลงที่อยู่ IP, การกำหนดเซิร์ฟเวอร์ที่เป็น authoritative name server, การกำหนดชื่อโดเมนสำรอง (alias), และอื่น ๆ.

ในโปรแกรม BIND เราจะเห็น Zone file default และมี RR ที่โปรแกรม BIND ได้สร้างไว้ให้ เช่น zone “localhost” คือไฟล์ /etc/bind/db.local มี RR ดังนี้

;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
@ IN AAAA ::1

9. อธิบายรายละเอียดของแต่ละ RR ดังนี้
-@ IN SOA localhost. หมายถึง zone localhost มี Type SOA เพื่อใช้ในการกำหนดข้อมูลพื้นฐานและควบคุมของโซน DNS (DNS zone). ซึ่ง localhost คือชื่อโดเมนของ Name Server ที่เราใช้ซึ่งตัวอย่างนี้ ก็คือ เครื่องตนเอง

-@ IN NS localhost.@ หมายถึง โดเมน localhost มี NS ซึ่งคือใช้ Name Server ชื่อว่าอะไร ในทีนี้ ก็คือ record นี้จะอยู่เครื่องเดียวกับตนเอง ก็คือ localhost

-@ IN A 127.0.0.1 @ หมายถึง โดเมน localhost ใช้ Type A เพื่อระบุว่า โดเมน localhost มี IP เป็น 127.0.0.1

-@ IN AAAA ::1 @หมายถึง โดเมน localhost ใช้ Type A ที่เป็น IPv6 เพื่อระบุว่า โดเมน localhost มี IPv6 เป็น ::1

รูปแสดง การคอนฟิก Zone file

10. ผมจะทำการสร้าง Forward zone หรือ โดเมน ที่ชื่อ akenet.com โดยจะเพิ่มข้อมูล RR ในไฟล์ /etc/bind/akekapong.com.hosts โดยใช้คำสั่ง

sudo nano /etc/bind/named.conf.local

เพื่อเข้าไปคอนฟิกตามรูปด้านบน จากนั้นกด ctrl+o แล้วกด enter เพื่อ save และกด ctrl+x แล้วกด enter เพื่อออกจากโปรแกรม nano

รูปแสดงข้อมูล ของ Zone file ที่ใช้เก็บ DNS Record

11. ใช้คำสั่ง

sudo nano /etc/bind/akekapong.com.hosts

เพื่อทำการสร้างไฟล์เก็บ RR โดยอิงตาม Syntax ของค่า default zone localhost ตามรูปด้านบน

ผมได้ทำการ map record @ ซึ่งก็หมายถึงโดเมน akekapong.com กับ IP Address : 192.168.3.188

และ map record subdomain : www หมายถึง www.akekapong.com กับ IP Address : 192.168.3.190

จากนั้นกด ctrl+o แล้วกด enter เพื่อ save และกด ctrl+x แล้วกด enter เพื่อออกจากโปรแกรม nano

จากนั้นใช้คำสั่ง

sudo systemctl status bind9

เพื่อทำการ restart โปรแกรม BIND9 เพื่ออ่านค่าคอนฟิกที่เราได้คอนฟิกเข้าไป

12. ทำการตรวจสอบ Systax ( ไวยากรณ์ ) ของ Zone File: akekapong.com โดยใช้คำสั่ง

sudo named-checkzone akekapong.com /etc/bind/akekapong.com.hosts

หากถูกต้องจะขึ้น OK ตามรูปด้านบน

รูปแสดง Network Diagram : DNS architecture cr. รูปจาก https://www.researchgate.net/figure/DNS-architecture-DNS-Domain-Name-System-gTLD-general-Top-Level-Domain_fig2_345017736
รูปแสดง การทดสอบ DNS Request Query

13. จากรูป Network Diagram ทำการทดสอบ จากเครื่อง User ( Client ) ตัวอย่างนี้เครื่อง User ใช้ระบบปฏิบัติการ Windows ให้เข้า command line และพิมพ์คำสั่ง

nslookup

จากนั้นพิมพ์คำว่า

server 192.168.3.188

เพื่อระบุ IP Address ไปยัง DNS Server ที่เราต้องการใช้งาน ซึ่งในที่นี้คือเครื่อง Ubuntu Server ที่ติดตั้งโปรแกรม BIND9 เพื่อทำ Resolver DNS + Name Server ( ซึ่งตามรูป Network Diagram คือเครื่อง Recursive DNS Resolver )

ผลที่ได้คือ เมื่อเราพิมพ์โดเมน akekapong.com และ www.akekapong.com ก็จะได้คำตอบเป็น IP ตามที่เราได้ Map record เอาไว้ถูกต้อง ตามรูปด้านบนครับ

--

--

Ake_.Net JPK

ชอบเขียนบทความเกี่ยวกับระบบ Computer Network เพื่อทบทวนความรู้ความเข้าใจให้กับตนเองเป็นหลัก และให้ผู้ที่สนใจสามารถเข้ามาอ่านได้ครับ ขอขอบคุณที่ติดตามครับ