ได้รับมอบหมายให้มาจัดการกับ Service ต่างๆ ที่ run อยู่ ณ ขณะนี้ใน office โดยพี่เค้าไม่อยากให้ user ต้องมานั่งจำ Service ต่างๆ เป็น IP Address แต่ให้จำเป็นชื่อของ Sub Domain เอา เช่น mail.aoddy.com, backup.aoddy.com, twiki.aoddy.com ฯลฯ โดยเงื่อนไขก็ Basic ทั่วๆไป คือต้องการให้มี DNS Service ที่เป็น Internal ข้างนอกไม่สามารถที่จะเข้ามา Access ได้
คราวนี้ก็มาดูว่า… รายละเอียดของ Network ผมเป็นอย่างไรบ้าง
- มี Internal Network เป็น 192.168.0.0/24
- IP Address ของ DNS คือ 192.168.0.2 และให้ชื่อเครื่อง ว่า ns.aoddy.com
- บนเครื่อง DNS มีจะทำเป็น Virtual Hosting ด้วย
- มี Service ที่ต้องใช้ใน Virtual Hosting นี้ก็คือ wwwin.aoddy.com, twiki.aoddy.com และ trac.aoddy.com
[ad#ad-post-1]
พอเราทราบเงื่อนไขคร่าวๆ แล้วคราวนี้เราก็คงต้องมาทำความรู้จักกับ DNS ซักหน่อยนะครับ กระบวนการก็ง่ายๆครับ เมื่อมีเครื่อง Client ที่อยู่ใน Internal Network ของเราต้องการทราบว่า ไอ้ wwwin.aoddy.com อยู่ที่ไหนมันก็จะวิ่งเข้าไปถามที่ DNS Server ทันที…อ่าว…แล้ว Client ไปรู้จัก DNS Server ได้ยังไง ? Client สามารถรู้จัก DNS Server ของเราได้..เพราะว่า
- มี Admin หน้าตาดีเดินไปบอกว่า..เฮ้ยน้อง ให้ Set DNS เป็น IP เบอร์ 192.168.0.2 นะ
- ก็ Admin หน้าตาดีคนเดิม.. ทำการ ตั้ง DHCP Server ขึ้นมาแล้วพอจ่าย IP Address ให้เครื่อง Client ก็ส่ง IP ขอบ DNS Server พร้อมกับ IP ไปด้วย
พอมัน…วิ่งไปถามที่ DNS Server เสร็จ DNS Server ก็จะตอบกลับออกมาเป็น IP Address ของ wwwin.aoddy.com ออกมาซึ่งแน่นอนว่าใน DNS Server ของเราก็ต้องมี List ของ IP Address ดังกล่าว..แต่ถ้าไม่มี..Client ก็อาจจะวิ่งไปถามที่ตัว DNS ตัวที่ 2 ก็ได้ซึ่งนั่นหมายความว่าเราสามารถใส่ IP DNS ที่เครื่องเราได้มากกว่า 1 IP
สิ่งที่จะต้องจำเป็นต้องรู้อีกอย่างใน DNS ก็คือ Type of Zone Record ซึ่งมีดังนี้
- A (Address) Record เป็น Record ที่เราจะระบุว่า..IP อันนี้ให้ชื่อเป็น wwwin.cisco.com
- MX (Mail eXchange) Record เป็น Record ที่เราจะเอามาใช้ระบุว่า Mail Server ของเรา มี A Record เป็นอะไร ..แสดงว่า MX Record ไม่สามารถที่จะระบุเป็น IP Address ได้นะครับ..เราต้องสร้าง A Record ขึ้นมาก่อน.แล้วค่อย Point MX Record มาที่ A Record ดังกล่าว
- NS (Name Server) Record เป็น Record ที่บอกว่า DNS Server มี A Record เป็นอะไร..อ่ะๆ เหมือนกับ MX Record เลย..คือต้อง สร้าง A Record ขึ้นมาชี้ไปที่ IP ของ DNS Server ก่อนแล้วค่อยกำหนดว่า NS Record เป็น A Record อันนั้นนะ
- CNAME (Canonical Name) Record เป็น Record ที่ถูกเอามาใช้ในกรณีที่เรามีหลาย Service อยู่ในเครื่องเดียวกัน เช่น ftp.aoddy.com อยู่บนเครื่องเดียวกับ wwwin.aoddy.com เป็นตัว..เราก็เอา CNAME มาใช้นั่นเอง
- SOA (Start Of Authorities) Record เป็น Record ที่แตกต่างจากชาวบ้านเค้ามากที่สุดและจำเป็นต้องมีอีกด้วย โดย Record นี้จะบอกให้เราทราบได้ว่า
- เราจะใช้ Domain เป็นอะไรเช่น @aoddy.com
- เป็น Record ที่มีได้แค่ Record เดียวใน Zone File นั้นๆ
- มี Timing Information ในกรณีที่เรามี Second DNS Server มันจะทำการเอาข้อมูล Timing ดังกล่าวไป Check กันว่า ตรงกันหรือ เปล่า
นอกจากนี้ยังมีค่า TTL (Time To Live) มีหน่วยเป็น “วินาที” ซึ่งเป็นค่าที่บอกให้ เราทราบว่า เมื่อใดก็ตามที่มี Client มา lookup ที่ Zone File นี้แล้วใช้เวลาเกินกว่าเวลา TTL ก็ให้ไปถามที่ Secondary DNS แทนนะ จริงๆแล้วค่า TTL นี้เราสามามารถกำหนดเป็น ชั่วโมง(h), หรือ วัน(d) ได้อีกด้วย โดยการเติมตัวอักษร h หรือ d ไว้ข้างหลังตัวเลขนั้นๆ
ตัวอย่าง
$TTL 86400
my-name.com. IN SOA debns1.my-name.com. \
joe.my-name.com. {
2004011522 ; Serial no., based on date
21600 ; Refresh after 6 hours
3600 ; Retry after 1 hour
604800 ; Expire after 7 days
3600 ; Minimum TTL of 1 hour
)
;Name servers
debns1 IN A 192.168.1.41
debns2.joescuz.com. IN A 192.168.1.42
@ IN NS debns1
my-name.com. IN NS debns2.my-name.com.
;Mail servers
debmail1 IN A 192.168.1.51
debmail2.my-name.com. IN A 192.168.1.52
@ IN MX 10 debmail1
my-name.com. IN MX 20 debmail2.my-name.com.
;Aliased servers
debhp IN A 192.168.1.61
debdell.my-name.com. IN A 192.168.1.62
www IN CNAME debhp
ftp.my-name.com. IN CNAME debdell.my-name.com.
หลังจากที่เรารู้จักกับ DNS มากันพอสมควรแล้วคราวนี้..เราก็มาเริ่มการติดตั้งกันดีกว่า ครับ
Install phase
1. การติดตั้ง Package ที่จะต้องใช้
$ sudo aptitude install bind9 dnsutils
** dnsutils เป็น package ที่ช่วยทำให้ Client ที่มีความแต่งต่างกันเวลาเรียกใช้ DNS Server จะได้ Output ที่เหมือนๆกัน
2. ข้อดีของ BIND อีกอย่างที่เด่นชัดก็คือ ตัว Software สามารถที่จะแบ่งออกเป็น External DNS และ Internal DNS ได้ในเครื่องเดียวกัน..แต่เราจะ Focus แค่ใน Internal Network เท่านั้น..(แต่ External ก็ Comment ไว้..สร้าง Directory เผื่อไว้ใช้ในอนาคตด้วย) คราวนี้ก็มาสร้าง ACL เผื่อที่จะกำหนดว่าให้ User ที่อยู่ใน Network วงไหนที่จะสามารถวิ่งเข้ามาใช้ DNS Service ของเราได้บ้าง โดยการเข้าไปแก้ไขที่ ไฟล์ /etc/bind/named.conf.local
$ sudo vi /etc/bind/named.conf.local
acl internals {
127.0.0.0/8;
192.168.0.0/24;
192.168.1.0/24;
};
include "/etc/bind/aoddy.com.conf";
3. เข้าไปแก้ไขไฟล์ /etc/bind/aoddy.com.conf ดังนี้
view "internal" {
match-clients { internals; };
zone "aoddy.com" IN {
type master;
file "/etc/bind/internal/aoddy.com.fwd";
allow-update { none; };
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "/etc/bind/internal/aoddy.com.rev";
allow-update { none; };
};
};
# Comment ที้งไว้ เผื่อใช้ในอนาคค
#view "external" {
# match-clients { any; };
# zone "aoddy.com" IN {
# type master;
# file "/etc/bind/external/aoddy.com.fwd";
# allow-update { none; };
# };
# zone "223.222.111.in-addr.arpa" IN {
# type master;
# file "/etc/bind/external/aoddy.com.rev";
# allow-update { none; };
# };
#};
4. เข้าไปที่ Directory /etc/bind แล้วก็ทำการสร้าง Directory ที่ชื่อว่า internal และ external หลังจากนั้นก็เข้าไปใน directory ที่ชื่อว่า internal แล้วก็สร้างไฟล์ขึ้นมา 2 ไฟล์ คือ aoddy.com.fwd และ aoddy.com.rev โดยมีรายละเอียดดังนี้
$ sudo vi /etc/bind/internal/aoddy.com.fwd
$TTL 86400
@ IN SOA ns.aoddy.com. root.ns.aoddy.com. (
2008101100 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
@ IN NS ns.aoddy.com. ; primary NS
wwwin IN CNAME ns
twiki IN CNAME ns
trac IN CNAME ns
; append or edit host file here
ns IN A 192.168.0.1
$ sudo vi /etc/bind/internal/aoddy.com.rev
$TTL 86400
@ IN SOA ns.aoddy.org. root.ns.aoddy.org. (
20081011 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
@ IN NS ns.aoddy.org. ; primary NS
2 IN PTR ns.aoddy.com.
2 IN PTR wwwin.aoddy.com.
2 IN PTR twiki.aoddy.com.
2 IN PTR trac.aoddy.com.
ตัว “@” ก็คือชื่อ Zone ซึ่งในที่นี่จะมีค่าเป็น aoddy.com ซึ่งเป็นค่าที่เราระบุใน aoddy.com.conf นั่น
5. ไฟล์ที่เราสร้างไปจะมี owner เป็น root เราต้องเปลี่ยน owner เป็น bind account ด้วย..ทำแบบนี้
$ cd /etc/bind/
$ sudo chown -R bind:bind *
6. ทำการ Start DNS Server service โดยใช้ command ดังนี้
$ sudo /etc/init.d/bind9 restart
7. แน่นอนว่า..เราต้องการให้ DNS Server เรา Start ตอนที่มัน Boot แบบ autumatic ก็ใช Command ดังนี้
$ sudo update-rc.d bind9 defaults
** จาก command ตรงนี้มันจะ Start service DNS Server ที่ Run Level 2,3,4 และ 5
Test phase
หลังจากติดตั้งเสร็จก็มา ทดสอบกันครับว่า ไอ้ที่เราทำไปมัน Work หรือเปล่า วิธี Test ก็ง่ายๆ ด้วยการใช้ Command nslookup เช่น
aoddy@ns:~$ nslookup
> wwwin
Server: 192.168.0.2
Address: 192.168.0.2#53
wwwin.aoddy.com canonical name = ns.aoddy.com.
Name: ns.aoddy.com
Address: 192.168.0.2
> twiki
Server: 192.168.0.2
Address: 192.168.0.2#53
twiki.aoddy.com canonical name = ns.aoddy.com.
Name: ns.aoddy.com
Address: 192.168.0.2
> 192.168.0.2
Server: 192.168.0.2
Address: 192.168.0.2#53
2.0.168.192.in-addr.arpa name = trac.aoddy.com.
2.0.168.192.in-addr.arpa name = wwwin.aoddy.com.
2.0.168.192.in-addr.arpa name = ns.aoddy.com.
2.0.168.192.in-addr.arpa name = twiki.aoddy.com.
[ad#ad-post-1]
Site referrence
- http://aboutdebian.com/dns.htm
- http://en.wikipedia.org/wiki/Domain_Name_System
- http://www.thaitux.info/node/478
- http://catadmin.cattelecom.com/km/blog/adisornk/2007/08/01/enabling-and-disabling-services-during-start-up-in-ubuntu/