[Article] Thiết lập DNS server với DJBDNS trên nền FreeBSD |
21/12/2009 23:53:10 (+0700) | #1 | 201556 |
facialz
Elite Member
|
0 |
|
|
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
|
|
THIẾT LẬP DNS SERVER
với DJBDNS trên nền FreeBSD
1 Vì sao, khi nào dùng DJBDNS
Gói djbdns, gói phần mềm DNS server nổi tiếng của Daniel J. Bernstein, có nhiều ưu điểm:
- Nhanh: trong một benchmark [6], djbdns mất bình quân 327 ms để giải xong một tên miền, trong khi BIND mất 5179 ms.
- Gọn: djbdns chỉ có 7000 lệnh, BIND có 100000 [6, 8].
- Yêu cầu thấp: djbdns chỉ chiếm dụng khoảng 2 MB khi mới khởi động và khoảng 10 MB sau nửa triệu truy vấn, trong khi ở BIND con số tương ứng lần lượt là 30 MB và 57 MB [6].
- Bảo mật cao: trong suốt lịch sử 19 năm của mình (1991 – 2009) djbdns chỉ có 2 lỗi đã được phát hiện. Còn BIND chỉ trong 19 năm (1983 – 2002) đã có 672 lỗi [9].
- Thông dụng: theo một thống kê tháng 11/2008, Internet có 78,1 triệu tên miền .com, trong đó ít nhất 4,6 triệu được đặt trên các máy chủ sử dụng djbdns. Với số lượng đó, djbdns đứng thứ tư về độ thông dụng, chỉ sau BIND (20,6 triệu), MyDNS (17,8 triệu), và PowerDNS (6,6 triệu) [7].
Với các ưu điểm đó, djbdns có thể dùng được trong mọi trường hợp, và đặc biệt thích hợp trong trường hợp phần cứng thấp và tải lớn.
2 Cấu hình tổng thể
Gói phần mềm djbdns có vài chương trình, trong đó chúng ta sẽ cài đặt hai chương trình chính: tinydns và dnscache. Tinydns là chương trình chuyên dùng để làm DNS server có thẩm quyền (authoritative), nghĩa là có nhiệm vụ công bố các địa chỉ Internet của miền nào đó mà chúng ta sở hữu, ví dụ, mycompany.com.Dnscache là chương trình chuyên dùng để làm DNS cache, nghĩa là có nhiệm vụ tìm hộ địa chỉ Internet của mọi miền, kể cả mycompany.com.
Hai chương trình này sẽ được cài đặt lên cùng một máy tính có 1 NIC, mà chúng ta sẽ gọi là máy chủ DNS, và sẽ được cấu hình cùng lắng nghe trên cổng 53 nhưng phải là trên các interface khác nhau (nói chính xác hơn, trên các địa chỉ IP khác nhau). Chương trình dnscache sẽ được cấu hình lắng nghe trên interface chính (ví dụ, 192.168.12.10) và chỉ phục vụ các client cục bộ (ví dụ, 192.168.0.0/16 và 10.0.0.0/24). Chương trình tinydns sẽ được cấu hình lắng nghe trên loopback interface (ví dụ, 127.0.0.1).
Mọi DNS client cục bộ, kể cả resolver (DNS client của chính bản thân máy chủ DNS), sẽ được cấu hình để truy vấn địa chỉ Internet ở interface chính. Tại đó, dnscache sẽ tìm kiếm câu trả lời trong cache và nếu không tìm thấy, sẽ lần lượt truy vấn theo dây chuyền bắt đầu từ các DNS server có thẩm quyền giải tên miền gốc (root) lần đến tận DNS server có thẩm quyền giải tên miền cần hỏi để có câu trả lời cuối cùng.
Có một ngoại lệ mà chúng ta sẽ thực hiện là nếu tên miền cần tìm thuộc mycompany.com hoặc nếu địa chỉ IP cần giải (ngược) là địa chỉ IP mạng cục bộ (ví dụ, 192.168.18.10), dnscache sẽ không lần theo dây chuyền các DNS server có thẩm quyền mà sẽ lập tức chuyển truy vấn sang loopback interface (127.0.0.1) cho tinydns giải đáp ngay. Ngoại lệ như thế là không cần thiết nếu như tinydns của chúng ta đã được uỷ quyền (delegated) của nhà đăng ký DNS cho phép quản lý miền mycompany.com. Nhưng thực tế do hợp đồng với nhà đăng ký, chúng ta không được uỷ quyền quản lý miền mycompany.com. Tinydns của chúng ta không tồn tại trong cơ sở dữ liệu của nhà đăng ký và do đó, chính thức mà nói thì nó không phải là DNS server có thẩm quyền giải tên mycompany.com cho bất kỳ DNS client nào. Muốn tinydns có thể phục vụ được thì phải làm ra ngoại lệ. Cũng vì lý do đó, tinydns chỉ phục vụ riêng cho những client trong mạng cục bộ chứ không thể phục vụ công chúng được. Ngoại lệ trên đây là duy nhất. Ta sẽ không cấu hình dnscache dùng bất cứ DNS forwarder nào khác, dù là server của ISP hay là server có uy tín như OpenDNS,...
Do tính năng đã được lập trình sẵn, dnscache sẽ lưu lại mọi câu trả lời trong cache để phục vụ cho những truy vấn về sau và để bảo mật, cache này chỉ nằm trong RAM và sẽ bị xoá khi khởi động. Tuy vậy, trong trường hợp (hết sức đặc biệt) nào đó ta vẫn có thể cho dnscache lưu cache ra đĩa cứng bằng miếng vá tính năng PERSISTENT CACHE.
Bài này ghi chép quy trình cài đặt và cấu hình djbdns v.1.05 trên hệ điều hành FreeBSD v.8. Các lý giải sâu về cấu hình tổng thể, các giải thích chi tiết từng bước của quá trình cài đặt, hay các phương pháp kiểm tra và giải quyết trục trặc có thể tìm thấy ở trong những nguồn trực tuyến, rất đầy đủ và phong phú, kể cả bằng tiếng Việt (xem danh mục tài liệu tham khảo).
3 Cài đặt và cấu hình chi tiết
3.1. Cài đặt, tạo môi trường
1. Cập nhật port collection.
Code:
2. Biên dịch và cài đặt gói hỗ trợ ucspi-tcp.
Code:
cd /usr/ports/sysutils/ucspi-tcp/; make install clean
3. Biên dịch và cài đặt gói hỗ trợ daemontools.
Code:
cd /usr/ports/sysutils/daemontools/; make install clean
4. Biên dịch và cài đặt djbdns.
Code:
cd /usr/ports/dns/djbdns
make install clean
Chú ý, khi make config, có thể chọn một số miếng vá bổ sung tính năng cần thiết. Chẳng hạn như PERSISTENT NMAP, SRV RECORD (hỗ trợ SRV record), PERSISTENT CACHE (hỗ trợ DNS cache trên ổ cứng), IPV6 (hỗ trợ giao thức IP v.6), v.v... mà chúng ta có thể chọn thêm, nếu cần. Bài này hướng dẫn này thực hiện với cấu hình mặc định, không có miếng vá thêm nào.
5. Cấu hình svscan – bộ quản lý service trong gói phụ trợ daemontools.
Code:
mkdir /var/service
fetch -o /usr/local/etc/rc.d/services.sh \
http://www.tnpi.biz/internet/mail/toaster/start/services.txt
chmod 755 /usr/local/etc/rc.d/services.sh
ln -s /usr/local/etc/rc.d/services.sh /usr/local/sbin/services
rehash
6. Khởi động các dịch vụ. Chú ý hiện thời ta chưa cài đặt dịch vụ nào. Lệnh “khởi động” này thuần túy chỉ để kiểm tra rằng svscan đã thực sự hoạt động được. Sau khi kiểm tra ta lại tắt các dịch vụ. Nếu gặp trục trặc với svscan thì giải quyết trục trặc trước khi đi tiếp.
Code:
services start
ps -aux | grep sv
services stop
7. Các service sẽ sử dụng ba account khác nhau, mà ta sẽ đặt tên là dnscache, tinydns, dnslog. (Không nhất thiết phải đặt tên account như thế này mà có thể chọn những tên khác bất kỳ.) Mỗi account thuộc nhóm riêng của nó, với tên nhóm cùng tên với account. Hãy tạo ba nhóm này trước, bằng cách viết thêm trong file /etc/group ba dòng
Code:
dnscache:*:54:
tinydns:*:55:
dnslog:*:56:
rồi tạo ba account tương ứng bằng lệnh adduser.
Trong đó, 54, 55, 56 là các số hiệu GID và UID mà chúng ta chọn đặt cho các account và nhóm mới. Nếu các số này đã bị chiếm dụng thì chúng ta có thể dùng số khác bất kỳ.
9. Tạo thư mục làm việc cho djbdns.
Code:
3.2. Cấu hình dnscache
1. Cấu hình dnscache để nó dùng hai trong số ba account vừa tạo (dnscache và dnslog), làm việc trong thư mục con /var/dns/dnscache (mà nó sẽ tự tạo ra), và lắng nghe trên interface chính (192.168.12.10).
Code:
dnscache-conf dnscache dnslog /var/dns/dnscache 192.168.12.10
Chú ý. dnscache-conf là lệnh ngoại trú nằm trong /usr/local/bin. Nếu thư mục đó không nằm trong PATH thì hãy gõ lệnh trên đầy đủ đường dẫn.
2. Đưa dnscache vào danh mục service quản lý bởi svscan bằng cách tạo trong /var/service một soft link đến /var/dns/dnscache.
Code:
ln -s /var/dns/dnscache /var/service
3. Trong thư mục /var/dns/dnscache/root/ip đã có một file rỗng tên là 127.0.0.1. Ý nghĩa của file này là dnscache đã (mặc định) được phép phục vụ localhost (127.0.0.1). Để cho phép nó phục vụ các client thuộc mạng cục bộ, ví dụ, 192.168.0.0/16 và 10.0.0.0/24, ta cũng tạo ra các file rỗng tương tự như thế.
Code:
touch /var/dns/dnscache/root/ip/192.168
touch /var/dns/dnscache/root/ip/10.0.0
4. Cấu hình resolver (tức DNS client trên chính bản thân máy chủ DNS) để nó sử dụng dịch vụ của dnscache bằng cách viết lại file /etc/resolv.conf với nội dung mới như sau.
Code:
5. Khởi động dịch vụ bằng lệnh services start hoặc services restart. Kiểm tra khẳng định rằng dnscache đã hoạt động đúng, nghĩa là đã giải được các tên Internet ngoại trừ các tên mycompany.com và giải ngược được các địa chỉ IP Internet ngoại trừ các địa chỉ IP cục bộ bằng các lệnh như ping, host, dig,... hay các client chuyên dùng khác trong bộ djbdns như dnsip, dnsname,... chạy trên máy chủ DNS và trên mọi máy khác trong mạng cục bộ.
3.3. Cấu hình tinydns
1. Cấu hình tinydns để nó dùng hai trong ba account dịch vụ vừa tạo (tinydns và dnslog), làm việc trong thư mục con /var/dns/tinydns (mà nó sẽ tự tạo ra), và lắng nghe trên loopback interface (127.0.0.1).
Code:
tinydns-conf tinydns dnslog /var/dns/tinydns 127.0.0.1
Chú ý. Tương tự như ở đoạn trên, tinydns-conf là lệnh ngoại trú trong /usr/local/bin. Nếu thư mục ấy không nằm trong PATH thì hãy gõ lệnh trên có đường dẫn.
2. Đưa tinydns vào danh mục dịch vụ quản lý bởi svscan bằng cách tạo trong /var/service một softlink đến /var/dns/tinydns.
Code:
ln -s /var/dns/tinydns /var/service
3. Soạn thảo file dữ liệu chứa các địa chỉ DNS, có tên là /var/dns/tinydns/root/data. Ví dụ một file dữ liệu sẽ được trình bày trong đoạn tiếp theo.
Code:
cd /var/dns/tinydns/root
le data
Chú ý. FreeBSD v.8 được cài đặt mặc định với các trình biên tập vi và ee. Còn le là một trong số hàng trăm trình biên tập khác mà muốn dùng thì phải cài riêng.
4. Dịch file dữ liệu dạng văn bản nói trên thành một file cơ sở dữ liệu dạng nhị phân có tên là data.cdb cất trong cùng thư mục.
Code:
5. Khởi động dịch vụ bằng lệnh services restart. Kiểm tra khẳng định rằng tinydns đã hoạt động đúng, nghĩa là đã giải được các tên của mycompany.com và giải ngược được các địa chỉ IP tương ứng của miền này bằng một client chạy ngay trên máy chủ DNS.
3.4. Một file dữ liệu cho tinydns
Đây là file /var/dns/tinydns/root/data soạn thảo ở bước 3 trong thủ tục 3.3 nói trên. Thay vì viết ra các luật cú pháp dài dòng, ta đưa ra một ví dụ so sánh một BIND zone file với một file dữ liệu tương đương cho tinydns.
Nếu giả sử dùng BIND để thiết lập DNS server cho một vùng mycompany.com mà file dữ liệu /etc/namedb/mycompany.com.hosts có nội dung
Code:
$ttl 38400
mycompany.com. IN SOA ns1.mycompany.com. itdept.mycompany.com. (
1245253211
10800
3600
604800
38400 )
mycompany.com. IN NS ns1.mycompany.com.
mycompany.com. IN MX 10 mx1.mycompany.com.
ns1.mycompany.com. IN A 127.0.0.1
mx1.mycompany.com. IN A 192.168.12.16
dc1.mycompany.com. IN A 192.168.10.11
dc2.mycompany.com. IN A 192.168.10.12
...
web.mycompany.com. IN A 192.168.18.10
www.mycompany.com. IN CNAME web.mycompany.com
ntp.mycompany.com. IN CNAME mx1.mycompany.com
thì khi dùng tinydns để thiết lập DNS server có thẩm quyền cho miền này, file dữ liệu /var/dns/tinydns/root/data tương đương sẽ có nội dung sau đây.
Code:
.mycompany.com::ns1.mycompany.com:604800
.0.168.192.in-addr.arpa::ns1.mycompany.com:604800
.1.168.192.in-addr.arpa::ns1.mycompany.com:604800
...
.18.168.192.in-addr.arpa::ns1.mycompany.com:604800
@mycompany.com::mx1.mycompany.com:86400
=ns1.mycompany.com:127.0.0.1
=mx1.mycompany.com:192.168.12.16
=dc1.mycompany.com:192.168.10.11
=dc2.mycompany.com:192.168.10.12
...
=web.mycompany.com:192.168.18.10
+www.mycompany.com:192.168.18.10
+ntp.mycompany.com:192.168.12.16
Trong ví dụ trên, file dữ liệu của djbdns đã chứa cả danh sách các mạng mà tinydns có thẩm quyền giải ngược địa chỉ IP.
3.5. Cấu hình dnscache để chuyển truy vấn mycompany.com sang tinydns
1. Ta sẽ cấu hình dnscache để forward sang tinydns mọi truy vấn liên quan đến các miền mà tinydns phụ trách. Hãy xác định thư mục làm việc.
Code:
cd /var/dns/dnscache/root/servers
2. Để forward các truy vấn về tên, ta tạo ra trong thư mục này một file có tên là tên miền cần giải (mycompany.com) và có nội dung là địa chỉ IP của tinydns (127.0.0.1).
Code:
echo 127.0.0.1 > mycompany.com
3. Để forward các truy vấn về địa chỉ IP, ta tạo ra trong thư mục này các file có tên là tên miền cần giải ngược và có cùng nội dung như trên. Chú ý rằng mỗi tên file như thế tận cùng bằng dấu chấm.
Code:
echo 127.0.0.1 > 0.168.192.in-addr.arpa.
echo 127.0.0.1 > 1.168.192.in-addr.arpa.
...
echo 127.0.0.1 > 18.168.192.in-addr.arpa.
4. Khởi động các dịch vụ bằng lệnh services restart. Kiểm tra rằng cơ chế forward dnscache → tinydns đã hoạt động đúng, tức là đã giải được các tên của miền mycompany.com và giải ngược được các địa chỉ IP tương ứng của miền này cho tất cả các client trong mạng cục bộ.
4 Tài liệu tham khảo
[1] FreeBSD handbook: 29.6 Domain Name System (DNS)
[2] ISC: BIND 9 Administrator Reference Manual (9.3.2)
[3] Simerson M.: DJBDNS on FreeBSD HOW-TO
[4] Wagner G.: Installing djbdns on a FreeBSD server
[5] Hoàng Ngọc Diêu: Thay thế BIND với djbdns
[6] Steniger J.: BIND v DJBDNS: Comparison of Performance, Ease of Config and Security
[7] Bernstein D.J.: DJBDNS Blurbs
[8] Bernstein D.J.: DJBDNS Security
[9] Bernstein D.J.: BIND, the Buggy Internet Name Daemon |
|
|
|
|
|
|
|
Users currently in here |
1 Anonymous
|
|
Powered by JForum - Extended by HVAOnline
hvaonline.net | hvaforum.net | hvazone.net | hvanews.net | vnhacker.org
1999 - 2013 ©
v2012|0504|218|
|
|