ลองติดตั้ง dns แบบเปลี่ยนค่าได้

จะทดลองทำ DNS แบบยอมให้เปลี่ยนค่าไอพีได้

ขออนุญาตเริ่มใหม่ เพื่อให้บทความจบในตัว

เริ่มต้นด้วยการติดตั้ง bind9 ใหม่
# aptitude remove --purge bind9 dnsutils
# rm -rf /etc/bind
# aptitude install bind9 dnsutils

เนื่องจากต้องมีการเปลี่ยนค่าไอพีโดยใช้สิทธิ์ของผู้ใช้ชื่อ bind เราจึงควรสร้างไดเรกทอรีขึ้นมาเพื่อให้ผู้ใช้ bind มีสิทธิ์ในการเขียนไฟล์
# cd /etc/bind
# mkdir example.com
# chown bind:bind example.com
# cd example.com

สร้างกุญแจสำหรับใช้ในการอัปเดตค่าไอพี (โดยใช้อัลกอริธึม HMAC-MD5 ขนาด 512บิต ตั้งชื่อกุญแจว่า server1.example.com.)
# dnssec-keygen -a HMAC-MD5 -b 512 -n HOST server1.example.com.
ผลลัพธ์ของผมคือ

Kserver1.example.com.+157+49285

เราจะได้ไฟล์มาสองไฟล์ซึ่งมีลักษณะคือ K(ชื่อกุญแจ)+NNN+NNNNN โดยมีนามสกุลเป็น .key และ .private

ตามตัวอย่างได้เนื้อไฟล์ Kserver1.example.com.+157+49285.key เป็น

server1.example.com. IN KEY 512 3 157 wLuCYKvKDqM2XJsqcspdycoJgLNJKUKga4bHANjE7FY0HCujucYhDUKt FD5wgGXGPCNVsZi7NOYDgVZSIJ8LbA==

และเนื้อไฟล์ Kserver1.example.com.+157+49285.private เป็น

Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: wLuCYKvKDqM2XJsqcspdycoJgLNJKUKga4bHANjE7FY0HCujucYhDUKtFD5wgGXGPCNVsZi7NOYDgVZSIJ8LbA==

เราจะเอาค่า private key มาใช้ โดยสร้างไฟล์คอนฟิกขึ้นมา ตั้งชื่อว่า dnskeys.conf และนำเนื้อหาของกุญแจ private key มาใช้เป็นค่า secret
# vi dnskeys.conf

key server1.example.com. {
    algorithm hmac-md5;
    secret "wLuCYKvKDqM2XJsqcspdycoJgLNJKUKga4bHANjE7FY0HCujucYhDUKtFD5wgGXGPCNVsZi7NOYDgVZSIJ8LbA==";
};

เพิ่มไฟล์คอนฟิกของคีย์ลงใน named.conf.local
# vi ../named.conf.local

...
include "/etc/bind/example.com/dnskeys.conf";
...

งานต่อไปเป็นงานซ้ำของเก่าคือสร้างโซนไฟล์ และรีเวิร์สไฟล์ และคอนฟิกไฟล์ โดยปรับเปลี่ยนค่าคอนฟิกไฟล์ตรงคำสั่ง allow-update เท่านั้น

สร้างโซนไฟล์ชื่อ example.com.zone เหมือนเดิม
# vi example.com.zone

$TTL    86400
@          IN      SOA    server1.example.com.    root.server1.example.com. (
                          51              ; serial (d. adams)
                          3H              ; refresh after 3 hours
                          15M             ; retry after 15 minutes
                          1W              ; expire after 7 days
                          1D )            ; minimum TTL (Time To Live) of 1 days
@          IN      NS      ns1.example.com.    ; primary NS
@          IN      NS      ns2.example.com.    ; secondary NS

ns1        IN      CNAME  server1

; append or edit host ip here
server1  IN      A      192.168.1.1
ns2      IN      A      192.168.1.2
client1  IN      A      192.168.1.101
client2  IN      A      192.168.1.102
client3  IN      A      192.168.1.103

สร้างรีเวิร์สไฟล์ชื่อ example.com.reverse เหมือนเดิม
# vi example.com.reverse

$TTL    86400
@          IN      SOA    server1.example.com.    root.server1.example.com. (
                          51              ; serial (d. adams)
                          3H              ; refresh after 3 hours
                          15M             ; retry after 15 minutes
                          1W              ; expire after 7 days
                          1D )            ; minimum TTL (Time To Live) of 1 days
@          IN      NS      ns1.example.com.    ; primary NS
@          IN      NS      ns2.example.com.    ; secondary NS

; append or edit host name here
1        IN      PTR    server1.example.com.
2        IN      PTR    ns2.example.com.
101      IN      PTR    client1.example.com.
102      IN      PTR    client2.example.com.
103      IN      PTR    client3.example.com.

สร้างคอนฟิกไฟล์ชื่อ example.com.conf โดยกำหนดให้สามารถเปลี่ยนแปลงค่าไอพีได้ (allow-update)
# vi example.com.conf

