[Linux] Setup bind9 làm DNS server và name server trên Ubuntu server 12.04 toàn tập

BIND hay là named, là phần mềm DNS được sử dụng rộng rãi nhất trên Internet. Ban đầu được viết bởi bốn sinh viên Nhóm nghiên cứu tốt nghiệp tại Đại học California, Berkeley (UCB), tên bắt nguồn như một từ viết tắt từ Berkeley Internet Name Domain, phản ánh sử dụng ứng dụng của UCB. BIND lần đầu tiên được phát hành với Berkeley Software Distribution. Paul Vixie bắt đầu duy trì nó trong năm 1988 trong khi làm việc cho Tổng công ty Thiết bị kỹ thuật số. Năm 2012, Internet Systems Consortium duy trì, cập nhật, và viết phiên bản mới của BIND. Phiên bản mới nhất của BIND, BIND 10 1.1.0 được phát hành vào ngày 6 tháng 6 2013, nhưng vẫn không hỗ trợ trên Windows, mặc dù BIND 9 có hỗ trợ Windows đầy đủ.
Bài viết này hướng dẫn cài đặt bind9 trên Ubuntu 12.04 làm DNS server và nameserver để quản lý các record cho public domain, phân giải record cho client theo phân vùng địa lý.
1. Cấu hình BIND9
a. Cấu hình trên server master
B1. Cài đặt gói Bind9:
sudo apt-get install bind9
Tất cả các file thiết lập của bind9 được lưu trữ tại thư mục /etc/bind/
Chúng ta có thể cấu hình trực tiếp trên file named.conf, tuy nhiên để dễ quản lý và hình dung, chúng ta sẽ cấu hình cụ thể trên từng file sau:
B2. Khai báo tên zone thuận, tên zone nghịch cùng với đường dẫn file thiết lập.
Chỉnh sửa file /etc/bind/named.conf.options
directory "/etc/bind";
Nội dung file /etc/bind/named.conf.local
zone "chungkol.com" {
        type master;
        file "/etc/bind/zones/chungkol.com.db";
        };
zone "129.255.222.in-addr.arpa" {
     type master;
     file "/etc/bind/zones/rev.129.255.222.in-addr.arpa";
  allow-transfer { 222.255.129.231; };
  also-notify { 222.255.129.231; };
};
B3. Khai báo forwarders - dns server mà bind9 sẽ chuyển truy vấn khi trong database của nó không có tên miền đang lookup.
Nội dung file /etc/bind/named.conf.options
forwarders {
      8.8.8.8;
};
B4. Thiết đặt các record cho zone
Nội dung file: /etc/bind/zones/qgssg.db
chungkol.com.     IN      SOA     ns1.chungkol.com. admin.chungkol.com. (
                1 ; serial
                7200 ; refresh
                1800 ; retry
                1209600 ; exprise
                300 ; minimum
 )
