Introduction:
ในระบบ Internet นั้นจะมีการกำหนดตำแหน่งของเครื่องอยู่สองแบบคือ
การใช้ IP address และการใช้ domain name ซึ่ง domain name นี้นอกจากจะทำให้จำชื่อเครื่องได้ง่ายแล้ว
ยังช่วยบอกว่าเครื่องนั้นน่าจะมีข้อมูลเกี่ยวกับอะไรเก็บไว้ เช่น www.cnn.com
ก็น่าจะเป็นเครื่องที่เก็บ Web Page ของ สำนักข่าว CNN หรือว่า www.cmu.ac.th
ก็น่าจะเป็นเครื่องที่เก็บ Web Page ของ มหาวิทยาลัยเชียงใหม่ ซึ่งตั้งอยู่ในประเทศไทยเป็นต้น
ซึ่งเครื่องที่ใช้เก็บข้อมูลเกี่ยวกับ domain name ก็จะเรียกว่า domain name
server (DNS) ซึ่ง DNS จะทำงานสองอย่าง คือ เป็นผู้เก็บข้อมูลของ domain name
หนึ่ง ๆ โดยจะเก็บไว้ใน domain name database file และ งานอย่างที่สองคือ
การให้บริการแก่เครื่องผู้ใช้ทั่วไปในการแปลง domain name เป็น IP Address
โดย เมื่อได้รับ request นี้มา DNS จะทำการตรวจสอบว่า domain name database
ที่มีอยู่ มี information เกี่ยวกับชื่อที่ขอมาหรือไม่ ถ้าไม่มี ก็จะถาม DNS
ตัวอื่น ตามที่กำหนดไว้ต่อไปให้ ซึ่งลักษณะการเก็บแบบนี้จะเรียกว่า Hierachical
Domain Name System
โดยทั่วไปเราจะแบ่งชนิดของ DNS ได้ 4 แบบ คือ
1. Caching only DNS ถือว่าเป็น DNS แบบพื้นฐานที่สุด
กล่าวคือ จะไม่มี Domain Name Database เก็บไว้ในตัวเอง จึงไม่สามารถให้บริการได้โดยตรง
แต่เมื่อมี Request เข้ามา มันจะไปถาม DNS ตัวที่อยู่สูงขึ้นไป แล้วเมื่อได้รับคำตอบแล้ว
ก็จะ ตอบกับไปยังเครื่องที่ขอมา และจะเก็บไว้ใน cache ของตัวมันเอง เพื่อให้บริการแก้ผู้ที่มาขอข้อมูลเดียวกัน
โดยไม่ต้องไปถาม DNS ตัวที่อยู่สูงขึ้นไปอีก เนื่องจากว่าตัว Cache นี้ถูกจัดเก็บไว้ใน
Memory ดังนั้น เมื่อทำการปิดเปิดเครื่องใหม่ ข้อมูลใน Cache ก็จะหายไปด้วย
ทำให้ต้องเริ่มเก็บข้อมูลใหม่
2. Primary DNS เป็น DNS ที่จะเก็บข้อมูลของ domain
name หนึ่ง ๆ ไว้ เพื่อที่จะให้บริการแก่ DNS ตัวอื่น ในการร้องขอข้อมูลเกี่ยวกับ
domain name นั้น โดย DNS จะมีระบบในการชี้แบบ Hierachy หรือว่าแบบ tree เช่น
ถายใต้ .th ก็จะมี co.th ac.th or.th และภายใต้ ac.th ก็จะมี cmu.ac.th ku.ac.th
เป็นต้น
3. Secondary DNS เป็น DNS ที่จะอ่านข้อมูลมาจาก Primary
DNS มาเก็บไว้ เพื่อเป็นเครื่องสำรองในกรณีที่ Primary DNS ไม่สามารถทำงานตามปกติได้
โดยปกติ การจดทะเบียน domain name นั้น จะต้องมี Primary DNS หนึ่งตัว และ
Secondary DNS อย่างน้อยหนึ่งตัว
4. Forwarder DNS เป็น DNS ที่คอย forward คำร้องขอ
ไปยัง DNS ตัวอื่น มักจะใช้ในระบบที่มี Firewall หรือว่า Private Network
ในการตั้ง DNS นั้น ก็ต้องพิจารณาตามความต้องการ ถ้าความต้องการที่มีอยู่
ต้องการเพียงการแปลง domain name ไปเป็น IP Address ก็ไม่มีความจำเป็นต้องตั้ง
DNS ขึ้นมา เพียงแต่ set เครื่องให้ชี้ ไปยัง DNS ตัวที่อยู๋ใกล้ที่สุด แต่ถ้าต้องการมี
domain name ของตัวเอง ก็ต้องมีการตั้ง Primary DNS ขึ้นมา และหา Secondary
DNS ซึ่ง ก็มักจะเป็น DNS ตัวที่อยู๋ใกล้ ๆ หรือว่า DNS ตัวที่อยู่สูงขึ้นไปเป็นต้น
Prerequirement:
Linux ทุกเครื่องที่ลงอย่างถูกต้องจะ มี DNS daemon
มาให้อยู่แล้ว โดยจะเป็น file ชื่อว่า /usr/sbin/named และจำเป็นต้องมี Domain
Name Database file ซึ่งสามารถเขียนขึ้นมาเอง เนื่องจากว่าเป็น text file
ธรรมดา หรือว่าสามารถ download template file ได้จาก <ftp://proxy.intanon.nectec.or.th/pub/linux/domain/>
การทำให้ Linux สามารถใช้ DNS ได้
ในหัวข้อแรกจะกล่าวถึงการทำให้ Linux server สามารถใช้
DNS ที่มีอยู่ได้ก่อน โดยไม่จำเป็นว่า DNS จะอยู่ในเครื่องนั้นหรือไม่ หรือกล่าวในอีกนัยหนึ่ง
ไม่ว่าเครื่องนั้นจะเป็น DNS หรือไม่ ก็ต้อง set ให้ Linux server เครื่องนั้นเห็น
DNS ซึ่งสามารถทำได้โดยการแก้ไข file /etc/resolv.conf ดังตัวอย่าง
# cat /etc/resolv.conf
domain mptc.eng.cmu.ac.th
nameserver 202.44.248.68
nameserver 202.44.145.20
#
โดย domain จะหมายถึง domain name ของเครื่องนี้ และ
nameserver จะหมายถึง DNS ที่ เครื่องนี้จะไปถาม เรียงตามลำดับ จากตัวอย่าง
เครื่องจะไปถาม เครื่องที่มี 202.44.248.68 และถ้าไม่ได้คำตอบ ก็จะไปถาม 202.44.145.20
เป็นต้น ซึ่ง domain name ที่ file นี้จะต้อง set ให้ตรงกับ ที่ set ชื่อเครื่องไว้ด้วย
การตั้ง DNS ใน Linux server
ดังที่ได้กล่าวไปแล้ว ไม่จำเป็นว่าทุกเครื่องจะต้อง
run DNS daemon เฉพาะเครื่องที่เป็น DNS เท่านั้น จะ run DNS daemon
ซึ่งการ run DNS daemon นั้น จะต้องทำการแก้ไข file config ชื่อว่า /etc/named.boot
ซึ่งจะเป็น file ที่กำหนดรายละเอียดการทำงานของ DNS daemon ในเครื่องนั้น
โดย file /etc/named.boot จะมี โครงสร้างดังนี้คือ
directory /etc/domain
;cache initialize file
cache
.
root.cache
;domain name -> IP database
file
primary
intanon.nectec.or.th
named.hosts
;IP -> domain name database
file
primary
145.44.202.IN-ADDR.ARPA
named.rev
;localhost database file
primary
0.0.127.IN-ADDR.ARPA
named.local
;secondary database file
secondary eng.cmu.ac.th
202.44.246.70 db.eng
จากตัวอย่าง บอกให้รู้ว่าเครื่องนี้ เป็น Primary DNS
ของ domain intanon.nectec.or.th โดยมี file ชื่อว่า named.hosts คอยเก็บรายละเอียดต่าง
ๆ ของ domain นี้ และมี file named.rev ที่คอยเก็บข้อมูลของการแปลง IP เป็นชื่อ
ส่วน named.local เก็บรายละเอียดเกี่ยวกับ local host ส่วน secondary บอกว่าเครื่องนี้
เป็น secondary DNS ของ domain name eng.cmu.ac.th โดย db.eng จะเป็น file
ที่สร้างขึ้นมาโดยอัตโนมัติ โดยจะอ่านข้อมูลมาจาก Primary DNS ที่อยูที่ IP
address 202.44.246.70 โดยจะเป็นข้อมูลของ domain name eng.cmu.ac.th ส่วน
file root.cache เป็น file ที่ใช้สร้าง Cache ของ DNS ตอนเริ่มต้น ซึ่งถ้าต้องการให้มี
ข้อมูลอะไรอยู่ ก็สามารถใส่เข้าไปใน file นี้ได้เลย
ซึ่งถ้า Linux server ตัวนี้รับผิดชอบมากกว่าหนึ่ง
Domain ก็ให้ใส่ domain name database file แยกแต่ละ file ออกไป และถ้าต้องการใส่
comment ก็ใช้ ; ในตอนต้นบรรทัด หรือว่าหน้าข้อความที่ต้องการ โดยหลัง ; จะเป็น
commment ไปจนถึงสิ้นสุดบรรทัด
การสร้าง name -> IP database file
การสร้าง database file นี้ จะสร้างใน directory ที่กำหนดใว้ใน
file /etc/named.boot และชื่อ file ก็กำหนดไว้ใน file /etc/named.boot เช่นกันและจะมี
format ดังนี้คือ
#cat /etc/domain/named.host
;เริ่มต้นส่วน Header
@
IN SOA ds90.intanon.nectec.or.th. root.ds90.intanon.nectec.or.th.
(
1997091101 Serial in <year><month><date><no_in_date>
10800 Refresh 3 hours
3600 ; Retry 1 hour
3600000 ; Expire 1000 hours
86400 ) ; Minimum 24 hours
IN NS ds90.intanon.nectec.or.th.
IN NS morakot.nectec.or.th.
IN MX 10 ds90.intanon.nectec.or.th.
;สิ้นสุดส่วน Header
;เริ่มต้นส่วน Body
ds90 IN
A 202.44.145.20
IN HINFO "P75R16" "Linux 2.0.33"
www
IN CNAME ds90
proxy IN
A 202.44.145.100
IN HINFO "P166R128" "Linux 2.0.33"
nms
IN CNAME proxy
;สิ้นสุดส่วน Body
จากตัวอย่างเป็นการสร้าง database file สำหรับ domain
name intanon.nectec.or.th (ชื่อ domain name จะกำหนดใน file /etc/named.boot
) โดยจะประกอบไปด้วยองค์ประกอบสองส่วนคือ ส่วน header ซึ่ง database file
ทุก file จะมีส่วนนี้เหมือนกันหมด โดยบรรทัดแรก @ จะมายถึงข้อมูลของ domain
name นี้โดยจะมีโดย IN จะหมายถึง Internet ส่วน SOA จะมาจาก ZOne of authority
หรือ Originate of domain ซึ่งจะประกอบไปด้วย ชื่อเครื่อง ชื่อผู้ดูแลเครื่อง
ค่า serial ซึ่งจะเป็นตัวบอกว่า มีการแก้ไขข้อมูลของ domain นี้หรือไม่ ดังนั้นถ้าเราทำการแก้ไขข้อมูลใน
file นี้ก็ต้องทำการแก้ค่านี้ด้วย โดยทั่วไปจะใช้ค่าของ ปี เดือน วัน ครั้งที่ในวันนั้น
ที่ทำการแก้ไข จากตัวอย่าง ก็คือ file นี้มีการแก้ไขเป็นครั้งแรกของวันที่สิบเอ็ด
เดือนกันยายน ปี 1997 นั่นเอง ในบรรทัดถัดมาเป็น เป็นการบอกจะทำการ refresh
ข้อมูลทุก 3 ชั่วโมง จะทำพยายามอ่านข้อมูลจาก DNS ตัวอื่นภายใน หนึ่งชั่วโมง
ข้อมูลที่ไม่ได้ใช้ครบ 1000 ชั่วโมงจะถูกดึงออกจาก Cache และ ค่า TTL(Time
To Live) เป็น 24 ชั่วโมง ในส่วนถัดมา NS จะหมายถึง Name Server ซึ่ง เครื่องนี้ไปอ้างอิงถึงด้วย
และจะมีกี่ตัวก็ได้ โดยเรียงตามลำดับความสำคัญ ส่วน MX จะหมายถึง mail exchange
คือการกำหนดเครื่องที่เป็น Mail Service Server นั่นเอง และสามารถกำหนดค่าความสำคัญได้ด้วย
ในส่วน body จะเป็นการกำหนดชื่อเครื่องกับ IP address
ที่สัมพันธ์ก้น โดย A จะมาจาก address ส่วน HINFO จะมาจาก Hardware Info
และ CNAME จะมาจาก Chronological Name หรือชื่อแฝง ดังนั้นจากตัวอย่างเครื่องที่ชื่อว่า
ds90 (ซึ่งจะมี domain name ว่า intanon.nectec.or.th ) จะมี Internet Address
เป็น 202.44.145.20 และมี Hardware info เป็น P75R16 และมี OS เป็น Linux
2.0.33 (ซึ่งจะใส่หรือว่าไม่ใส่ก็ได้ ) ละมีชื่อแฝง หรือว่าชื่ออื่น ๆ เป็น
www เป็นต้น ซึ่งถ้ามีเครื่องอื่น ๆ อีก ก็ให้ใส่รายละเอียดของแต่ละเครื่องเรียงตามลำดับได้เลย
ตามตัวอย่าง
การสร้าง IP -> Name database file
ก็จะเหมือนกับการสร้าง Name -> IP database file แต่จะต่างกันในส่วนของ
body ดังตัวอย่าง
# cat /etc/domain/named.rev
;เริ่มต้นส่วน Header
@
IN SOA ds90.intanon.nectec.or.th. root.ds90.intanon.nectec.or.th.
(
1997091101 Serial
10800 Refresh 3 hours
3600 ; Retry 1 hour
3600000 ; Expire 1000 hours
86400 ) ; Minimum 24 hours
IN NS ds90.intanon.nectec.or.th.
IN NS morakot.nectec.or.th.
;สิ้นสุดส่วน Header
;เริ่มต้นส่วน Body
20
IN PTR ds90.intanon.nectec.or.th.
IN PTR www.intanon.nectec.or.th.
100 IN
PTR proxy.intanon.nectec.or.th.
IN PTR nms.intanon.nectec.or.th.
;สิ้นสุดส่วน Body
โดยในส่วน Body จะใช้ IN PTR ซึ่งย่อมาจาก Internet pointer อันหมายถึงว่า IP (3 ส่วนแรกกำหนดที่ file /etc/named.boot 202.44.145.)20 ชี้ไปยังเครื่องชื่อ ds90.intanon.nectec.or.th และ www.intanon.nectec.or.th เป็นต้น
การสร้าง local database file
การสร้าง local database file นั้น จะมีโครงสร้างดังนี้
# cat /etc/domain/named.local
;เริ่มต้นส่วน Header
@
IN SOA dg42.mptc.eng.cmu.ac.th. root.dg42.mptc.eng.cmu.ac.th.
(
1997070902 Serial
10800 Refresh 3 hours
3600 ; Retry 1 hour
3600000 Expire 1000 hour
86400 ) Minimum 24 hours
IN NS localhost
;สิ้นสุดส่วน Header
;เริ่มต้นส่วน Body
localhost
IN A 127.0.0.1
1
IN PTR localhost
;สิ้นสุดส่วน Body
ซึ่งในส่วนของ Body จะเขียนเหมือนกันหมดในทุก server
จึงไม่ต้องทำการแก้ไขอะไร แก้ไขเพียงส่วน Header ให้เหมาะสมเท่านั้น
การสร้าง Cache initialize file
โดยปกติ Cache initialize file จะใช้วิธีการ copy
จาก template file มากกว่า เพราะว่า ไม่มีความจำเป็นต้องทำเอง แต่ว่าจะนำตัวอย่างของ
file ที่ใช้จริง มาแสดงให้ดูเป็นตัวอย่าง
# cat /etc/named/root.cache
.
99999999 IN
NS NS.NIC.DDN.MIL.
99999999 IN
NS A.ISI.EDU.
99999999 IN
NS AOS.BRL.MIL.
99999999 IN
NS C.NYSER.NET.
99999999 IN
NS GUNTER-ADAM.AF.MIL.
99999999 IN
NS NS.NASA.GOV.
99999999 IN
NS TERP.UMD.EDU.
;Prep the cache (hotwire the addresses). Order does not matter
NS.NIC.DDN.MIL.
99999999 IN
A 192.67.67.53
A.ISI.EDU.
99999999 IN
A 26.3.0.103
A.ISI.EDU.
99999999 IN
A 128.9.0.107
AOS.BRL.MIL.
99999999 IN
A 128.20.1.2
AOS.BRL.MIL.
99999999 IN
A 192.5.25.82
C.NYSER.NET.
99999999 IN
A 192.33.4.12
GUNTER-ADAM.AF.MIL.
99999999 IN
A 26.1.0.13
NS.NASA.GOV.
99999999 IN
A 128.102.16.10
NS.NASA.GOV.
99999999 IN
A 192.52.195.10
TERP.UMD.EDU.
99999999 IN
A 128.8.10.90
การติดตั้ง DNS daemon
เมื่อทำการแก้ไข DNS database file เสร็จสิ้นแล้ว
ก็ลอง run DNS daemon ดู ดังตัวอย่าง
# named &
ถ้าไม่มี error message ก็แสดงว่าสามารถทำงานได้ตามปกติ
ก็ไปแก้ไข file boot script โดยจะแก้ไข file /etc/rc.d/rc.inet2 โดยลบ # ที่นำหน้าบรรทัดดังตัวอย่างออก
# # Start the NAMED/BIND
name server.
if [ -f ${NET}/named ];
then
echo -n
" named"
{NET}/named
fi
แล้วทำการ Boot เครื่องเพื่อดูว่า Boot Script ทำงานหรือไม่
ถ้าทำงานปกติ สามารถตรวจสอบได้ดังนี้
#ps -ax | grep named
387 ?
S 0:31 named
3191 p2 S
0:00 grep named
#:~$
แสดงว่า DNS daemon (named) ทำงานได้ และควรตรวจสอบอีกครั้งโดย
#nslookup
>www.cnn.com
Server: ds90.intanon.nectec.or.th
Address: 202.44.145.20
Name: cnn.com
Addresses: 207.25.71.27,
207.25.71.28, 207.25.71.29, 207.25.71.22
207.25.71.23, 207.25.71.24, 207.25.71.25, 207.25.71.26
Aliases: www.cnn.com
>exit
#
นั่นคือ DNS daemon สามารถทำงานได้ปกติ