วันศุกร์ที่ ๒๙ มิถุนายน พ.ศ. ๒๕๕๐

BIND The Most Poppular Domain Name Server

ก็ด้วย สโลแกน ของ FreeBSD ที่ว่า The power to Serv ผมก็เห็นจริงตามนั้น เพราะ package ที่มาพร้อมกับ FreeBSD และสามารถปรับแต่งและใช้งานได้เลยก็มี เช่น BIND 9 ที่ผมจะพูดถึงวันนี้
BIND9 เป็นโปรแกรมที่ทำหน้าที่เป็น Domain Name Server ซึ่งในโลก Internet คงจะขาดสิ่งนี้ไม่ได้ หรือขาดได้ แต่การใช้งานคงจะลำบากน่าดู DNS เป็นมาตรฐานที่ใช้ในการแปลงชื่อ เช่น www.google.co.th เป็น ip เช่น 66.249.89.99 หรือกลับกัน เพื่อใช้ในการติดต่อสื่อสารและง่ายในการเข้าถึงเครื่องคอมพิวเตอร์ใด ๆ ได้บนเครือข่าย Internet หรือแม้กระทั่ง Intranet เองก็เถอะ

นระบบ FreeBSD ก็จะมี BIND มาให้แล้ว ดูรายละเอียดได้จากเว็บไซต์ ของ Internet Systems Consortium, Inc. (ISC) เพียงแต่เราปรับแต่งค่าคอนฟิกต่าง ๆ ก็สามารถใช้งานได้แล้ว โดยไม่ต้องติดตั้งอะไรเพิ่มเติม บทความนี้จะอ้างอิงจาก HandBook ของ FreeBSD เป็นหลักนะครับ

1. ก่อนอื่น เราจะสร้างไฟล์กำหนดค่ากันก่อน ซึ่งไฟล์พวกนี้ทั้งหมดจะอยู่ที่ /etc/namedb ซึ่งจะเป็น shortcut ไปที่ /var/named/etc/namedb เราจะสร้าง Master Zone ของ localhost ก่อนดังนี้ (Zone ในที่นี้คือไฟล์ของกลุ่ม Domain ที่จะแม๊ป กับ IP ใด ๆ)
#cd /etc/namedb
#sh make-localhost
Enter your domain name : aon-nok.com
ถ้าเรายังไม่มี domain ก็จะมีคำถาม ในตัวอย่างผมกรอก aon-nok.com ไม่มีจริงหรอกครับ ผมจะใช้เป็น intranet ส่วนใครที่ได้จดโดเมนแล้ว ก็กรอก โดเมนที่ได้จดมานั้นลงไป ถ้าทุกอย่างไปได้ดี ก็จะมีไฟล์ localhost.rev และ localhost-v6.rev อยู่ใน Directory ย่อย master อีกที

2. ไฟล์ /etc/namedb/named.conf ซึ่งเป็นไฟล์ที่กำหนดว่ามี Zone ใดบ้าง ผมจะเอาเนื้อหาในไฟล์มาให้ดู ทั้งหมดนะครับ แล้วจะดูว่า เราจะแก้ไขตรงไหนบ้าง
// $FreeBSD: src/etc/namedb/named.conf,v 1.21.2.1 2005/09/10 08:27:27 dougb Exp $
//
// Refer to the named.conf(5) and named(8) man pages, and the documentation
// in /usr/share/doc/bind9 for more details.
//
// If you are going to set up an authoritative server, make sure you
// understand the hairy details of how DNS works. Even with
// simple mistakes, you can break connectivity for affected parties,
// or cause huge amounts of useless Internet traffic.

options {
directory "/etc/namedb";
pid-file "/var/run/named/pid";
dump-file "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";

(สีน้ำเงินข้างบนเนี่ย ให้คงไว้นะครับ)

// If named is being used only as a local resolver, this is a safe default.
// For named to be accessible to the network, comment this option, specify
// the proper IP address, or delete this option.
listen-on { 127.0.0.1; };

(ตรงนี้สามารถกำหนดได้ว่า จะให้ map กับ IP ไหน หรือจะลบทิ้ง หรือ คอมเม้นออกไปเลยก็ได้ครับ)

// If you have IPv6 enabled on this system, uncomment this option for
// use as a local resolver. To give access to the network, specify
// an IPv6 address, or the keyword "any".
// listen-on-v6 { ::1; };

// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
// forward only;

// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below. This will make you
// benefit from its cache, thus reduce overall DNS traffic in the Internet.
/*
forwarders {
127.0.0.1;
};
*/

(ตรงนี้แก้ไขเป็น IP ของ name server ของผู้ให้บริการครับ แล้วลบ Comment สีแดงออกไปเลย)

/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND versions 8 and later
* use a pseudo-random unprivileged UDP port by default.
*/
// query-source address * port 53;
};

