How to install DNS server on Ubuntu 8.04.1 .

ได้รับมอบหมายให้มาจัดการกับ Service ต่างๆ ที่ run อยู่ ณ ขณะนี้ใน office โดยพี่เค้าไม่อยากให้ user ต้องมานั่งจำ Service ต่างๆ เป็น IP Address แต่ให้จำเป็นชื่อของ Sub Domain เอา เช่น mail.aoddy.com, backup.aoddy.com, twiki.aoddy.com ฯลฯ โดยเงื่อนไขก็ Basic ทั่วๆไป คือต้องการให้มี DNS Service ที่เป็น Internal ข้างนอกไม่สามารถที่จะเข้ามา Access ได้

คราวนี้ก็มาดูว่า… รายละเอียดของ Network ผมเป็นอย่างไรบ้าง

  1. มี Internal Network เป็น 192.168.0.0/24
  2. IP Address ของ DNS คือ 192.168.0.2 และให้ชื่อเครื่อง ว่า ns.aoddy.com
  3. บนเครื่อง DNS มีจะทำเป็น Virtual Hosting ด้วย
  4. มี 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 ของเราได้..เพราะว่า

  1. มี Admin หน้าตาดีเดินไปบอกว่า..เฮ้ยน้อง ให้ Set DNS เป็น IP เบอร์ 192.168.0.2 นะ
  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 ซึ่งมีดังนี้

  1. A (Address) Record เป็น Record ที่เราจะระบุว่า..IP อันนี้ให้ชื่อเป็น wwwin.cisco.com
  2. MX (Mail eXchange) Record เป็น Record ที่เราจะเอามาใช้ระบุว่า Mail Server ของเรา มี A Record เป็นอะไร ..แสดงว่า MX Record ไม่สามารถที่จะระบุเป็น IP Address ได้นะครับ..เราต้องสร้าง A Record ขึ้นมาก่อน.แล้วค่อย Point MX Record มาที่ A Record ดังกล่าว
  3. NS (Name Server) Record เป็น Record ที่บอกว่า DNS Server มี A Record เป็นอะไร..อ่ะๆ เหมือนกับ MX Record เลย..คือต้อง สร้าง A Record ขึ้นมาชี้ไปที่ IP ของ DNS Server ก่อนแล้วค่อยกำหนดว่า NS Record เป็น A Record อันนั้นนะ
  4. CNAME (Canonical Name) Record เป็น Record ที่ถูกเอามาใช้ในกรณีที่เรามีหลาย Service อยู่ในเครื่องเดียวกัน เช่น ftp.aoddy.com อยู่บนเครื่องเดียวกับ wwwin.aoddy.com เป็นตัว..เราก็เอา CNAME มาใช้นั่นเอง
  5. SOA (Start Of Authorities) Record เป็น Record ที่แตกต่างจากชาวบ้านเค้ามากที่สุดและจำเป็นต้องมีอีกด้วย โดย Record นี้จะบอกให้เราทราบได้ว่า
    1. เราจะใช้ Domain เป็นอะไรเช่น @aoddy.com
    2. เป็น Record ที่มีได้แค่ Record เดียวใน Zone File นั้นๆ
    3. มี 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

  1. http://aboutdebian.com/dns.htm
  2. http://en.wikipedia.org/wiki/Domain_Name_System
  3. http://www.thaitux.info/node/478
  4. http://catadmin.cattelecom.com/km/blog/adisornk/2007/08/01/enabling-and-disabling-services-during-start-up-in-ubuntu/