Một phần quan trọng trong việc quản lý cấu hình máy chủ và hạ tầng là duy trì một cách đơn giản để tra cứu các giao diện mạng và địa chỉ IP bằng tên, thông qua việc thiết lập một Hệ thống Tên miền (DNS) phù hợp.
Việc sử dụng tên miền đầy đủ (FQDN – Fully Qualified Domain Names) thay vì địa chỉ IP để xác định địa chỉ mạng sẽ giúp đơn giản hóa cấu hình dịch vụ và ứng dụng, đồng thời nâng cao khả năng bảo trì các tệp cấu hình (configuration files). Thiết lập một hệ thống DNS riêng cho mạng nội bộ của bạn là cách tuyệt vời để cải thiện việc quản lý các máy chủ.
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách thiết lập một máy chủ DNS nội bộ sử dụng phần mềm máy chủ tên miền BIND (BIND9) trên hệ điều hành Ubuntu 18.04, từ đó cho phép các máy chủ của bạn phân giải tên máy nội bộ và địa chỉ IP riêng. Cách làm này cung cấp một phương thức tập trung để quản lý tên máy và IP nội bộ, một điều hữu ích khi hệ thống của bạn mở rộng lên nhiều máy chủ.
Yêu cầu chuẩn bị
Để hoàn thành hướng dẫn này, bạn cần chuẩn bị hạ tầng như sau (tất cả các máy chủ nên được tạo trong cùng một trung tâm dữ liệu với mạng riêng được kích hoạt):
- Một máy chủ Ubuntu 18.04 mới để đóng vai trò máy chủ DNS chính, gọi là
ns1
. - (Khuyến nghị) Một máy chủ Ubuntu 18.04 khác để làm máy chủ DNS phụ, gọi là
ns2
. - Một số máy chủ khác trong cùng trung tâm dữ liệu, sử dụng hệ thống DNS mà bạn thiết lập.
Trên mỗi máy chủ, bạn cần cấu hình quyền truy cập quản trị thông qua người dùng có quyền sudo và thiết lập firewall (tường lửa), theo hướng dẫn thiết lập máy chủ ban đầu cho Ubuntu 18.04.
Nếu bạn chưa quen với các khái niệm về DNS, nên đọc ít nhất 3 phần đầu tiên của loạt bài Giới thiệu về Quản lý DNS.
Hạ tầng Mẫu và Mục tiêu
Trong bài viết này, chúng ta sẽ giả định các điều kiện sau:
- Có hai máy chủ được chỉ định làm máy chủ DNS. Chúng ta gọi là
ns1
vàns2
. - Có hai máy chủ khách sẽ sử dụng hạ tầng DNS này, gọi là
host1
vàhost2
. Bạn có thể thêm bao nhiêu máy chủ tùy thích vào hệ thống. - Tất cả các máy chủ đều nằm trong cùng một trung tâm dữ liệu – ở đây giả sử là nyc3.
- Tất cả các máy chủ đều đã bật mạng riêng, nằm trong subnet 10.128.0.0/16 (bạn cần điều chỉnh tùy vào subnet cụ thể của hệ thống bạn).
- Các máy chủ thuộc một dự án gắn với tên miền example.com. Vì hệ thống DNS trong bài là nội bộ và riêng tư, bạn không cần mua tên miền thực. Tuy nhiên, nếu sử dụng tên miền bạn sở hữu, sẽ giúp tránh xung đột với tên miền công khai.
Với những giả định trên, chúng ta sẽ sử dụng hệ thống đặt tên xoay quanh nyc3.example.com. Đây là tên miền phụ mô phỏng subnet hoặc vùng DNS nội bộ. Ví dụ, tên miền đầy đủ (FQDN) của host1
sẽ là host1.nyc3.example.com
.
Dựa vào bảng sau để nắm rõ các chi tiết liên quan:
Máy chủ | Vai trò | FQDN nội bộ | Địa chỉ IP riêng |
---|---|---|---|
ns1 | Máy chủ DNS chính | ns1.nyc3.example.com |
10.128.10.11 |
ns2 | Máy chủ DNS phụ | ns2.nyc3.example.com |
10.128.20.12 |
host1 | Máy chủ khách 1 | host1.nyc3.example.com |
10.128.100.101 |
host2 | Máy chủ khách 2 | host2.nyc3.example.com |
10.128.200.102 |
Lưu ý:
Cấu hình thực tế của bạn có thể khác, nhưng trong hướng dẫn này, các tên máy và địa chỉ IP chỉ mang tính minh họa nhằm giúp bạn hiểu cách cấu hình một máy chủ DNS nội bộ hoạt động hiệu quả. Bạn hoàn toàn có thể điều chỉnh cấu hình này cho phù hợp với hệ thống của mình bằng cách thay thế tên máy và địa chỉ IP riêng bằng thông tin của bạn. Không bắt buộc phải sử dụng region (tên vùng) của datacenter (trung tâm dữ liệu) trong cách đặt tên, nhưng trong ví dụ này, chúng tôi sử dụng nó để biểu thị rằng các máy chủ thuộc về mạng nội bộ của một trung tâm dữ liệu cụ thể. Nếu bạn sử dụng nhiều datacenters (trung tâm dữ liệu), bạn có thể thiết lập DNS nội bộ riêng trong từng trung tâm.
Kết thúc hướng dẫn này, bạn sẽ có:
- Một máy chủ DNS chính:
ns1
- (Tuỳ ý) Một máy chủ DNS phụ:
ns2
, được dùng như một bản sao lưu khi máy chủ chính không khả dụng.
Bây giờ, chúng ta hãy bắt đầu cài đặt BIND trên cả hai máy chủ DNS chính và phụ ns1
và ns2
.
Cách cấu hình BIND làm máy chủ DNS nội bộ trên Ubuntu 18.04
Lưu ý:
Những đoạn văn bản được tô sáng như thế này là quan trọng! Chúng thường dùng để biểu thị nội dung bạn cần thay đổi theo cấu hình của mình, hoặc là phần cần thêm/chỉnh sửa trong tập tin cấu hình.
Ví dụ: nếu bạn thấy host1.nyc3.example.com
, hãy thay bằng FQDN của máy chủ của bạn. Nếu thấy host1_private_IP
, hãy thay bằng địa chỉ IP riêng tương ứng.
Cập nhật bộ nhớ đệm các gói APT
Trên cả hai máy chủ DNS ns1
và ns2
, hãy cập nhật danh sách gói bằng lệnh:
Sau đó, cài đặt BIND, sử dụng câu lệnh:
sudo apt-get install bind9 bind9utils bind9-doc
Cấu hình BIND chỉ sử dụng IPv4
Trước khi tiếp tục, chúng ta cần cấu hình BIND sử dụng chế độ IPv4 vì mạng riêng (private networking) của chúng ta chỉ dùng địa chỉ IPv4.
Chỉnh sửa cấu hình mặc định của BIND9
Trên cả hai máy chủ ns1
và ns2
, hãy mở file cấu hình mặc định của dịch vụ bind9
.
Ví dụ dưới đây sử dụng trình soạn thảo nano
:
sudo nano /etc/default/bind9
Hãy thêm -4
vào cuối tham số OPTIONS
trong file cấu hình. Câu lệnh sau khi chỉnh sửa sẽ trông như sau:
. . .
OPTIONS="-u bind -4"
Hãy lưu và đóng file sau khi bạn chỉnh sửa xong. Nếu bạn sử dụng nano, thao tác như sau:
- Nhấn
CTRL + X
để thoát. - Nhấn
Y
để xác nhận lưu thay đổi. - Nhấn
ENTER
để ghi đè lên file.
Khởi động lại BIND để áp dụng thay đổi:
sudo systemctl restart bind9
BIND đã được cài đặt thành công và chuyển sang chế độ IPv4.
Tiếp theo, chúng ta sẽ cấu hình máy chủ DNS chính (Primary DNS Server – ns1
).
Cấu hình Máy chủ DNS chính
BIND sử dụng nhiều file cấu hình, được liên kết từ file cấu hình chính là named.conf
. Tên các file thường bắt đầu bằng named
vì BIND vận hành dưới tiến trình có tên là named
(viết tắt của “name daemon”, trình nền tên miền).
Cấu hình file Options
Trên máy chủ ns1, mở file named.conf.options
để chỉnh sửa, chạy lệnh sau:
sudo nano /etc/bind/named.conf.options
Phía trên khối options
hiện có, hãy tạo một khối ACL (danh sách kiểm soát truy cập) mới có tên là trusted
. Đây sẽ là nơi chúng ta định nghĩa danh sách các máy khách được phép thực hiện truy vấn DNS đệ quy (tức là các máy chủ nằm trong cùng trung tâm dữ liệu với ns1
). Dựa trên các địa chỉ IP nội bộ ví dụ, chúng ta sẽ thêm ns1
, ns2
, host1
và host2
vào danh sách các máy khách đáng tin cậy này.
acl "trusted" {
10.128.10.11; # ns1 - can be set to localhost
10.128.20.12; # ns2
10.128.100.101; # host1
10.128.200.102; # host2
};
options {
. . .
Bây giờ khi chúng ta đã có danh sách các máy khách DNS đáng tin cậy, hãy tiến hành chỉnh sửa khối options
. Hiện tại, phần đầu của khối này trông như sau:
. . .
};
options {
directory "/var/cache/bind";
. . .
}
Bên dưới dòng directory
, hãy thêm các dòng cấu hình được đánh dấu (và thay thế bằng địa chỉ IP riêng của ns1
cho phù hợp), để phần này trông giống như sau
. . .
};
options {
directory "/var/cache/bind";
recursion yes; # enables resursive queries
allow-recursion { trusted; }; # allows recursive queries from "trusted" clients
listen-on { 10.128.10.11; }; # ns1 private IP address - listen on private network only
allow-transfer { none; }; # disable zone transfers by default
forwarders {
8.8.8.8;
8.8.4.4;
};
. . .
};
Khi hoàn tất, hãy lưu và đóng tệp named.conf.options
. Cấu hình trên chỉ định rằng chỉ các máy chủ nội bộ (những máy trong danh sách “trusted”) mới được phép truy vấn máy chủ DNS của bạn để tra cứu các tên miền bên ngoài.
Tiếp theo, chúng ta sẽ chỉ định các vùng DNS bằng cách cấu hình tệp named.conf.local
.
Cấu hình tệp Local
Trên máy chủ ns1
, mở tệp named.conf.local
để chỉnh sửa:
sudo nano /etc/bind/named.conf.local
Ngoài một vài dòng chú thích, tệp này thường là tệp trống. Tại đây, chúng ta sẽ chỉ định forward zone và reverse zone của mình. DNS zone xác định phạm vi cụ thể để quản lý và định nghĩa các bản ghi DNS.
Vì các tên miền ví dụ của chúng ta đều nằm trong tên miền con nyc3.example.com
, chúng ta sẽ sử dụng nó làm forward zone. Bởi vì các địa chỉ IP riêng của các máy chủ đều nằm trong dải 10.128.0.0/16
, chúng ta cũng sẽ thiết lập reverse zone để có thể thực hiện truy vấn ngược trong phạm vi đó.
Thêm forward zone bằng cách thêm các dòng sau, thay thế tên zone và địa chỉ IP riêng của máy chủ DNS phụ (ns2
) trong chỉ thị allow-transfer
:
zone "nyc3.example.com" {
type master;
file "/etc/bind/zones/db.nyc3.example.com"; # zone file path
allow-transfer { 10.128.20.12; }; # ns2 private IP address - secondary
};
Giả sử subnet riêng của chúng ta là 10.128.0.0/16
, hãy thêm reverse zone với các dòng sau (lưu ý tên zone bắt đầu bằng 128.10
, là phần đảo ngược của 10.128
):
. . .
};
zone "128.10.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.10.128"; # 10.128.0.0/16 subnet
allow-transfer { 10.128.20.12; }; # ns2 private IP address - secondary
};
Nếu các máy chủ của bạn nằm trên nhiều subnet riêng khác nhau nhưng vẫn trong cùng một trung tâm dữ liệu, hãy chắc chắn rằng bạn tạo thêm zone và tệp zone riêng cho mỗi subnet đó.
Khi bạn đã thêm xong tất cả các zone mong muốn, hãy lưu và đóng tệp named.conf.local
.
Giờ đây, khi các zone đã được khai báo trong BIND, chúng ta cần tạo các tệp forward và reverse zone tương ứng.
Tạo tệp Forward Zone
Tệp forward zone là nơi chúng ta định nghĩa các bản ghi DNS để thực hiện truy vấn thuận (forward DNS lookups). Nghĩa là, khi DNS nhận được một truy vấn tên, ví dụ như host1.nyc3.example.com
, nó sẽ tìm trong tệp forward zone để phân giải tên đó sang địa chỉ IP riêng tương ứng.
Hãy cùng tạo thư mục chứa các tệp zone. Theo cấu hình trong tệp named.conf.local
, các tệp zone sẽ nằm trong thư mục /etc/bind/zones
.
sudo mkdir /etc/bind/zones
Chúng ta sẽ tạo tệp forward zone dựa trên mẫu có sẵn. Sao chép tệp mẫu db.local
đến vị trí phù hợp, theo câu lệnh sau:
sudo cp /etc/bind/db.local /etc/bind/zones/db.nyc3.example.com
Giờ đây chúng ta sẽ chỉnh sửa tệp forward zone:
sudo nano /etc/bind/zones/db.nyc3.example.com
Ban đầu, tệp sẽ trông như sau:
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost. ; delete this line
@ IN A 127.0.0.1 ; delete this line
@ IN AAAA ::1 ; delete this line
Đầu tiên, chúng ta sẽ cập nhật bản ghi SOA. Thay localhost.
bằng ns1.nyc3.example.com.
rồi sau đó, thay root.localhost.
bằng admin.nyc3.example.com.
Mỗi lần bạn muốn chỉnh sửa một tệp zone, bạn cần phải tăng giá trị Serial từ 2
lên trước khi bắt đầu thực hiện. Ở đây, chúng ta sẽ tăng lên 3
.
Sau khi chỉnh sửa, phần SOA sẽ trông như sau:
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
. . .
Kế tiếp, xóa các bản ghi không cần thiết. Xóa ba dòng sau bản ghi SOA như đã đánh dấu trong phần hướng dẫn (các dòng có ghi delete this line
).
Ở cuối tệp, thêm các bản ghi name server bằng các dòng sau (hãy thay thế các tên bằng thông tin của bạn).
Lưu ý, cột thứ hai xác định đây là các bản ghi NS (name server).
. . .
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
Bây giờ, chúng ta sẽ thêm bản ghi A cho các máy chủ thuộc vùng này, gồm bất kỳ máy chủ nào có tên kết thúc bằng .nyc3.example.com
(hãy thay thế tên và địa chỉ IP riêng bằng thông tin của bạn).
Dựa trên ví dụ về tên và địa chỉ IP riêng, chúng ta sẽ thêm các bản ghi A cho ns1
, ns2
, host1
, host2
như sau:
. . .
; name servers - A records
ns1.nyc3.example.com. IN A 10.128.10.11
ns2.nyc3.example.com. IN A 10.128.20.12
; 10.128.0.0/16 - A records
host1.nyc3.example.com. IN A 10.128.100.101
host2.nyc3.example.com. IN A 10.128.200.102
Sau khi hoàn tất, lưu và đóng tệp db.nyc3.example.com
.
Tệp forward zone giờ đây đã sẵn sàng để BIND sử dụng cho việc phân giải tên miền trong mạng nội bộ, trông sẽ như sau:
$TTL 604800
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
; name servers - A records
ns1.nyc3.example.com. IN A 10.128.10.11
ns2.nyc3.example.com. IN A 10.128.20.12
; 10.128.0.0/16 - A records
host1.nyc3.example.com. IN A 10.128.100.101
host2.nyc3.example.com. IN A 10.128.200.102
Tiếp theo, chúng ta sẽ tạo tệp reverse zone.
Tạo tệp Reverse Zone
Tệp reverse zone là nơi chúng ta định nghĩa các bản ghi PTR để thực hiện tra cứu DNS ngược. Nói cách khác, khi DNS nhận được một truy vấn theo địa chỉ IP (ví dụ như 10.128.100.101
), nó sẽ tìm trong tệp reverse zone để phân giải thành tên miền đầy đủ tương ứng, chẳng hạn host1.nyc3.example.com
.
Trên ns1, đối với mỗi reverse zone đã được khai báo trong tập tin named.conf.local
, hãy tạo một tệp reverse zone. Chúng ta sẽ dựa vào mẫu tập tin db.127
để tạo các tập tin này. Sao chép nó đến đúng vị trí với lệnh sau (nhớ thay tên tệp đích sao cho khớp với tên reverse zone bạn đã khai báo):
sudo cp /etc/bind/db.127 /etc/bind/zones/db.10.128
Sau đó chỉnh sửa tệp reverse zone tương ứng:
sudo nano /etc/bind/zones/db.10.128
Ban đầu, tệp sẽ có nội dung như sau:
$TTL 604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost. ; delete this line
1.0.0 IN PTR localhost. ; delete this line
Tương tự như khi cấu hình tệp forward zone, bạn cần chỉnh sửa bản ghi SOA để thay localhost
thành ns1.nyc3.example.com.
và root.localhost.
thành admin.nyc3.example.com.
. Đừng quên tăng số Serial lên 3
. Tệp sẽ trông như sau:
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
. . .
Bây giờ hãy xóa hai bản ghi ở cuối tệp (sau bản ghi SOA). Nếu bạn không chắc nên xóa dòng nào, chúng đã được đánh dấu bằng chú thích delete this line
ở phía trên.
Sau đó, ở cuối tệp, hãy thêm các bản ghi NS bằng các dòng sau (thay thế tên bằng tên của bạn). Lưu ý, cột thứ hai xác định đây là các bản ghi NS:
. . .
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
Tiếp theo, thêm các bản ghi PTR cho tất cả các máy chủ có địa chỉ IP nằm trong dải subnet tương ứng với tập tin vùng mà bạn đang chỉnh sửa. Trong ví dụ của chúng ta, điều này bao gồm tất cả các máy chủ vì chúng đều nằm trong subnet 10.128.0.0/16
.
Lưu ý, cột đầu tiên là hai octet cuối của địa chỉ IP máy chủ, viết theo thứ tự đảo ngược. Hãy chắc chắn thay thế tên và địa chỉ IP phù hợp với máy chủ của bạn:
. . .
; PTR Records
11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102
Lưu và đóng tệp reverse zone (nếu bạn cần thêm các tệp reverse zone khác, hãy lặp lại phần này).
Tệp reverse zone mẫu hoàn chỉnh của chúng ta sẽ trông như sau:
$TTL 604800
@ IN SOA nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
; name servers
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
; PTR Records
11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102
Vậy là chúng ta đã hoàn tất chỉnh sửa các tệp, bước tiếp theo là kiểm tra xem các tệp cấu hình có lỗi cú pháp hay không.
Kiểm tra cú pháp cấu hình BIND
Chạy lệnh sau để kiểm tra cú pháp của các tập tin cấu hình named.conf*
:
sudo named-checkconf
Nếu các tập tin cấu hình của bạn không có lỗi cú pháp, bạn sẽ quay lại dấu nhắc lệnh của shell mà không thấy bất kỳ thông báo lỗi nào. Nếu có lỗi trong tập tin cấu hình, hãy xem lại thông báo lỗi và phần Cấu hình máy chủ DNS chính, sau đó chạy lại named-checkconf
.
Lệnh named-checkzone
có thể được dùng để kiểm tra tính chính xác của các tập tin vùng (zone files). Tham số đầu tiên là tên của zone, và tham số thứ hai là đường dẫn đến tập tin zone tương ứng — cả hai đều được khai báo trong named.conf.local
.
Ví dụ, để kiểm tra cấu hình forward zone nyc3.example.com
, chạy lệnh sau (đổi lại tên zone và tập tin nếu bạn dùng tên khác):
sudo named-checkzone nyc3.example.com /etc/bind/zones/db.nyc3.example.com
Để kiểm tra cấu hình reverse zone 128.10.in-addr.arpa
, chạy lệnh (thay đổi các số để phù hợp với reverse zone và tệp của bạn):
sudo named-checkzone 128.10.in-addr.arpa /etc/bind/zones/db.10.128
Khi tất cả các tập tin cấu hình và tập tin zone không có lỗi, bạn đã sẵn sàng khởi động lại dịch vụ BIND.
Khởi động lại BIND
Khởi động lại BIND bằng lệnh sau:
sudo systemctl restart bind9
Nếu bạn đã cấu hình tường lửa UFW, hãy mở quyền truy cập cho BIND bằng lệnh:
sudo ufw allow Bind9
Giờ đây, máy chủ DNS chính của bạn đã được thiết lập và sẵn sàng phản hồi các truy vấn DNS.
Chúng ta sẽ tiếp tục với phần tạo máy chủ DNS phụ.
Cấu hình máy chủ DNS phụ
Trong hầu hết các môi trường, việc thiết lập một máy chủ DNS phụ là một ý tưởng tốt để đảm bảo có thể phản hồi truy vấn nếu máy chủ chính không khả dụng. May mắn thay, việc cấu hình máy chủ phụ đơn giản hơn rất nhiều.
Trên ns2, mở tập tin named.conf.options
để chỉnh sửa:
sudo nano /etc/bind/named.conf.options
Ở đầu tệp, thêm ACL với các địa chỉ IP riêng của tất cả các máy chủ đáng tin cậy:
acl "trusted" {
10.128.10.11; # ns1
10.128.20.12; # ns2 - can be set to localhost
10.128.100.101; # host1
10.128.200.102; # host2
};
options {
. . .
Dưới dòng directory
, thêm các dòng cấu hình sau:
recursion yes;
allow-recursion { trusted; };
listen-on { 10.128.20.12; }; # ns2 private IP address
allow-transfer { none; }; # disable zone transfers by default
forwarders {
8.8.8.8;
8.8.4.4;
};
Lưu và đóng tập tin named.conf.options
. Tệp này nên giống hệt với tệp named.conf.options
trên ns1, ngoại trừ việc nó cần được cấu hình để lắng nghe (listen) trên địa chỉ IP riêng của ns2. Bây giờ, chỉnh sửa tập tin named.conf.local
:
sudo nano /etc/bind/named.conf.local
Định nghĩa các vùng slave tương ứng với các vùng master trên máy chủ DNS chính. Lưu ý:
type
làslave
file
không có đường dẫn (chỉ ghi tên tập tin)masters
là địa chỉ IP riêng của máy chủ DNS chính
Nếu bạn đã định nghĩa nhiều vùng reverse trên máy chủ chính, hãy đảm bảo thêm đầy đủ chúng tại đây:
zone "nyc3.example.com" {
type slave;
file "db.nyc3.example.com";
masters { 10.128.10.11; }; # ns1 private IP
};
zone "128.10.in-addr.arpa" {
type slave;
file "db.10.128";
masters { 10.128.10.11; }; # ns1 private IP
};
Sau đó, lưu và đóng tập tin named.conf.local
.
Chạy lệnh sau để kiểm tra tính hợp lệ của các tệp cấu hình:
sudo named-checkconf
Nếu lệnh này không trả về lỗi nào, hãy khởi động lại dịch vụ BIND:
sudo systemctl restart bind9
Sau đó, cho phép các kết nối DNS đến máy chủ bằng cách thay đổi quy tắc tường lửa UFW:
sudo ufw allow Bind9
Như vậy, bạn đã thiết lập xong các máy chủ DNS chính và phụ cho việc phân giải tên và địa chỉ IP trong mạng nội bộ. Bây giờ, bạn cần cấu hình các máy chủ client để sử dụng các máy chủ DNS nội bộ này.
Cấu hình máy khách DNS
Trước khi các máy chủ trong danh sách tin cậy (trusted ACL) có thể truy vấn đến các máy chủ DNS của bạn, bạn phải cấu hình từng máy để sử dụng ns1 và ns2 làm name server. Quá trình này thay đổi tùy theo hệ điều hành, nhưng với hầu hết các bản phân phối Linux, thường là thêm máy chủ DNS vào tập tin /etc/resolv.conf
.
Đối với Ubuntu 18.04
Trên Ubuntu 18.04, cấu hình mạng được quản lý bởi Netplan, một lớp trừu tượng cho phép viết cấu hình mạng chuẩn hóa và áp dụng nó cho các backend khác nhau. Để cấu hình DNS, ta cần tạo một tập tin cấu hình Netplan.
Trước tiên, chúng ta sẽ tìm thiết bị mạng tương ứng với mạng nội bộ bằng lệnh:
ip address show to 10.128.0.0/16
Output
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 10.128.100.101/16 brd 10.128.255.255 scope global eth1
valid_lft forever preferred_lft forever
Ở ví dụ này, giao diện mạng nội bộ là eth1.
Tiếp theo, tạo tập tin Netplan mới tại /etc/netplan/00-private-nameservers.yaml
:
sudo nano /etc/netplan/00-private-nameservers.yaml
Bên trong tập tin, hãy dán nội dung sau. Bạn sẽ cần chỉnh sửa tên giao diện của mạng nội bộ, địa chỉ của các máy chủ DNS ns1 và ns2, cũng như vùng DNS cho phù hợp với hệ thống của bạn.
Lưu ý: Netplan sử dụng định dạng YAML để lưu trữ cấu hình. Vì YAML phân biệt cấu trúc dữ liệu dựa trên khoảng trắng và thụt đầu dòng, hãy đảm bảo bạn sử dụng thụt đầu dòng một cách nhất quán để tránh lỗi.
network:
version: 2
ethernets:
eth1: # Private network interface
nameservers:
addresses:
- 10.128.10.11 # Private IP for ns1
- 10.132.20.12 # Private IP for ns2
search: [ nyc3.example.com ] # DNS zone
Lưu và đóng tệp khi bạn hoàn tất.
Tiếp theo, hãy yêu cầu Netplan thử áp dụng tệp cấu hình mới bằng cách sử dụng lệnh netplan try
. Nếu có sự cố khiến kết nối mạng bị mất, Netplan sẽ tự động hoàn tác các thay đổi sau một khoảng thời gian chờ:
sudo netplan try
Output
Warning: Stopping systemd-networkd.service, but it can still be activated by:
systemd-networkd.socket
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 120 seconds
Nếu bộ đếm thời gian ở dưới cùng đang cập nhật chính xác, điều đó có nghĩa là cấu hình mới ít nhất đủ ổn định để không làm gián đoạn kết nối SSH của bạn. Hãy nhấn ENTER để chấp nhận cấu hình mới.
Bây giờ, hãy kiểm tra trình phân giải DNS của hệ thống để xác định xem cấu hình DNS của bạn đã được áp dụng chưa:
sudo systemd-resolve --status
Cuộn xuống cho đến khi bạn thấy phần thông tin liên quan đến giao diện mạng nội bộ của bạn. Bạn sẽ thấy các địa chỉ IP riêng của máy chủ DNS được liệt kê đầu tiên, tiếp theo là một số địa chỉ dự phòng. Tên miền của bạn cũng sẽ xuất hiện trong mục DNS Domain:
Output
. . .
Link 3 (eth1)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 10.128.10.11
10.128.20.12
67.207.67.2
67.207.67.3
DNS Domain: nyc3.example.com
. . .
Máy khách của bạn hiện đã được cấu hình để sử dụng các máy chủ DNS nội bộ.
Máy khách sử dụng Ubuntu 16.04 và Debian
Trên các máy chủ Ubuntu 16.04 và Debian, bạn có thể chỉnh sửa tệp cấu hình mạng /etc/network/interfaces
:
sudo nano /etc/network/interfaces
Trong tệp này, hãy tìm dòng bắt đầu bằng dns-nameservers
và thêm địa chỉ máy chủ DNS của bạn vào đầu danh sách hiện có. Ngay bên dưới dòng đó, thêm một tùy chọn dns-search
trỏ tới tên miền gốc của hạ tầng mạng của bạn. Trong ví dụ của chúng ta, đó là nyc3.example.com
:
. . .
dns-nameservers 10.128.10.11 10.128.20.12 8.8.8.8
dns-search nyc3.example.com
. . .
Sau khi chỉnh sửa xong, lưu và đóng tệp lại.
Bây giờ, hãy khởi động lại dịch vụ mạng để áp dụng các thay đổi mới bằng lệnh sau. Đảm bảo rằng bạn thay eth0
bằng tên giao diện mạng của bạn:
sudo ifdown --force eth0 && sudo ip addr flush dev eth0 && sudo ifup --force eth0
Lệnh này sẽ khởi động lại kết nối mạng mà không làm gián đoạn phiên SSH hiện tại của bạn. Nếu mọi thứ hoạt động đúng, bạn sẽ thấy đầu ra tương tự như sau:
Output
RTNETLINK answers: No such process
Waiting for DAD... Done
Hãy kiểm tra lại xem cấu hình đã được áp dụng đúng chưa bằng cách chạy lệnh sau:
cat /etc/resolv.conf
Bạn sẽ thấy các máy chủ tên (nameserver) và tên miền tìm kiếm (search domain) được liệt kê như sau:
Output
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.128.10.11
nameserver 10.128.20.12
nameserver 8.8.8.8
search nyc3.example.com
Vậy là máy khách của bạn đã được cấu hình để sử dụng các máy chủ DNS của bạn.
Máy khách sử dụng CentOS
Trên các hệ điều hành CentOS, RedHat và Fedora Linux, hãy chỉnh sửa tệp /etc/sysconfig/network-scripts/ifcfg-eth0
. Bạn có thể cần thay thế eth0
bằng tên giao diện mạng chính của bạn:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
Tìm các dòng DNS1
và DNS2
, và thiết lập chúng thành địa chỉ IP riêng của máy chủ tên chính (primary) và phụ (secondary) của bạn. Thêm một tham số DOMAIN
, theo sau là tên miền cơ sở của hạ tầng mạng. Trong hướng dẫn này, đó là nyc3.example.com
:
. . .
DNS1=10.128.10.11
DNS2=10.128.20.12
DOMAIN='nyc3.example.com'
. . .
Sau khi hoàn tất, hãy lưu và đóng tệp.
Bây giờ, khởi động lại dịch vụ mạng bằng lệnh sau:
sudo systemctl restart network
Lệnh này có thể mất vài giây để thực hiện, nhưng sẽ trả bạn về dấu nhắc lệnh ngay sau đó.
Kiểm tra xem các thay đổi đã được áp dụng chưa bằng cách chạy:
cat /etc/resolv.conf
Bạn sẽ thấy các máy chủ tên và tên miền tìm kiếm được liệt kê như sau:
nameserver 10.128.10.11
nameserver 10.128.20.12
search nyc3.example.com
Máy khách của bạn giờ đã có thể kết nối và sử dụng các máy chủ DNS nội bộ.
Kiểm tra máy khách
Sử dụng lệnh nslookup
để kiểm tra xem các máy khách của bạn có thể truy vấn máy chủ DNS hay không. Bạn nên thực hiện điều này trên tất cả các máy khách đã được cấu hình và nằm trong ACL “trusted”.
Đối với các máy khách CentOS, bạn có thể cần cài đặt tiện ích nslookup
bằng lệnh:
sudo yum install bind-utils
Chúng ta sẽ bắt đầu với Forward Lookup.
Truy vấn tiến (Forward Lookup)
Để thực hiện truy vấn tiến nhằm lấy địa chỉ IP của host1.nyc3.example.com
, hãy chạy lệnh sau:
nslookup host1
Việc truy vấn host1
sẽ mở rộng thàn host1.nyc3.example.com
vì tuỳ chọn search
đã được đặt thành tên miền phụ riêng (nyc3.example.com
). Các truy vấn DNS sẽ thử tìm kiếm trong miền phụ này trước khi tìm kiếm ở nơi khác. Kết quả đầu ra có thể như sau:
Output
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: host1.nyc3.example.com
Address: 10.128.100.101
Tiếp theo là Reverse Lookup.
Truy vấn ngược (Reverse Lookup)
Để kiểm tra truy vấn ngược, hãy truy vấn máy chủ DNS bằng địa chỉ IP riêng của host1
:
nslookup 10.128.100.101
Bạn sẽ thấy kết quả tương tự như sau:
Output
11.10.128.10.in-addr.arpa name = host1.nyc3.example.com.
Authoritative answers can be found from:
Nếu tất cả tên miền và địa chỉ IP được phân giải đúng, điều đó có nghĩa là các tập tin vùng DNS của bạn đã được cấu hình chính xác. Nếu bạn nhận được kết quả bất thường, hãy kiểm tra lại các tập tin vùng trên máy chủ DNS chính (ví dụ: db.nyc3.example.com
và db.10.128
). Bước cuối cùng, chúng ta sẽ xem cách bảo trì các bản ghi zone.
Bảo trì các bản ghi DNS
Giờ đây bạn đã có hệ thống DNS nội bộ hoạt động, bạn cần bảo trì các bản ghi DNS để chúng phản ánh chính xác môi trường máy chủ của bạn.
Thêm máy chủ vào hệ thống DNS
Mỗi khi bạn thêm một máy chủ (host) vào hạ tầng trong cùng một trung tâm dữ liệu (datacenter), bạn cần thực hiện các bước sau để thêm nó vào hệ thống DNS:
Trên máy chủ DNS chính (Primary Name Server)
- Tập tin vùng tiến (Forward zone file): Thêm một bản ghi
A
cho máy chủ mới và tăng giá trị Serial. - Tập tin vùng ngược (Reverse zone file): Thêm bản ghi
PTR
cho máy chủ mới và tăng giá trị Serial. - Tập tin
named.conf.options
: Thêm địa chỉ IP riêng của máy chủ mới vào ACL"trusted"
.
Kiểm tra các tệp cấu hình của bạn, bằng các câu lệnh:
sudo named-checkconf
sudo named-checkzone nyc3.example.com db.nyc3.example.com
sudo named-checkzone 128.10.in-addr.arpa /etc/bind/zones/db.10.128
Sau đó, hãy tải lại BIND:
sudo systemctl reload bind9
Lúc này, máy chủ DNS chính của bạn đã được cấu hình để nhận diện máy chủ mới.
Máy chủ DNS phụ
- Thêm địa chỉ IP riêng của máy chủ mới vào ACL
"trusted"
trong tập tinnamed.conf.options
.
Kiểm tra cú pháp cấu hình:
sudo named-checkconf
Sau đó, tải lại BIND:
sudo systemctl reload bind9
Máy chủ DNS phụ của bạn bây giờ sẽ chấp nhận kết nối từ máy chủ mới.
Cấu hình máy chủ mới để sử dụng DNS
- Cấu hình tập tin
/etc/resolv.conf
để sử dụng các máy chủ DNS của bạn (ns1 và ns2). - Kiểm tra bằng cách sử dụng lệnh
nslookup
.
Xoá máy chủ khỏi hệ thống DNS
Nếu bạn xoá một máy chủ ra khỏi môi trường, hoặc chỉ muốn loại bỏ nó khỏi hệ thống DNS, hãy thực hiện thao tác ngược lại với các bước bạn đã làm khi thêm máy chủ đó vào DNS.
Kết luận
Giờ đây, bạn đã có thể tham chiếu đến các giao diện mạng nội bộ của máy chủ bằng tên thay vì địa chỉ IP. Điều này giúp việc cấu hình dịch vụ và ứng dụng trở nên dễ dàng hơn vì bạn không còn phải ghi nhớ các địa chỉ IP riêng nữa, đồng thời các tệp cấu hình cũng sẽ dễ đọc và dễ hiểu hơn.
Ngoài ra, bạn cũng có thể thay đổi cấu hình để trỏ đến máy chủ mới chỉ tại một nơi duy nhất, chính là máy chủ DNS chính, thay vì phải chỉnh sửa nhiều tệp cấu hình phân tán khác nhau. Điều này giúp đơn giản hóa việc bảo trì hệ thống.
Tuy nhiên, khi bạn đã thiết lập hệ thống DNS nội bộ và các tệp cấu hình bắt đầu sử dụng các FQDN nội bộ (tên miền đầy đủ trong mạng riêng) để chỉ định kết nối mạng, việc duy trì ổn định các máy chủ DNS là điều quan trọng vô cùng. Nếu cả hai máy chủ DNS đều ngừng hoạt động, các dịch vụ và ứng dụng phụ thuộc vào chúng sẽ ngừng hoạt động theo.
Vì vậy, bạn nên thiết lập ít nhất một máy chủ DNS phụ, đồng thời duy trì các bản sao lưu hoạt động tốt cho tất cả máy chủ DNS của mình để đảm bảo độ tin cậy và khả năng phục hồi của hệ thống.