// If you enable a local name server, don't forget to enter 127.0.0.1
// first in your /etc/resolv.conf so this server will be queried.
// Also, make sure to enable it in /etc/rc.conf.

zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
};

(ตรงนี้ก็คงไว้เหมือนกัน เพราะมันอยู่ในขั้นตอน #sh make-localhost แล้ว)

// RFC 3152
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA" {
type master;
file "master/localhost-v6.rev";
};

(ส่วนตรงนี้ก็เป็น zone ของ local IPv6 คงไว้ก็ได้ ถ้าเราได้ใช้ครับ)

// NB: Do not use the IP addresses below, they are faked, and only
// serve demonstration/documentation purposes!
//
// Example slave zone config entries. It can be convenient to become
// a slave at least for the zone your own domain is in. Ask
// your network administrator for the IP address of the responsible
// primary.
//
// Never forget to include the reverse lookup (IN-ADDR.ARPA) zone!
// (This is named after the first bytes of the IP address, in reverse
// order, with ".IN-ADDR.ARPA" appended.)
//
// Before starting to set up a primary zone, make sure you fully
// understand how DNS and BIND works. There are sometimes
// non-obvious pitfalls. Setting up a slave zone is simpler.
//
// NB: Don't blindly enable the examples below. :-) Use actual names
// and addresses instead.

/* An example master zone
zone "example.net" {
type master;
file "master/example.net";
};
*/

/* An example dynamic zone
key "exampleorgkey" {
algorithm hmac-md5;
secret "sf87HJqjkqh8ac87a02lla==";
};
zone "example.org" {
type master;
allow-update {
key "exampleorgkey";
};
file "dynamic/example.org";
};
*/

/* Examples of forward and reverse slave zones
zone "example.com" {
type slave;
file "slave/example.com";
masters {
192.168.1.1;
};
};
zone "1.168.192.in-addr.arpa" {
type slave;
file "slave/1.168.192.in-addr.arpa";
masters {
192.168.1.1;
};
};
*/
(ส่วนนี้ทั้งหมด เป็นตัวอย่าง Zone ครับ เราจะแก้ไขเอา หรือจะเขียนใหม่ก็ได้)
ถ้ามองดูดี ๆ จะมองเห็นว่า ไฟล์นี้จะมีอยู่ 2 ส่วนคือ ส่วนของ Options และ ส่วนของ Zone ครับ แต่เนื่องจาก ไฟล์ named.conf มันดูรก และดูยากเนื่องจากทางผู้พัฒนาได้ใส่คำอธิบายต่าง ๆ เอาไว้

3. ดังนั้นผมจึงจะสร้างไฟล์ใหม่ เพื่อจะได้ดูง่าย ๆ ครับ ดัวอย่าง zone ไฟล์ของผมจะเป็นอย่างนี้ (ก่อนสร้างใหม่ backup ไฟล์เดิมไว้ด้วยครับ)
// เริ่ม ส่วนของ Options
options
{
directory "/etc/namedb";
pid-file "/var/run/named/pid";
dump-file "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";

forwarders {
203.192.33.34;
};
};
// จบส่วนของ Options

//เริ่มส่วนของ Zone
zone "." {
type hint;
file "named.root";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "master/localhost.rev";
};

zone "aon-nok.com" {
type master;
file "master/aon-nok.com.for";
};

zone "0.168.192.
in-addr.arpa" {
type master;
file "master/0.168.192.in-addr.arpa.rev";
};
//จบส่วนของ Zone
4. อธิบายส่วนของ Zone นิดหน่อย
zone "aon-nok.com" { ----->(ชื่อ zone หรือ ชื่อ Domain ในที่นี้จะเป็น forward zone คือแปลงชื่อเป็น ip)
type master; ----->(รูปแบบ zone ซึ่งเป็นได้ 2 อย่างคือ master กับ slave)
file "master/aon-nok.com.for"; ----->(ชื่อไฟล์ที่เก็บค่ากำหนด ของ zone หรือ domain นั้น ๆ)
};

