ลองติดตั้ง 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 ใหม่ จึงไม่มีปัญหาเรื่องความปลอดภัยมาเกี่ยว)
อ้างอิง
- Printer-friendly version
- Log in or register to post comments
- 8715 reads
Comments
update ไม่ได้ค่ะ
คือลองทำตามแล้วอ่ะค่ะ แต่ว่าอัพเดทไม่ได้
มันขึ้นแบบนี้อ่ะค่ะ 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
ถ้าขึ้นว่า SERVFAIL แสดงว่ายังไม่ผ่านครับ
เรื่องนี้ผมทดลองแค่สองครั้ง แล้วก็บรรจุประจำการเลย จึงอาจไม่ชำนาญ และมันนานมากแล้วด้วยครับ
เท่าที่จำได้ ส่วนใหญ่จะผิดพลาดตรงขั้นตอนอัปเดตเวลาครับ
ยังมีอีกตัวอย่างนึงที่ผมใช้งานจริงตอนนี้ คือ all-in-one 4 (bind9 - internal/external+dynamic update) แต่อาจจะซับซ้อนหน่อย
ใช่ครับ ใช้เครื่องตัวเองในการอัปเดต
จำได้ว่า เปลี่ยนเป็นอะไรก็ได้ครับ
รบกวนอีกทีค่ะ
ถ้าจะอัพเดท IPv6 นี่ต้องใช้
update add server1.example.com. 60 IN AAAA 2002:db:2111
แบบนี้รึป่าวค่ะ
พอดีทำแล้ว มันไม่ได้อ่ะค่ะ งงค่ะ -_-"
ลองทำความเข้าใจเรื่อง IPv6
ลองทำความเข้าใจเรื่อง IPv6 ได้ที่ nectec: ทำไมหมายเลข IPv6 address จึงมีความยาวแตกต่างกัน นะครับ
ผมยังไม่เคยใช้งาน IPv6 เลย จึงไม่สามารถลองทดสอบให้ได้ แต่เดาว่าการอัปเดตน่าจะใช้รูปแบบมาตรฐานครับ
ดังนั้นถ้าเขียนว่า
2002:db::2111
จะหมายถึงและถ้าเขียนว่า
2002::db:2111
จะหมายถึง