zone "example.com" IN {
    type master;
    file "/etc/bind/example.com/example.com.zone";
    allow-update { key "server1.example.com."; };
};
zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "/etc/bind/example.com/example.com.reverse";
    allow-update { key "server1.example.com."; };
};

เพิ่มค่าคอนฟิกไฟล์ให้ระบบรับรู้ โดยเติมลงใน named.conf.local
# vi ../named.conf.local

...
include "/etc/bind/example.com/example.com.conf";

แก้ไขให้กรุ๊ป bind เขียนลงโซนไฟล์ รีเวิร์สไฟล์ และในไดเรกทอรี่นี้ได้ ทั้งนี้เพื่อประโยชน์ตอนอัปเดตค่าไอพี
# chmod g+w example.com.zone example.com.reverse
# chmod g+w ../example.com

เมื่อเสร็จเรียบร้อยแล้ว ก็สั่งเริ่ม bind9 ใหม่
# /etc/init.d/bind9 restart

ติดตั้ง ntpdate ซึ่งต้องใช้ตอนอัปเดตไอพี
# aptitude install ntpdate

จบการติดตั้งแค่นี้ครับ
ต่อไปเป็นการทดสอบการอัปเดตค่าไอพี
ก่อนอื่นต้องซิงก์เวลาก่อน ผมลองใช้เซิร์ฟเวอร์ที่ thaicert
# ntpdate -s -b clock.thaicert.nectec.or.th

อัปเดตโดยนำไฟล์ private key มาใช้
# nsupdate -k Kserver1.example.com.+157+49285.private -d
ทดลองเปลี่ยนค่า server1.example.com เป็น 192.168.1.4

server localhost
zone example.com.
update delete server1.example.com.
update add server1.example.com. 60 IN A 192.168.1.4
send
quit

ตัวอย่างหน้าจอภาพเครื่องทดสอบ

Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  11566
;; flags: ; ZONE: 1, PREREQ: 0, UPDATE: 2, ADDITIONAL: 1
;; ZONE SECTION:
;example.com.                   IN      SOA

;; UPDATE SECTION:
server1.example.com.    0       ANY     ANY
server1.example.com.    60      IN      A       192.168.1.4

;; TSIG PSEUDOSECTION:
server1.example.com.    0       ANY     TSIG    hmac-md5.sig-alg.reg.int. 1165632027 300 16 yjgvsLCdFobUj/p7lex21g== 11566 NOERROR 0


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  11566
;; flags: qr ra ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; TSIG PSEUDOSECTION:
server1.example.com.    0       ANY     TSIG    hmac-md5.sig-alg.reg.int. 1165632027 300 16 j9mG82rwthDTBJyCopHyUw== 11566 NOERROR 0

ตรงฟิลด์ status ต้องเป็น NOERROR การทำงานจึงจะสมบูรณ์ครับ

ทดลองค้นค่า server1.example.com
# nslookup server1.example.com localhost

Server:         localhost
Address:        127.0.0.1#53

Name:   server1.example.com
Address: 192.168.1.4

เรียบร้อยแล้วครับ

หมายเหตุ

  • ในระหว่างการทำงานอัปเตด โปรแกรมจะสร้างโซนไฟล์สำรองขึ้นมาในชื่อว่า example.com.zone.jnl
  • เมื่อสั่งเริ่ม bind9 ใหม่ จะพบว่าเนื้อหาของโซนไฟล์ถูกเปลี่ยนแปลงไปตามการอัปเดต
  • ส่วนการอัปเดตรีเวิร์สไฟล์ด้วย ยังทำไม่เป็นครับ :)
  • ใจจริง อยากปรับเปลี่ยนเนื้อโซนไฟล์กับรีเวิร์สไฟล์ ให้เอาเรื่อง ลูกเล่นของ BIND9 DNS Server! มารวมเสียทีเดียว แต่กลัวตัวเองงง เลยปล่อยไว้อย่างเดิม :)

หมายเหตุ 2
ข้อเขียนนี้เป็นเพียงการทดลองเท่านั้น แต่ใจสู้เขียน ด้วยค้นหาวิธีการแบบง่าย ๆ ไม่พบ (step by step) เลยต้องทดลองเอง และต้องการบันทึกผลการทดลองที่สามารถใช้งานได้แล้ว ดังนั้นจึงยังไม่ทราบผลข้างเคียงเรื่องความปลอดภัย และความถูกต้องตามระเบียบแบบแผนที่ควรเป็น
จึงต้องการขอคอมเมนต์และคำแนะนำเพื่อให้ได้รู้เรื่องกันในวงกว้างครับ
(ก่อนหน้านี้ เวลาต้องการอัปเดตเลขไอพี ผมใช้สคริปต์ในการสร้างโซนไฟล์ และรีเวิร์สไฟล์ขึ้นมาใหม่ แลัวจึงสั่งเริ่ม bind9 ใหม่ จึงไม่มีปัญหาเรื่องความปลอดภัยมาเกี่ยว)

อ้างอิง