in How-to

ติดตั้ง DNS Server พร้อม Master & Slave อย่างรวดเร็ว

ช่วงนี้เขียน How to บ่อยมากเนื่องจากซ้อมมือ Linux Server กลัวว่าสนิมจะขึ้นเพราะไม่ได้จับนานมากแล้ว 4 ปี เห็นจะได้ ตอนนี้มีเวลาว่างเลยได้ทดลองโน่น ทดลองนี่ ในครั้งนี้ก็จะมาว่ากันด้วยเรื่อง DNS Server ครับ DNS Server ถือเป็นแหล่งอ้างอิง Domain Name เพื่อทำหน้าที่แปลง URL ไปเป็น IP Address ซึ่งหน้าที่หลักของ DNS ก็ประมาณนี้ จริงๆ แล้วถ้าคนเราจำ IP Address ได้ทุกเว็บก็คงจะพิลึกไม่น้อย ;P เอ่อ เขาใช้ Domain กันน่ะครับ ทีนี้การประกาศ Domain Name ต้องอาศัย DNS Server เป็นตัวประกาศว่า Domain นี้ใช้ Name Server อะไร มี sub-domain อะไรบ้าง IP Address อะไร เป็นต้น ถ้าอ่านแล้วยังงงๆ ให้ท่านไปหาอ่านเอาเองที่ http://en.wikipedia.org/wiki/Domain_Name_Server ครับ

ในครั้งนี้จะ มาแนะนำการตั้ง DNS Server แบบเร็วๆ โดยมี 2 เครื่อง คือ master และ slave โดยเครื่อง slave จะทำหน้าที่อัพเดทข้อมูลจาก master อัตโนมัติ (replication) มาเริ่มกันเลย ในตัวอย่างนี้เราจะตั้ง DNS Server เพื่อใช้กับ Domain ชื่อ EXAMPLE.COM (จำง่ายดีครับ) โดยจะมีข้อมูลดังนี้ (ของผมเองนะ เปลี่ยน IP ไปตามที่คุณต้องการ)

Server 1 : ns1.example.com
IP Address : 172.16.19.226
Netmask : 255.255.0.0
Gateway : 172.16.16.1

Server 2 : ns2.example.com
IP Address : 172.16.19.73
Netmask : 255.255.0.0
Gateway : 172.16.16.1

ให้ ติดตั้ง Ubuntu Server ทั้ง 2 เครื่อง เลือกติดตั้ง DNS Server ทั้ง 2 เครื่องครับ ;) เมื่อติดตั้งเสร็จแล้วให้ config IP Address ให้ถูกต้อง

เครื่อง Server 1 (Master)

เพิ่ม Zone ลงในไฟล์ /etc/bind/named.conf.local ดังนี้

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allow-transfer { 172.16.19.73/32; };
};

จาก config ข้างต้น ระบุ Zone เป็น example.com เป็น DNS master มีข้อมูล Zone ในไฟล์ /etc/bind/db.example.com และส่งข้อมูลการอัพเดทไปยังเครื่อง Server 2 ที่มี IP Address เป็น 172.16.19.73 สร้าง Zone File ชื่อ db.example.com มีข้อมูลดังนี้

;
; BIND data file for local loopback interface
;
$TTL    604800
@    IN    SOA    ns1.example.com. admin@example.com. (
                     4        ; Serial
             604800        ; Refresh
               86400        ; Retry
            2419200        ; Expire
             604800 )    ; Negative Cache TTL
;
@    IN    NS    ns1.example.com.
@    IN    NS    ns2.example.com.
@    IN    A    172.16.19.226
@    IN    AAAA    ::1

ns1    IN    A    172.16.19.226
ns2    IN    A    172.16.19.73

สั่ง restart service ของ bind แล้วทดสอบ dig ดูว่าได้ข้อมูลถูกต้องหรือไม่ หากว่าได้ข้อมูลถูกต้องแล้ว มาต่อกันที่เครื่องที่ 2 ครับ

เครื่อง Server 2 (Slave)

เพิ่ม Zone ลงในไฟล์ /etc/bind/named.conf.local ดังนี้

zone "example.com" {
    type slave;
    file "/etc/bind/db.example.com";
    masters { 172.16.19.226; };
};

จาก config ข้างต้น ระบุ Zone เป็น example.com เป็น DNS Slave มีข้อมูล Zone ในไฟล์ /etc/bind/db.example.com รับข้อมูลจาก DNS masters ที่มี IP Address เป็น 172.16.19.226 จากนั้นให้สร้างไฟล์เปล่าๆ ชื่อ db.example.com ขึ้นมาครับ จากนั้น chown ไดเรคทอรี /etc/bind ทั้งหมดโดยใช้ชื่อผู้ใช้ว่า bind

sudo chown bind -R /etc/bind

จากนั้นแก้ไขไฟล์ /etc/apparmor.d/usr.sbin.named ให้เพิ่ม กฏของ Apparmor ลงไปดังนี้

/etc/bind/** rw,
/etc/bind/ rw,

* หากเก็บ Zone ไฟล์ไว้ที่ /var/cache/named ไม่ต้องแก้ไขคอนฟิกของ Appamor ครับ ในกรณีนี้เราแหกคอกเล็กน้อย :P จากนั้นก็สั่ง restart bind ได้เลย ให้สังเกต log ใน /var/log/syslog จะพบว่ามีการ sync zone example.com เข้ามา สังเกตดูในไฟล์ db.example.com ตอนนี้จะพบว่ามีข้อมูลเรียบร้อยแล้ว ในกรณีที่มีการอัพเดทใน NS1 ใน NS2 ก็จะมีการอัพเดทด้วย :)