chungkol.com.      IN      NS      ns1.chungkol.com.
chungkol.com.      IN      NS      ns2.chungkol.com.
ns1              IN      A       113.160.226.202
ns2              IN      A       113.160.226.203
@                IN      A       222.255.129.232
Nội dung file: /etc/bind/zones/rev.202.226.113.in-addr.arpa
$TTL 3D
@       IN      SOA     ns1.chungkol.com. admin.chungkol.com. (
                1 ; serial
                7200 ; refresh
                1800 ; retry
                1209600 ; exprise
                300 ; minimum
)
230     IN      NS      ns1.chungkol.com.
231     IN      PTR     gw.mydomain.com.
1       IN      PTR     gw1.mydomain.com.
b. Cấu hình trên server slave
B1. Nội dung file /etc/bind/named.conf.local
IP của server master là 222.255.129.230
zone "chungkol.com" {
        type slave;
        file "/etc/bind/zones/qgs.db";
        masters { 222.255.129.230; };
};
B2. Tạo folder chứa các zones và phân quyền:
sudo mkdir /etc/bind/zones/
sudo chown bind. /etc/bind/zones
Sửa file /etc/apparmor.d/usr.sbin.named
Thêm dòng:
/etc/bind/zones/** rw,
Restart apparmor, bind9
sudo /etc/init.d/apparmor restart
sudo /etc/init.d/bind9 reload
sudo rndc reload 
B3. Kiểm tra
Bây giờ trong thư mục /etc/bind/zones sẽ xuất hiện file qgs.db sync từ server master qua.
Xem log:
tail -f /var/log/syslog
Lưu ý: 
+ Các record ở master sẽ được tự động cập nhật qua slave nếu giá trị serial của master lớn hơn giá trị serial của slave, khuyến nghị tăng giá trị serial mỗi khi có cập nhật record trên master.
+ Cần lưu ý NAT port UDP/53 và TCP/53 cho server sử dụng BIND9.

2. Sử dụng BIND9 để làm name server
Với những tổ chức lớn và có nhiều domain thì việc quy về quản lý tại một chỗ là việc cần thiết và nên làm. Document này sẽ hướng dẫn xây dựng 2 DNS server đóng vai trò là name server (ns1.chungkol.com - master server - IP: 222.255.129.230 và ns2.chungkol.com - slaver server - IP: 222.255.129.231) sử dụng để quản lý trực tiếp các record của tất cả các domain trong công ty. Có thể đọc đến đây bạn sẽ thắc mắc server ns1.chungkol.com quản lý các record cho domain chungkol.com (và các domain khác của công ty như myqgs.com, qgs.sg, chungkol.com...), vậy ai sẽ quản lý A record để trỏ ns1.chungkol.com về IP 222.255.129.230, để thực hiện được việc này, thuật ngữ chuyên môn gọi nó là Child Name Server, một số control panel có sẵn Child Nameserver, hoặc nếu không, bạn cần liên hệ với nhà cung cấp dịch vụ tên miền của bạn để đăng ký 2 name server ở trên, dịch vụ có thể tính phí hoặc không tính phí tùy thuộc vào từng nhà cung cấp khác nhau.
Sau khi đã tiến hành setup 2 server như mục 1 và đăng ký với nhà cung cấp dịch vụ tên miền 2 name server (ns1.chungkol.com và ns2.chungkol.com), bạn chỉ việc trỏ các name server trong domain control panel về ns1.chungkol.com và ns2.chungkol.com là được.

Đợi vài phút để các thiết lập có hiệu lực là bạn có thể trực tiếp thêm, xóa record của các domain trực tiếp trên chính server của mình.
Để các thao tác cập nhật record trên bind9 được dễ dàng hơn, chúng ta cần cài đặt một control panel phục vự cho việc cập nhật record bind9 bằng webpage. Có rất nhiều control panel hỗ trợ điều này, đề xuất sử dụng module bind webmin.

3. Các thiết lập bảo mật DNS server
- Ẩn version BIND9:
Thêm dòng sau vào file /etc/bind/named.conf.options
 version "Not available";
Kiểm tra
dig @ns1.qgs-os.com chaos txt version.bind
Hiển thị:
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51298
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;version.bind.                  CH      TXT
;; ANSWER SECTION:
version.bind.           0       CH      TXT     "Not available"
;; AUTHORITY SECTION:
version.bind.           0       CH      NS      version.bind.
;; Query time: 23 msec
;; SERVER: 113.160.226.202#53(113.160.226.202)
;; WHEN: Tue Sep 24 16:04:12 2013
;; MSG SIZE  rcvd: 74

4. Kết hợp Bind9 và GeoIP để phân giải IP dựa vào vùng địa lý
Mục tiêu:
- Các client từng vị trí địa lý khác nhau query tới name server này sẽ trả về các kết quả tương ứng sau:
+ Client ở Mỹ trả về A record là 1.1.1.1
+ Client ở Việt Nam trả về A record là 1.1.1.3
+ Client ở các vị trí khác trả về A record là 1.1.1.10
Trong bài này sử dụng 3 file geo_db.conf, geo_acl.conf và do_acl.pl (file đính kèm [1])
Trong đó file do_acl.pl là script chuyển định dạng của file geo_db.conf thành định dạng access list geo_acl.conf. Trong một số trường hợp, file nguồn geo_db.conf có thể sẽ phải cập nhật lại các IP mới, do đó cần phải sinh mới một file do_acl.pl từ file geo_db.conf bằng lệnh sau:
sudo ./do_acl.pl geo_db.conf > geo_acl.conf
Thực hiện:
B1. Copy file geo_acl.conf vào thư mục /etc/bind.
B2. Chỉnh sửa file /etc/bind/named.conf như sau:
bỏ dòng:
include "/etc/bind/named.conf.default-zones";
thêm dòng:
include "/etc/bind/geo_acl.conf";

B3. Nội dung file /etc/bind/named.conf.local (đây sẽ là file lưu trữ các zone trong bind9)
view "US" {
        match-clients {us; };
        zone "chungkol.com" {
                type master;
                file "/etc/bind/zones/dns-us.db";
        };
};
view "VN" {
        match-clients {vn; };
        zone "chungkol.com" {
                type master;
                file "/etc/bind/zones/dns-vn.db";
        };
};
view "ANY" {
        match-clients { any; };
        zone "chungkol.com" {
                type master;
                file "/etc/bind/zones/dns-any.db";
        };
};
Lưu ý:
- Phần bôi đỏ tương ứng với tên của access-list trong file geo_acl.conf
- Phần bôi xanh là tên tùy chọn để đặt cho view của zone.

B4. Tạo file tương ứng với từng zone trong folder /etc/bind/zones
Ví dụ nội dung file dns-vn.db
chungkol.com.          IN      SOA     ns1.chungkol.com. admin.chungkol.com. (
                1 ; serial
                7200 ; refresh
                1800 ; retry
                1209600 ; exprise
                300 ; minimum
 )
chungkol.com.          IN      NS      ns1.chungkol.com.
chungkol.com.          IN      NS      ns2.chungkol.com.
ns1              IN      A       113.160.226.202
ns2              IN      A       113.160.226.203
@                IN      A       1.1.1.3
Lưu ý quan trọng:
1. Nếu bạn có 2 name-server master và slaver, bạn cần phải kích hoạt ICMP trên 2 máy chủ đó.
2. Giả sử client đang sử dụng DNS là 8.8.8.8 thay vì sử dụng DNS của ISP tại nước đó, query tới domain chungkol.com qua 4 bước sau:
- B1. Client request tới 8.8.8.8, server 8.8.8.8 kiểm tra xem A record domain chungkol.com, nếu chưa có chuyển sang B2.
- B2. Server 8.8.8.8 request tới name server được khai báo trong domain chungkol.com (trường hợp này là 113.160.226.202 - server chúng ta đang setup)
- B3. Server DNS do chúng ta setup nhận request từ IP 74.x.x.x (IP của google, range ở Mỹ) và trả A record 1.1.1.1 về cho server 8.8.8.8.
- B4. Server 8.8.8.8 trả A record  1.1.1.1 cho domain chungkol.com về cho customer.
IP query trực tiếp tới DNS server của QGS là IP của Google DNS (DNS mà customer đang sử dụng) chứ không phải là IP của customer. Do đó query sẽ luôn trả về là 1.1.1.1 dù customer ở bất cứ vị trí địa lý nào.