ลองติดตั้ง 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 ใหม่ จึงไม่มีปัญหาเรื่องความปลอดภัยมาเกี่ยว)

อ้างอิง

Comments

 

คือลองทำตามแล้วอ่ะค่ะ แต่ว่าอัพเดทไม่ได้
มันขึ้นแบบนี้อ่ะค่ะ Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: SERVFAIL, id:  14917
;; flags: qr ra ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; TSIG PSEUDOSECTION:
ns1.mylinux.lan.    0    ANY    TSIG    hmac-md5.sig-alg.reg.int. 1213297730 300 16 c9GHZXq/iO6qzONdRYddzg== 14917 NOERROR 0
แก้ไขยังงัยอ่ะค่ะ
นี่ใช้เครื่องดัวเองอัพเดทใช้มั้ยค่ะ คือ configure เครื่องตัวเองเป็น Server แล้วก้อให้อัพเดทอ่ะค่ะ แต่ไม่ได้

ถามอีกอย่างค่ะ ip ที่เปลี่ยนอ่ะค่ะ เปลี่ยนเป็นอะไรก้อได้รึป่าวค่ะ เช่น private ip อ่ะค่ะ


 

ถ้าขึ้นว่า SERVFAIL แสดงว่ายังไม่ผ่านครับ
เรื่องนี้ผมทดลองแค่สองครั้ง แล้วก็บรรจุประจำการเลย จึงอาจไม่ชำนาญ และมันนานมากแล้วด้วยครับ

เท่าที่จำได้ ส่วนใหญ่จะผิดพลาดตรงขั้นตอนอัปเดตเวลาครับ

ยังมีอีกตัวอย่างนึงที่ผมใช้งานจริงตอนนี้ คือ all-in-one 4 (bind9 - internal/external+dynamic update) แต่อาจจะซับซ้อนหน่อย

นี่ใช้เครื่องดัวเองอัพเดทใช้มั้ยค่ะ คือ configure เครื่องตัวเองเป็น Server แล้วก้อให้อัพเดทอ่ะค่ะ แต่ไม่ได้

ใช่ครับ ใช้เครื่องตัวเองในการอัปเดต

ถามอีกอย่างค่ะ ip ที่เปลี่ยนอ่ะค่ะ เปลี่ยนเป็นอะไรก้อได้รึป่าวค่ะ เช่น private ip อ่ะค่ะ

จำได้ว่า เปลี่ยนเป็นอะไรก็ได้ครับ

 

ถ้าจะอัพเดท IPv6 นี่ต้องใช้
update add server1.example.com. 60 IN AAAA 2002:db:2111
แบบนี้รึป่าวค่ะ
พอดีทำแล้ว มันไม่ได้อ่ะค่ะ งงค่ะ -_-"

 

ลองทำความเข้าใจเรื่อง IPv6 ได้ที่ nectec: ทำไมหมายเลข IPv6 address จึงมีความยาวแตกต่างกัน นะครับ

ผมยังไม่เคยใช้งาน IPv6 เลย จึงไม่สามารถลองทดสอบให้ได้ แต่เดาว่าการอัปเดตน่าจะใช้รูปแบบมาตรฐานครับ
ดังนั้นถ้าเขียนว่า 2002:db::2111 จะหมายถึง

2002:00db:0000:0000:0000:0000:0000:2111

และถ้าเขียนว่า 2002::db:2111 จะหมายถึง

2002:0000:0000:0000:0000:0000:00db:2111
 

Syndicate

Subscribe to Syndicate

Who's online

There are currently 0 users online.