zone "0.168.192.in-addr.arpa" { ----->(ชื่อ zone ในที่นี้ก็จะเป็น reverse zone คือ แปลง ip เป็น ชื่อ)
type master; ----->(รูปแบบ zone เป็น master)
file "master/0.168.192.in-addr.arpa.rev"; ----->(ชื่อไฟล์ที่เก็บค่ากำหนดของ zone)
};
5. หลังจากนั้น เราก็จะไปสร้างไฟล์เพื่อเก็บค่ากำหนดของ zone aon-nok.com และ 0.168.192.in-addr.arpa กัน (เช็คด้วยนะครับว่าตอนนี้เราอยู่ที่ directory ไหน โดยใช้คำสั่ง pwd ครับ)
สมมุติว่าเราอยู่ที่ /var/named/etc/namedb เราจะสร้างไฟล์สองไฟล์ข้างต้น ไว้ใน directory ชื่อ master
#cd master
#cp localhosts.rev aon-nok.com.for
#cp localhosts.rev 0.168.192.in-addr.arpa.rev
หลังจากสร้าง zone ไฟล์ทั้งสองแล้ว เราก็มาแก้ไขกัน เริ่มต้นที่ aon-nok.com.for ก่อน

6. เนื้อหาภายในไฟล์ localhost.rev จะเป็นดังนี้ ดังนั้นไฟล์ทั้งสองที่เราสร้างขึ้นมาก็จะมีเนื้อหาเหมือนกัน
;    From: @(#)localhost.rev    5.1 (Berkeley) 6/30/90
; $FreeBSD: src/etc/namedb/PROTO.localhost.rev,v 1.6 2000/01/10 15:31:40 peter Exp $
;
; This file is automatically edited by the `make-localhost' script in
; the /etc/namedb directory.
;

$TTL 3600

@ IN SOA ns1.aon-nok.com. root.ns1.aon-nok.com. (
20070628 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ; Minimum
)

IN NS localhost.aon-nok.com.
1 IN PTR localhost.aon-nok.com.
7. เราก็แก้ไข zone ไฟล์ ของ Domain เราซะ เดี๋ยวจะเอาตัวอย่าง zone ไฟล์ aon-nok.com.for มาให้ดูกันครับ
$TTL 3600        ; 1 hour
aon-nok.com. IN SOA ns1.aon-nok.com. root.ns1.aon-nok.com. (
20070628 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ; Minimum
)

IN A 192.168.0.1

; ชื่อของ โดเมนเนม Server
IN NS ns1.aon-nok.com.

; ชื่อ host ของ mail exchang สำหรับ รับส่งเมล์
IN MX 10 mail.aon-nok.com.

; ชื่อ host ต่าง ๆ ภายใน Domain ของเราที่ต้องการ map กับ IP ใด ๆ
localhost IN A 127.0.0.1
ns1 IN A 192.168.0.2
mail IN A 192.168.0.3
mx IN A 192.168.0.4


; ชื่อเสมือน หรือ ชื่อปลอม
www IN CNAME ns1.aon-nok.com.
webboard IN CNAME ns1.aon-nok.com.

;ทุก ๆ ชื่อ host ที่จบลงด้วย "." หมายถึงเป็นชื่อที่สมบูรณ์ แต่ถ้าไม่ได้จบด้วย "." ก็จะหมายถึงชื่อโดเมน(ที่ทำไฮไลท์เป็นสีแดง)ต่อท้ายอีกที เช่น www(ที่ทำไฮไลท์เป็นสีชมพู)ไม่ได้จบด้วย "." ดังนั้นระบบจะหมายถึง www.aon-nok.com.
8. และนี่ เป็น zone ไฟล์ของ 0.168.192.in-addr.arpa.rev ครับ
$TTL 3600

0.168.192.in-addr.arpa. IN SOA ns1.aon-nok.com. root.ns1.aon-nok.com. (
20070628 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ; Minimum
)

IN NS ns1.aon-nok.com.
; เปลี่ยน IP เป็น host name โดยที่ ตัวเลขข้างหน้า จะไปต่อท้าย 192.168.0.
1 IN PTR aon-nok.com.
2 IN PTR ns1.aon-nok.com.
3 IN PTR mail.aon-nok.com.
4 IN PTR mx.aon-nok.com.
9. อธิบายความหมายของ zone file กันก่อน เริ่มกันที่ รูปแบบ Record Type กัน
SOA (start of zone authority) ตัว Domain เริ่มต้น ในที่นี้จะเป็น aon-nok.com.
NS (name server) ชื่อของตัว name server ว่า Domain เรา name server ชื่อว่าอะไรบ้าง
A (address) map ชื่อ host ไปเป็น ip
CNAME (canonical name) ชื่อเสมือน ใช้ในกรณีมี ชื่อ host map กับ ip นั้น ๆ อยู่แล้ว
MX (mail exchanger) ตัวนี้จะบอก domain อื่น ๆ ว่าจะส่งเมล์มาหา host ไหนของเรา
PTR (pointer record) ใช้กับ reverse zone ครับ map ip ไปเป็น ชื่อ host

นี่คือ ชนิดที่ใช้กันบ่อย ๆ ครับ เรามาดูว่า จาก zone file ทั้งสอง อะไรหมายความว่ายังไงกันดีกว่านะครับ
aon-nok.com.    IN      SOA      ns1.aon-nok.com. root.ns1.aon-nok.com. (
20070628 ; Serial
3600 ; Refresh ทุก ๆ 1 ชม
900 ; ลองใหม่ ทุก ๆ 15 นาที
3600000 ; Expire หลังจาก 1000 ชม
3600 ; TTL ต่ำสุด ไม่รู้จะแปลยังไง
)
aon-nok.com. -> เป็นชื่อโดเมนของเราซึ่งหมายถึงทุก host จะถูกต่อท้ายด้วย โดเมนนี้
ns1.aon-nok.com. -> เป็น name server ปริยายของ โดเมน
root.ns1.aon-nok.com. ->เป็นคล้าย กับผู้ดูแลหรือเจ้าของ ที่จริงเราเปลี่ยนตรงนี้ให้เป็น email ของ admin ได้ซึ่งจะหมายถึง root@ns1.aon-nok.com
20070628 -> เป็นซีเรียลนัมเบอร์ของ zone ครับ เมื่อก่อนจะปรับเพิ่มทีละหนึ่ง แต่ทุกวันนี้เริ่มเอาวันที่ เข้ามาแทนที่ด้วยรูปแบบ yyyymmdd ครับ ซีเรียลนัมเบอร์เอาไว้แจ้งเตือน slave zone ให้ี update ตัวเองครับ หากว่าล้าสมัยเกินไป
        IN      A      192.168.0.1
บรรทัดนี้หมายความว่ากำหนด IP ให้กับโดเมนเริ่มต้นในที่นี้คือ aon-nok.com.
ส่วนอื่น ๆ ผมก็ได้ comment ไว้ใน zone file แล้ว
10. หลังจากปรับแต่งแล้ว เราก็จะเพิ่ม named_enable="YES" ด้วยคำสั่ง
#echo 'named_enable="YES"' >> /etc/rc.conf

คำสั่งนี้ พี่มะขามบอกมา หมายความว่า ข้อความใน ' ' จะถูกนำไปต่อท้ายไฟล์ /etc/rc.conf ครับ หลังจากนั้นก็มาลอง Start Name Server กัน ด้วยคำสั่ง

#/etc/rc.d/named forcestart

ถ้าไม่มีอะไรผิดพลาด เราก็จะได้ name server กันแล้ว
ต้องออกตัวไว้ก่อนนะครับว่า การ config server ทำได้ง่าย ๆ แค่ดู error แล้วก็แก้ไขไปตามข้อความ error แต่การที่จะเขียนออกมาเป็น บทความให้ได้อ่านกัน ก็ต้อง อ้างอิง รวมทั้งค้นหาข้อมูลกันพอสมควร เพราะบางอย่างเราเข้าใจในสมองเอง แต่ แปลมาเป็นคำพูดไม่ได้

10. อ้างอิง
FreeBSD HandBook - Domain Name Server (DNS)
Wikipedia - Time to live

ไม่มีความคิดเห็น: